Remove la; turns out that the assembler gets upset if you ask it to
generate more than one fixup per instruction (I think).
This commit is contained in:
parent
ac33bdd031
commit
ba0849c87c
|
@ -3,7 +3,6 @@
|
||||||
%token <y_word> FCOND
|
%token <y_word> FCOND
|
||||||
|
|
||||||
%token <y_word> OP_LI
|
%token <y_word> OP_LI
|
||||||
%token <y_word> OP_LA
|
|
||||||
|
|
||||||
%token <y_word> HI16
|
%token <y_word> HI16
|
||||||
%token <y_word> HA16
|
%token <y_word> HA16
|
||||||
|
|
|
@ -75,7 +75,6 @@
|
||||||
0, FPR, 31, "f31",
|
0, FPR, 31, "f31",
|
||||||
|
|
||||||
0, OP_LI, 0, "li",
|
0, OP_LI, 0, "li",
|
||||||
0, OP_LA, 0, "la",
|
|
||||||
0, HI16, 0, "hi16",
|
0, HI16, 0, "hi16",
|
||||||
0, HA16, 0, "ha16",
|
0, HA16, 0, "ha16",
|
||||||
0, LO16, 0, "lo16",
|
0, LO16, 0, "lo16",
|
||||||
|
|
|
@ -14,19 +14,6 @@
|
||||||
emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
|
emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| OP_LA GPR ',' expr
|
|
||||||
{
|
|
||||||
word_t reg = $2;
|
|
||||||
word_t type = $4.typ & S_TYP;
|
|
||||||
uint32_t val = $4.val;
|
|
||||||
|
|
||||||
if (type != S_ABS)
|
|
||||||
newrelo($4.typ, RELO2HI | FIXUPFLAGS);
|
|
||||||
emit4(0x3c000000 | (reg<<16) | (val>>16)); /* lui reg, value */
|
|
||||||
if (type != S_ABS)
|
|
||||||
newrelo($4.typ, RELO2 | FIXUPFLAGS);
|
|
||||||
emit4(0x34000000 | (reg<<16) | (reg<<21) | (val & 0xffff)); /* ori reg, reg, value */
|
|
||||||
}
|
|
||||||
|
|
||||||
extabsexp
|
extabsexp
|
||||||
: absexp
|
: absexp
|
||||||
|
|
|
@ -635,11 +635,13 @@ PATTERNS
|
||||||
ALUCC(EOR.I, "xori")
|
ALUCC(EOR.I, "xori")
|
||||||
|
|
||||||
out:(int)reg = value:LABEL.I
|
out:(int)reg = value:LABEL.I
|
||||||
emit "la %out, $value"
|
emit "lui %out, hi16[$value]"
|
||||||
|
emit "ori %out, %out, lo16[$value]"
|
||||||
cost 4;
|
cost 4;
|
||||||
|
|
||||||
out:(int)reg = value:BLOCK.I
|
out:(int)reg = value:BLOCK.I
|
||||||
emit "la %out, $value"
|
emit "lui %out, hi16[$value]"
|
||||||
|
emit "ori %out, %out, lo16[$value]"
|
||||||
cost 4;
|
cost 4;
|
||||||
|
|
||||||
out:(int)reg = value:CONST.I
|
out:(int)reg = value:CONST.I
|
||||||
|
|
|
@ -556,11 +556,14 @@ long off;
|
||||||
long valu;
|
long valu;
|
||||||
int sectindex = relo->or_sect - S_MIN;
|
int sectindex = relo->or_sect - S_MIN;
|
||||||
extern struct outhead outhead;
|
extern struct outhead outhead;
|
||||||
|
uint32_t realaddress = outsect[sectindex].os_base + relo->or_addr
|
||||||
|
+ relorig[sectindex].org_size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pick up previous value at location to be relocated.
|
* Pick up previous value at location to be relocated.
|
||||||
*/
|
*/
|
||||||
valu = getvalu(emit + (relo->or_addr - off), relo->or_type);
|
valu = getvalu(emit + (relo->or_addr - off), relo->or_type);
|
||||||
|
debug("read relocation from 0x%08x type 0x%x value 0x%08x symbol %d\n", realaddress, relo->or_type, valu, relo->or_nami);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Or_nami is an index in the name table of the considered module.
|
* Or_nami is an index in the name table of the considered module.
|
||||||
|
@ -595,6 +598,7 @@ long off;
|
||||||
/*
|
/*
|
||||||
* Now put the value back.
|
* Now put the value back.
|
||||||
*/
|
*/
|
||||||
|
debug("written fixed up relocation to 0x%08x type 0x%x value 0x%08x\n", realaddress, relo->or_type, valu, 0);
|
||||||
putvalu(valu, emit + (relo->or_addr - off), relo->or_type);
|
putvalu(valu, emit + (relo->or_addr - off), relo->or_type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue