summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-11 21:01:53 -0700
committerCliff Click <cliffc@acm.org>2025-04-11 21:01:53 -0700
commita2614064a6d86d146af07d0db50c2e76a2c37274 (patch)
tree272cf9fbe4cd72b7247c2eb44db94400f658829e /chapter21/src/main/java/com/seaofnodes
parent4e467263058c015ec0838487d1523b51fb42fcfd (diff)
downloadSimple-a2614064a6d86d146af07d0db50c2e76a2c37274.tar.gz
Simple-a2614064a6d86d146af07d0db50c2e76a2c37274.zip
Larger frame encodings
Diffstat (limited to 'chapter21/src/main/java/com/seaofnodes')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java6
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java11
2 files changed, 9 insertions, 8 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java
index 106d1255..a0747025 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java
@@ -29,14 +29,14 @@ public class FunX86 extends FunNode implements MachNode {
int sz = Math.max(_maxSlot - _maxArgSlot,0);
// If non-leaf function, pad to 16b
if( _hasCalls ) sz = ((sz+1) & -2)+1;
- assert x86_64_v2.imm8(sz*8);
_frameAdjust = (short)sz;
if( sz == 0 ) return; // Skip if no frame adjust
// opcode: 0x83, addi rsp with immediate 8
- enc.add1( x86_64_v2.REX_W ).add1( 0x83 );
+ enc.add1( x86_64_v2.REX_W ).add1( x86_64_v2.imm8(sz*8) ? 0x83 : 0x81 );
enc.add1( x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, 0b101, x86_64_v2.RSP) );
- enc.add1(sz*8);
+ if( x86_64_v2.imm8(sz*8) ) enc.add1(sz*8);
+ else enc.add4(sz*8);
}
@Override public void asm(CodeGen code, SB sb) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java
index ca9f148c..0b8f88a3 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java
@@ -18,11 +18,12 @@ public class RetX86 extends ReturnNode implements MachNode {
@Override public RegMask regmap(int i) { return x86_64_v2.retMask(_fun.sig(),i); }
@Override public RegMask outregmap() { return null; }
@Override public void encoding( Encoding enc ) {
- int frameAdjust = ((FunX86)fun())._frameAdjust;
- if( frameAdjust > 0 ) {
- enc.add1( x86_64_v2.REX_W ).add1( 0x83 );
- enc.add1( x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, 0, x86_64_v2.RSP) );
- enc.add1(frameAdjust*8);
+ int sz = ((FunX86)fun())._frameAdjust;
+ if( sz != 0 ) {
+ enc.add1( x86_64_v2.REX_W ).add1( x86_64_v2.imm8(sz*8) ? 0x83 : 0x81 );
+ enc.add1( x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, 0b000, x86_64_v2.RSP) );
+ if( x86_64_v2.imm8(sz*8) ) enc.add1(sz*8);
+ else enc.add4(sz*8);
}
enc.add1(0xC3);
}