mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
load sign extended bytes (#21004)
* carith() function in exe1.c tests * load sign extended bytes
This commit is contained in:
parent
cf2674f689
commit
726c50e5bd
2 changed files with 8 additions and 3 deletions
|
@ -56,6 +56,7 @@ nothrow:
|
|||
*/
|
||||
void loadFromEA(ref code cs, reg_t reg, uint szw, uint szr)
|
||||
{
|
||||
//debug printf("loadFromEA() reg: %d, szw: %d, szr: %d\n", reg, szw, szr);
|
||||
cs.Iop = INSTR.nop;
|
||||
assert(reg != NOREG);
|
||||
if (mask(reg) & INSTR.FLOATREGS) // if floating point store
|
||||
|
@ -83,6 +84,8 @@ void loadFromEA(ref code cs, reg_t reg, uint szw, uint szr)
|
|||
return;
|
||||
}
|
||||
|
||||
bool signExtend = (cs.Sextend & 7) == Extend.SXTB;
|
||||
|
||||
if (cs.reg != NOREG)
|
||||
{
|
||||
if (cs.reg != reg) // do not mov onto itself
|
||||
|
@ -103,9 +106,11 @@ void loadFromEA(ref code cs, reg_t reg, uint szw, uint szr)
|
|||
{
|
||||
// LDRB/LDRH/LDR reg,[cs.base, #0]
|
||||
if (szr == 1)
|
||||
cs.Iop = INSTR.ldrb_imm(szw == 8, reg, cs.base, 0);
|
||||
cs.Iop = signExtend ? INSTR.ldrsb_imm(szw == 8, reg, cs.base, 0)
|
||||
: INSTR.ldrb_imm (szw == 8, reg, cs.base, 0);
|
||||
else if (szr == 2)
|
||||
cs.Iop = INSTR.ldrh_imm(szw == 8, reg, cs.base, 0);
|
||||
cs.Iop = signExtend ? INSTR.ldrsh_imm(szw == 8, reg, cs.base, 0)
|
||||
: INSTR.ldrh_imm (szw == 8, reg, cs.base, 0);
|
||||
else
|
||||
cs.Iop = INSTR.ldr_imm_gen(szw == 8, reg, cs.base, 0);
|
||||
}
|
||||
|
|
|
@ -1728,7 +1728,7 @@ void cdbyteint(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
|
|||
{
|
||||
code cs;
|
||||
getlvalue(cdb,cs,e1,0,RM.load);
|
||||
Extend extend = OPu8_16 ? Extend.UXTB : Extend.SXTB;
|
||||
Extend extend = (op == OPu8_16) ? Extend.UXTB : Extend.SXTB;
|
||||
cs.Sextend = cast(ubyte)((cs.Sextend & 0x100) | extend);
|
||||
reg_t reg = allocreg(cdb,retregs,TYint);
|
||||
loadFromEA(cs,reg,4,1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue