Fixed bug in assembler: incorrect reordering.

This commit is contained in:
Serge Vakulenko
2015-06-25 22:11:54 -07:00
parent 219e2c3071
commit 4c343f1525
3 changed files with 7 additions and 6 deletions

View File

@@ -1244,7 +1244,7 @@ void emitword (w, r, clobber_reg)
reorder_word = w; reorder_word = w;
reorder_rel = *r; reorder_rel = *r;
reorder_full = 1; reorder_full = 1;
reorder_clobber = clobber_reg & 15; reorder_clobber = clobber_reg & 31;
} else { } else {
fputword (w, sfile[segm]); fputword (w, sfile[segm]);
fputrel (r, rfile[segm]); fputrel (r, rfile[segm]);
@@ -1260,11 +1260,12 @@ void emit_li (opcode, relinfo)
register struct reloc *relinfo; register struct reloc *relinfo;
{ {
register unsigned value; register unsigned value;
int cval, segment; int cval, segment, reg;
if (getlex (&cval) != ',') if (getlex (&cval) != ',')
uerror ("comma expected"); uerror ("comma expected");
value = getexpr (&segment); value = getexpr (&segment);
reg = opcode >> 16;
if (segment != SABS) if (segment != SABS)
uerror ("absolute value required"); uerror ("absolute value required");
if (value <= 0xffff) { if (value <= 0xffff) {
@@ -1279,10 +1280,10 @@ void emit_li (opcode, relinfo)
} else { } else {
/* lui d, value[31:16] /* lui d, value[31:16]
* ori d, d, value[15:0]) */ * ori d, d, value[15:0]) */
emitword (opcode | 0x3c000000 | (value >> 16), &relabs, value >> 16); emitword (opcode | 0x3c000000 | (value >> 16), &relabs, reg);
opcode |= 0x34000000 | (opcode & 0x1f0000) << 5 | (value & 0xffff); opcode |= 0x34000000 | (opcode & 0x1f0000) << 5 | (value & 0xffff);
} }
emitword (opcode, relinfo, value >> 16); emitword (opcode, relinfo, reg);
} }
/* /*

View File

@@ -38,7 +38,7 @@ either expressed or implied, of the FreeBSD Project.
/*****************************************************************************/ /*****************************************************************************/
// Works around bugs in RetroBSD's as instruction reordering // Works around bugs in RetroBSD's as instruction reordering
#define REORDER_WORKAROUND //#define REORDER_WORKAROUND
STATIC STATIC
void GenInit(void) void GenInit(void)

View File

@@ -314,7 +314,7 @@ icode:
etcinit: etcinit:
.ascii "/sbin/init\0" .ascii "/sbin/init\0"
initflags: initflags:
.ascii "-\0" # ASCII initflags .ascii "-\0" # ASCII initflags
argv: argv:
.word etcinit + 6 - icode + UBASE # address of "init\0" .word etcinit + 6 - icode + UBASE # address of "init\0"
.word initflags - icode + UBASE # init options .word initflags - icode + UBASE # init options