diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-11 21:01:53 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-11 21:01:53 -0700 |
| commit | a2614064a6d86d146af07d0db50c2e76a2c37274 (patch) | |
| tree | 272cf9fbe4cd72b7247c2eb44db94400f658829e /chapter21/src/main/java | |
| parent | 4e467263058c015ec0838487d1523b51fb42fcfd (diff) | |
| download | Simple-a2614064a6d86d146af07d0db50c2e76a2c37274.tar.gz Simple-a2614064a6d86d146af07d0db50c2e76a2c37274.zip | |
Larger frame encodings
Diffstat (limited to 'chapter21/src/main/java')
| -rw-r--r-- | chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java | 6 | ||||
| -rw-r--r-- | chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java | 11 |
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); } |
