Skip to content

Commit 726c50e

Browse files
authored
load sign extended bytes (dlang#21004)
* carith() function in exe1.c tests * load sign extended bytes
1 parent cf2674f commit 726c50e

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

compiler/src/dmd/backend/arm/cod1.d

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ nothrow:
5656
*/
5757
void loadFromEA(ref code cs, reg_t reg, uint szw, uint szr)
5858
{
59+
//debug printf("loadFromEA() reg: %d, szw: %d, szr: %d\n", reg, szw, szr);
5960
cs.Iop = INSTR.nop;
6061
assert(reg != NOREG);
6162
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)
8384
return;
8485
}
8586

87+
bool signExtend = (cs.Sextend & 7) == Extend.SXTB;
88+
8689
if (cs.reg != NOREG)
8790
{
8891
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)
103106
{
104107
// LDRB/LDRH/LDR reg,[cs.base, #0]
105108
if (szr == 1)
106-
cs.Iop = INSTR.ldrb_imm(szw == 8, reg, cs.base, 0);
109+
cs.Iop = signExtend ? INSTR.ldrsb_imm(szw == 8, reg, cs.base, 0)
110+
: INSTR.ldrb_imm (szw == 8, reg, cs.base, 0);
107111
else if (szr == 2)
108-
cs.Iop = INSTR.ldrh_imm(szw == 8, reg, cs.base, 0);
112+
cs.Iop = signExtend ? INSTR.ldrsh_imm(szw == 8, reg, cs.base, 0)
113+
: INSTR.ldrh_imm (szw == 8, reg, cs.base, 0);
109114
else
110115
cs.Iop = INSTR.ldr_imm_gen(szw == 8, reg, cs.base, 0);
111116
}

compiler/src/dmd/backend/arm/cod4.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,7 +1728,7 @@ void cdbyteint(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
17281728
{
17291729
code cs;
17301730
getlvalue(cdb,cs,e1,0,RM.load);
1731-
Extend extend = OPu8_16 ? Extend.UXTB : Extend.SXTB;
1731+
Extend extend = (op == OPu8_16) ? Extend.UXTB : Extend.SXTB;
17321732
cs.Sextend = cast(ubyte)((cs.Sextend & 0x100) | extend);
17331733
reg_t reg = allocreg(cdb,retregs,TYint);
17341734
loadFromEA(cs,reg,4,1);

0 commit comments

Comments
 (0)