Fixed bug in assembler: incorrect reordering.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user