From 726c50e5bdd7995366feb93f6ce543414d381b7a Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Sun, 16 Mar 2025 09:33:19 -0700 Subject: [PATCH] load sign extended bytes (#21004) * carith() function in exe1.c tests * load sign extended bytes --- compiler/src/dmd/backend/arm/cod1.d | 9 +++++++-- compiler/src/dmd/backend/arm/cod4.d | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/src/dmd/backend/arm/cod1.d b/compiler/src/dmd/backend/arm/cod1.d index 338ad941b9..761645732a 100644 --- a/compiler/src/dmd/backend/arm/cod1.d +++ b/compiler/src/dmd/backend/arm/cod1.d @@ -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); } diff --git a/compiler/src/dmd/backend/arm/cod4.d b/compiler/src/dmd/backend/arm/cod4.d index ff387847a8..92b4185ce1 100644 --- a/compiler/src/dmd/backend/arm/cod4.d +++ b/compiler/src/dmd/backend/arm/cod4.d @@ -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);