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