Skip to content

Commit 001893d

Browse files
authored
size_t was wrong, sign extension omitted (#21093)
1 parent 653658f commit 001893d

File tree

4 files changed

+12
-4
lines changed

4 files changed

+12
-4
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ void loadFromEA(ref code cs, reg_t reg, uint szw, uint szr)
115115
cs.Iop = signExtend ? INSTR.ldrsh_imm(szw == 8, reg, cs.base, 0)
116116
: INSTR.ldrh_imm (szw == 8, reg, cs.base, 0);
117117
else
118-
cs.Iop = INSTR.ldr_imm_gen(szw == 8, reg, cs.base, 0);
118+
cs.Iop = signExtend ? INSTR.ldrsw_imm(0, cs.base, reg)
119+
: INSTR.ldr_imm_gen(szw == 8, reg, cs.base, 0);
119120
}
120121
else
121122
assert(0);

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import dmd.backend.ty;
4242
import dmd.backend.evalu8 : el_toldoubled;
4343
import dmd.backend.x86.xmm;
4444
import dmd.backend.arm.cod1 : getlvalue, loadFromEA, storeToEA;
45+
import dmd.backend.arm.cod2 : tyToExtend;
4546
import dmd.backend.arm.cod3 : COND, conditionCode, gentstreg;
4647
import dmd.backend.arm.instr;
4748

@@ -883,6 +884,7 @@ void cdcmp(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
883884
/* See if we should reverse the comparison, so a JA => JC, and JBE => JNC
884885
* (This is already reflected in the jop)
885886
*/
887+
if (0)
886888
if ((jop == COND.cs || jop == COND.cc) &&
887889
(op == OPgt || op == OPle) &&
888890
(tyuns(tym) || tyuns(e2.Ety))
@@ -1599,7 +1601,7 @@ void cdshtlng(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
15991601
}
16001602
else
16011603
{
1602-
// BUG: not generating LDRSH
1604+
// TODO AArch64: not generating LDRSH
16031605
loadFromEA(cs,reg,8,2); // LDRSH Xreg,[sp,#8]
16041606
cdb.gen(&cs);
16051607
}
@@ -1628,7 +1630,7 @@ void cdshtlng(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
16281630
}
16291631
else
16301632
{
1631-
// BUG: not generating LDRSW
1633+
cs.Sextend = cast(ubyte)tyToExtend(TYint);
16321634
loadFromEA(cs,reg,8,4); // LDRSW Xreg,[sp,#8]
16331635
cdb.gen(&cs);
16341636
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,11 @@ struct INSTR
10041004
return ldst_pos(size,1,opc,imm12,Rn,Vt);
10051005
}
10061006

1007+
/* https://www.scs.stanford.edu/~zyedidia/arm64/ldrsw_imm.html
1008+
* LDRSW <Xt>, [<Xn|SP>{, #<pimm>}]
1009+
*/
1010+
static uint ldrsw_imm(uint imm12, reg_t Rn, reg_t Rt) { return ldst_pos(2,0,2,imm12,Rn,Rt); }
1011+
10071012
/* } */
10081013

10091014
/* { ************************** Data Processing -- Register **********************************/

compiler/src/dmd/target.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ extern (C++) struct Target
433433
DoubleProperties.initialize();
434434
RealProperties.initialize();
435435

436-
isLP64 = isX86_64;
436+
isLP64 = isX86_64 || isAArch64;
437437

438438
// These have default values for 32 bit code, they get
439439
// adjusted for 64 bit code.

0 commit comments

Comments
 (0)