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_rel = *r;
reorder_full = 1;
reorder_clobber = clobber_reg & 15;
reorder_clobber = clobber_reg & 31;
} else {
fputword (w, sfile[segm]);
fputrel (r, rfile[segm]);
@@ -1260,11 +1260,12 @@ void emit_li (opcode, relinfo)
register struct reloc *relinfo;
{
register unsigned value;
int cval, segment;
int cval, segment, reg;
if (getlex (&cval) != ',')
uerror ("comma expected");
value = getexpr (&segment);
reg = opcode >> 16;
if (segment != SABS)
uerror ("absolute value required");
if (value <= 0xffff) {
@@ -1279,10 +1280,10 @@ void emit_li (opcode, relinfo)
} else {
/* lui d, value[31:16]
* 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);
}
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
#define REORDER_WORKAROUND
//#define REORDER_WORKAROUND
STATIC
void GenInit(void)

View File

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