Skip to content

Commit 288d54d

Browse files
authored
fix the BP to SP conversion wrong (#21626)
1 parent 3c1f435 commit 288d54d

1 file changed

Lines changed: 14 additions & 13 deletions

File tree

  • compiler/src/dmd/backend/arm

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,8 +1466,6 @@ void assignaddrc(code* c)
14661466
ubyte rm;
14671467
uint sectionOff;
14681468
ulong offset;
1469-
reg_t Rn, Rt;
1470-
uint base = cgstate.EBPtoESP;
14711469
code* csave = c;
14721470

14731471
for (; c; c = code_next(c))
@@ -1556,7 +1554,7 @@ void assignaddrc(code* c)
15561554
s = c.IEV1.Vsym;
15571555
uint sz = 8;
15581556
uint ins = c.Iop;
1559-
if (1 && c.IFL1 != FL.unde)
1557+
if (c.IFL1 != FL.unde)
15601558
{
15611559
printf("FL: %-8s ", fl_str(c.IFL1));
15621560
disassemble(ins);
@@ -1600,6 +1598,7 @@ void assignaddrc(code* c)
16001598
break;
16011599

16021600
case FL.stack: // for EE
1601+
uint base = cgstate.EBPtoESP;
16031602
//printf("Soffset = %d, EBPtoESP = %d, base = %d, pointer = %d\n",
16041603
//s.Soffset,cgstate.EBPtoESP,base,c.IEV1.Vpointer);
16051604
c.IEV1.Vpointer += s.Soffset + cgstate.EBPtoESP - base - cgstate.EEStack.offset;
@@ -1613,8 +1612,8 @@ void assignaddrc(code* c)
16131612
break;
16141613
}
16151614
assert(field(ins,29,27) == 7 && field(ins,25,24) == 1);
1616-
Rt = cast(reg_t)field(ins,4,0);
1617-
Rn = s.Sreglsw;
1615+
reg_t Rt = cast(reg_t)field(ins,4,0);
1616+
reg_t Rn = s.Sreglsw;
16181617
//assert(!c.Voffset); // fix later
16191618
c.Iop = INSTR.mov_register(sz > 4, Rn, Rt);
16201619
c.IFL1 = FL.const_;
@@ -1712,6 +1711,16 @@ void assignaddrc(code* c)
17121711
uint shift = field(ins,31,30); // 0:1 1:2 2:4 3:8 shift for imm12
17131712
uint op24 = field(ins,25,24);
17141713
uint op11 = field(ins,11,10);
1714+
1715+
reg_t Rn = cast(reg_t)field(ins,9,5);
1716+
reg_t Rt = cast(reg_t)field(ins,4,0);
1717+
if (Rn == 29 && !cgstate.hasframe || (cgstate.enforcealign && c.IFL1 != FL.para))
1718+
{ /* Convert to SP relative address instead of BP */
1719+
//offset += cgstate.EBPtoESP; // add difference in offset
1720+
Rn = 31;
1721+
ins = setField(ins,9,5,Rn); // set Rn to SP
1722+
}
1723+
17151724
if (field(ins,28,23) == 0x22) // Add/subtract (immediate) https://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#addsub_imm
17161725
{
17171726
// add Rd,Rn,Voffset
@@ -1808,14 +1817,6 @@ void assignaddrc(code* c)
18081817
assert(0);
18091818
}
18101819

1811-
Rn = cast(reg_t)field(ins,9,5);
1812-
Rt = cast(reg_t)field(ins,4,0);
1813-
if (Rn == 29 && !cgstate.hasframe || (cgstate.enforcealign && c.IFL1 != FL.para))
1814-
{ /* Convert to SP relative address instead of BP */
1815-
offset += cgstate.EBPtoESP; // add difference in offset
1816-
ins = setField(ins,9,5,31); // set Rn to SP
1817-
//assert(0); // offset is ignored
1818-
}
18191820
c.Iop = ins;
18201821

18211822
static if (0)

0 commit comments

Comments
 (0)