From 6a5d13d459e40d242bea43f87a4717ad4fcf9e48 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 20 Sep 2026 17:27:00 -0700 Subject: Popular use grouping for RegAlloc Fix arm BL encodings; ADD/SUB with reversed sign. --- .../src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java | 5 ++--- .../src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java | 2 +- .../src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java | 7 ++++++- 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'chapter22/src/main/java/com') diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java index 32777f03..3ee75608 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java @@ -10,13 +10,12 @@ public class FunARM extends FunNode implements MachNode { FunARM(FunNode fun) { super(fun); } @Override public void computeFrameAdjust(CodeGen code, int maxReg) { super.computeFrameAdjust(code,maxReg); - if( _hasCalls ) // If non-leaf, pad to 16b - _frameAdjust = ((_frameAdjust+8) & -16); + _frameAdjust = (_frameAdjust+15) & -16; // Keep SP aligned, including leaf spills. } @Override public void encoding( Encoding enc ) { int sz = _frameAdjust; if( sz == 0 ) return; // Skip if no frame adjust if( sz >= 1L<<12 ) throw Utils.TODO(); - enc.add4(arm.imm_inst(arm.OPI_ADD, -sz&0xFFF, arm.RSP, arm.RSP)); + enc.add4(arm.imm_inst(arm.OPI_SUB, sz, arm.RSP, arm.RSP)); } } diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java index 2136ebf5..4597666b 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java @@ -9,7 +9,7 @@ public class RetARM extends ReturnNode implements MachNode { @Override public void encoding( Encoding enc ) { int frameAdjust = ((FunARM)fun())._frameAdjust; if( frameAdjust > 0 ) - enc.add4(arm.imm_inst(arm.OPI_ADD, (frameAdjust*-8)&0xFFF, arm.RSP, arm.RSP)); + enc.add4(arm.imm_inst(arm.OPI_ADD, frameAdjust, arm.RSP, arm.RSP)); enc.add4(arm.ret(arm.OP_RET)); } } diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java index e6f64158..b619899a 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java @@ -317,6 +317,11 @@ public class arm extends Machine { short self = enc.reg(n); short reg1 = enc.reg(n2); + // ADD/SUB encode an unsigned magnitude; switch operation for a negative addend. + if( imm12<0 && (opcode==OPI_ADD || opcode==OPI_SUB) ) { + opcode ^= OPI_ADD ^ OPI_SUB; + imm12 = -imm12; + } int body = imm_inst(opcode, imm12&0xFFF, reg1, self); enc.add4(body); } @@ -427,7 +432,7 @@ public class arm extends Machine { } public static int ret(int opcode) { - return (opcode << 10); + return (opcode << 10) | (X30 << 5); } // FMOV (scalar, immediate) -- cgit v1.2.3