many changes: optimize generated code somewhat,

reduce relocation-table size
This commit is contained in:
ceriel 1988-10-07 16:52:44 +00:00
parent ac3bf2cc95
commit f397d35b6a
4 changed files with 117 additions and 124 deletions

View file

@ -18,8 +18,8 @@ C_loe.. ==> "move.l ($1+$2), -(sp)".
C_lil ==> "move.l ([$1,a6]), -(sp)". C_lil ==> "move.l ([$1,a6]), -(sp)".
C_lof ==> "move.l (sp)+, a0"; C_lof ==> "move.l (sp), a0";
"move.l ($1,a0), -(sp)". "move.l ($1,a0), (sp)".
C_lal ==> "pea ($1,a6)". C_lal ==> "pea ($1,a6)".
@ -44,16 +44,16 @@ C_lxa
"pea (8,a0)". "pea (8,a0)".
C_loi C_loi
$1 == 1 ==> "move.l (sp)+, a0"; $1 == 1 ==> "move.l (sp), a0";
"clr.l -(sp)"; "clr.l (sp)";
"move.b (a0), (3,sp)". "move.b (a0), (3,sp)".
$1 == 2 ==> "move.l (sp)+, a0"; $1 == 2 ==> "move.l (sp), a0";
"clr.l -(sp)"; "clr.l (sp)";
"move.w (a0), (2,sp)". "move.w (a0), (2,sp)".
$1 == 4 ==> "move.l (sp)+, a0"; $1 == 4 ==> "move.l (sp), a0";
"move.l (a0), -(sp)". "move.l (a0), (sp)".
$1 == 8 ==> "move.l (sp)+, a0"; $1 == 8 ==> "move.l (sp), a0";
"move.l (4,a0), -(sp)"; "move.l (4,a0), (sp)";
"move.l (a0), -(sp)". "move.l (a0), -(sp)".
$1 % 4 == 0 ==> "move.l (sp)+, a0"; $1 % 4 == 0 ==> "move.l (sp)+, a0";
"move.l #$1/4-1, d0"; "move.l #$1/4-1, d0";
@ -74,8 +74,8 @@ C_ldl ==> "move.l ($1+4, a6), -(sp)";
C_lde.. ==> "move.l ($1+$2+4), -(sp)"; C_lde.. ==> "move.l ($1+$2+4), -(sp)";
"move.l ($1+$2), -(sp)". "move.l ($1+$2), -(sp)".
C_ldf ==> "move.l (sp)+, a0"; C_ldf ==> "move.l (sp), a0";
"move.l ($1+4,a0), -(sp)"; "move.l ($1+4,a0), (sp)";
"move.l ($1,a0), -(sp)". "move.l ($1,a0), -(sp)".
C_lpi ==> "pea ($1)". C_lpi ==> "pea ($1)".
@ -142,22 +142,23 @@ C_sbi
C_mli C_mli
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"muls.l (sp)+, d0"; "muls.l (sp), d0";
"move.l d0, -(sp)". "move.l d0, (sp)".
default ==> arg_error( "mli", $1). default ==> arg_error( "mli", $1).
C_dvi C_dvi
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"divs.l d0, d1"; "divs.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "dvi", $1). default ==> arg_error( "dvi", $1).
C_rmi C_rmi
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"divsl.l d0, d2:d1"; "move.l d0, (sp)";
"move.l d2, -(sp)". "divsl.l (sp), d0:d1";
"move.l d0, (sp)".
default ==> arg_error( "rmi", $1). default ==> arg_error( "rmi", $1).
C_ngi C_ngi
@ -167,16 +168,16 @@ C_ngi
C_sli C_sli
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"asl.l d0, d1"; "asl.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "sli", $1). default ==> arg_error( "sli", $1).
C_sri C_sri
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"asr.l d0, d1"; "asr.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "sri", $1). default ==> arg_error( "sri", $1).
@ -193,31 +194,32 @@ C_sbu ==> C_sbi( w).
C_mlu C_mlu
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"mulu.l (sp)+, d0"; "mulu.l (sp), d0";
"move.l d0, -(sp)". "move.l d0, (sp)".
default ==> arg_error( "mlu", $1). default ==> arg_error( "mlu", $1).
C_dvu C_dvu
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"divu.l d0, d1"; "divu.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "dvu", $1). default ==> arg_error( "dvu", $1).
C_rmu C_rmu
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"divul.l d0, d2:d1"; "move.l d0, (sp)";
"move.l d2, -(sp)". "divul.l (sp), d0:d1";
"move.l d0, (sp)".
default ==> arg_error( "rmu", $1). default ==> arg_error( "rmu", $1).
C_slu ==> C_sli( w). C_slu ==> C_sli( w).
C_sru C_sru
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"lsr.l d0, d1"; "lsr.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "sru", $1). default ==> arg_error( "sru", $1).
@ -319,25 +321,19 @@ C_zer
/* */ /* */
/******************************************************************************/ /******************************************************************************/
C_cii ==> " move.l (sp), d0"; /* cii, ciu, cuu, cui are assumed to be called with legal arguments only */
" move.l (4, sp), d1";
C_cii ==> " move.l (sp)+, d0";
" move.l (sp)+, d1";
" cmp.l d1, d0"; " cmp.l d1, d0";
" ble 4f"; " ble 4f";
" cmp.l #4, d1"; " move.l (sp), d0";
" bge 4f";
" move.l (8, sp), d2";
" cmp.l #1, d1"; " cmp.l #1, d1";
" bne 2f"; " bne 2f";
" cmp.l #2, d0"; " ext.w d0";
" bne 1f"; "2: ext.l d0";
" ext.w d2"; " move.l d0,(sp)";
" bra 3f"; "4:".
"1: extl.l d2";
" bra 3f";
"2: ext.l d2";
"3: move.l d2, (8, sp)";
" move.l #4, (4, sp)";
"4: jsr (.cii)".
C_cuu ==> "lea (8,sp),sp". C_cuu ==> "lea (8,sp),sp".
@ -403,16 +399,16 @@ C_com
C_rol C_rol
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"rol.l d0, d1"; "rol.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "rol", $1). default ==> arg_error( "rol", $1).
C_ror C_ror
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"ror.l d0, d1"; "ror.l d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> arg_error( "ror", $1). default ==> arg_error( "ror", $1).
@ -424,11 +420,11 @@ C_ror
C_inn C_inn
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp)+, d0";
"move.l (sp)+, d1"; "move.l (sp), d1";
"btst d0, d1"; "btst d0, d1";
"sne d1"; "sne d1";
"and.l #1, d1"; "and.l #1, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> "move.l (sp)+, d0"; default ==> "move.l (sp)+, d0";
"move.l #$1, d1"; "move.l #$1, d1";
"jsr (.inn)"; "jsr (.inn)";
@ -440,10 +436,10 @@ C_inn_narg ==> "move.l (sp)+, d1";
"move.l d0, -(sp)". "move.l d0, -(sp)".
C_set C_set
$1 == 4 ==> "move.l (sp)+, d0"; $1 == 4 ==> "move.l (sp), d0";
"clr.l d1"; "clr.l d1";
"bset d0, d1"; "bset d0, d1";
"move.l d1, -(sp)". "move.l d1, (sp)".
default ==> "move.l (sp)+, d0"; default ==> "move.l (sp)+, d0";
"move.l #$1, d1"; "move.l #$1, d1";
"jsr (.set)". "jsr (.set)".
@ -526,43 +522,43 @@ C_cms_narg ==> "move.l (sp)+, d0";
C_cmp ==> C_cmu( (arith)4). C_cmp ==> C_cmu( (arith)4).
C_tlt ==> "move.l (sp)+, d0"; C_tlt ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"blt 1f"; "blt 1f";
"clr.l (sp)"; "clr.l (sp)";
"1:". "1:".
C_tle ==> "move.l (sp)+, d0"; C_tle ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"ble 1f"; "ble 1f";
"clr.l (sp)"; "clr.l (sp)";
"1:". "1:".
C_teq ==> "move.l (sp)+, d0"; C_teq ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"beq 1f"; "beq 1f";
"clr.l (sp)"; "clr.l (sp)";
"1:". "1:".
C_tne ==> "move.l (sp)+, d0"; C_tne ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"bne 1f"; "bne 1f";
"clr.l (sp)"; "clr.l (sp)";
"1:". "1:".
C_tge ==> "move.l (sp)+, d0"; C_tge ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"bge 1f"; "bge 1f";
"clr.l (sp)"; "clr.l (sp)";
"1:". "1:".
C_tgt ==> "move.l (sp)+, d0"; C_tgt ==> "move.l (sp), d0";
"move.l #1, -(sp)"; "move.l #1, (sp)";
"tst.l d0"; "tst.l d0";
"bgt 1f"; "bgt 1f";
"clr.l (sp)"; "clr.l (sp)";
@ -800,6 +796,6 @@ C_trp ==> "jsr (.trp)".
prolog ==> . prolog ==> .
jump ==> "jmp $1". jump ==> "bra $1".
locals ==> "link a6, #-$1". locals ==> "link a6, #-$1".

View file

@ -36,6 +36,7 @@
#define RELOC2_FMT ".data2 %s + %ld\n" #define RELOC2_FMT ".data2 %s + %ld\n"
#define RELOC4_FMT ".data4 %s + %ld\n" #define RELOC4_FMT ".data4 %s + %ld\n"
#define GENLAB 'I' /* compiler-generated labels start with ... */

View file

@ -39,18 +39,21 @@ output()
Malloc((unsigned)nrelo*sizeof(struct relocation_info)); Malloc((unsigned)nrelo*sizeof(struct relocation_info));
for (i = 0; i < nrelo; i++) { for (i = 0; i < nrelo; i++) {
if ( ( reloc_info[i].or_sect-S_MIN) == SEGTXT) { if ( ( reloc_info[i].or_sect-S_MIN) == SEGTXT &&
convert_reloc( &reloc_info[i], u_reloc++); convert_reloc( &reloc_info[i], u_reloc)) {
trsize++; trsize++;
u_reloc++;
} }
} }
for (i = 0; i < nrelo; i++) { for (i = 0; i < nrelo; i++) {
if ( ( reloc_info[i].or_sect-S_MIN) != SEGTXT) { if ( ( reloc_info[i].or_sect-S_MIN) != SEGTXT &&
convert_reloc( &reloc_info[i], u_reloc++); convert_reloc( &reloc_info[i], u_reloc)) {
u_reloc++;
drsize++; drsize++;
} }
} }
nrelo = trsize + drsize;
u_reloc -= nrelo; u_reloc -= nrelo;
init_unixheader(); init_unixheader();
@ -104,6 +107,8 @@ convert_reloc( a_relo, u_relo)
struct outrelo *a_relo; struct outrelo *a_relo;
struct relocation_info *u_relo; struct relocation_info *u_relo;
{ {
int retval = 1;
u_relo->r_address = a_relo->or_addr; u_relo->r_address = a_relo->or_addr;
u_relo->r_symbolnum = a_relo->or_nami; u_relo->r_symbolnum = a_relo->or_nami;
u_relo->r_pcrel = (a_relo->or_type & RELPC) >> 3; u_relo->r_pcrel = (a_relo->or_type & RELPC) >> 3;
@ -116,6 +121,9 @@ struct relocation_info *u_relo;
if ( u_relo->r_extern == 0) { if ( u_relo->r_extern == 0) {
switch ( (symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN) { switch ( (symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN) {
case SEGTXT : u_relo->r_symbolnum = N_TEXT; case SEGTXT : u_relo->r_symbolnum = N_TEXT;
if (u_relo->r_pcrel &&
(a_relo->or_sect-S_MIN == SEGTXT))
retval = 0;
break; break;
case SEGCON : u_relo->r_symbolnum = N_DATA; case SEGCON : u_relo->r_symbolnum = N_DATA;
break; break;
@ -126,6 +134,7 @@ struct relocation_info *u_relo;
(symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN); (symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN);
} }
} }
return retval;
} }
@ -176,8 +185,7 @@ long valu;
{ {
int sect; int sect;
*u_type = '\0'; *u_type = ((*a_type&S_TYP) == S_UND || (*a_type & S_EXT)) ? N_EXT : 0;
*u_type |= ( *a_type & S_EXT) ? N_EXT : N_UNDF;
if ( valu != -1 && (! (*a_type & S_COM))) { if ( valu != -1 && (! (*a_type & S_COM))) {
sect = ( *a_type & S_TYP ) - S_MIN; sect = ( *a_type & S_TYP ) - S_MIN;

View file

@ -5,63 +5,51 @@
long get4(); long get4();
extern long base_address(); extern long base_address();
/*
extern short get2(); extern short get2();
extern char get1(); extern char get1();
*/
static do_relo();
do_local_relocation() do_local_relocation()
{ {
register struct outrelo *ptr; register struct outrelo *rp;
register int s;
/* print( "n relocation records %d\n", relo - reloc_info); */ /* print( "n relocation records %d\n", relo - reloc_info); */
for ( ptr = reloc_info; ptr < relo; ptr++) { for ( rp = reloc_info; rp < relo; rp++) {
s = ptr->or_nami; register struct outname *np = &symbol_table[rp->or_nami];
if ( symbol_table[ s].on_valu != -1 &&
! (symbol_table[s].on_type & S_COM)) if ( np->on_valu != -1 && ! (np->on_type & S_COM)) {
do_relo(&symbol_table[ s], ptr); register long oldval,newval;
register char *sect;
switch( rp->or_sect - S_MIN) {
case SEGTXT:
sect = text_area;
break;
case SEGCON:
sect = data_area;
break;
default:
fprint( STDERR,
"do_local_relo(): bad section %d\n",
rp->or_sect - S_MIN);
break;
}
oldval = get4( sect, rp->or_addr);
newval = oldval + np->on_valu +
base_address( (np->on_type & S_TYP) -S_MIN);
if ( rp->or_type & RELO4)
put4( sect, rp->or_addr, newval);
/*
else if ( rp->or_type & RELO2)
put2( sect, rp->or_addr, (int) newval);
else if ( rp->or_type & RELO1)
put1( sect, rp->or_addr, (char) newval);
*/
else
print( STDERR,
"do_relo() : bad relocation size\n");
}
} }
} }
static
do_relo(np,rp)
struct outname *np;
struct outrelo *rp;
{
long oldval,newval;
char *sect;
switch( rp->or_sect - S_MIN) {
case SEGTXT:
sect = text_area;
break;
case SEGCON:
sect = data_area;
break;
default:
fprint( STDERR,
"do_local_relo(): bad section %d\n",
rp->or_sect - S_MIN);
break;
}
oldval = get4( sect, rp->or_addr);
newval = oldval + np->on_valu +
base_address( (np->on_type & S_TYP) -S_MIN);
if ( rp->or_type & RELO4)
put4( sect, rp->or_addr, newval);
/*
else if ( rp->or_type & RELO2)
put2( sect, rp->or_addr, (int) newval);
else if ( rp->or_type & RELO1)
put1( sect, rp->or_addr, (char) newval);
*/
else
print( STDERR, "do_relo() : bad relocation size\n");
/* print( "reloc %s adrr=%ld sect=%ld oldval=%ld newval=%ld def = %ld\n",
np->on_foff + string_area, rp->or_addr, rp->or_sect-S_MIN, oldval, newval,
np->on_valu);
*/
}