load sign extended bytes (#21004)

* carith() function in exe1.c tests

* load sign extended bytes
This commit is contained in:
Walter Bright 2025-03-16 09:33:19 -07:00 committed by GitHub
parent cf2674f689
commit 726c50e5bd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 3 deletions

View file

@ -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);
}

View file

@ -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);