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)
|
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;
|
cs.Iop = INSTR.nop;
|
||||||
assert(reg != NOREG);
|
assert(reg != NOREG);
|
||||||
if (mask(reg) & INSTR.FLOATREGS) // if floating point store
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool signExtend = (cs.Sextend & 7) == Extend.SXTB;
|
||||||
|
|
||||||
if (cs.reg != NOREG)
|
if (cs.reg != NOREG)
|
||||||
{
|
{
|
||||||
if (cs.reg != reg) // do not mov onto itself
|
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]
|
// LDRB/LDRH/LDR reg,[cs.base, #0]
|
||||||
if (szr == 1)
|
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)
|
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
|
else
|
||||||
cs.Iop = INSTR.ldr_imm_gen(szw == 8, reg, cs.base, 0);
|
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;
|
code cs;
|
||||||
getlvalue(cdb,cs,e1,0,RM.load);
|
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);
|
cs.Sextend = cast(ubyte)((cs.Sextend & 0x100) | extend);
|
||||||
reg_t reg = allocreg(cdb,retregs,TYint);
|
reg_t reg = allocreg(cdb,retregs,TYint);
|
||||||
loadFromEA(cs,reg,4,1);
|
loadFromEA(cs,reg,4,1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue