diff options
| author | Cliff Click <cliffc@acm.org> | 2025-03-30 11:19:14 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-03-30 11:19:14 -0700 |
| commit | 79263e424709885da08a0cada2ace6cd744158d7 (patch) | |
| tree | 8bb30c9ab36b547c7e8dc9a3b3a76aa2c8c8f986 /chapter21/src/main/java/com | |
| parent | 8701c671c8e6d6eedc01436ea38bde01fba634f0 (diff) | |
| download | Simple-79263e424709885da08a0cada2ace6cd744158d7.tar.gz Simple-79263e424709885da08a0cada2ace6cd744158d7.zip | |
Encode ptr loads
ptrs become 64b
Fix Cmp encoding
Diffstat (limited to 'chapter21/src/main/java/com')
3 files changed, 8 insertions, 7 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java index 16f36173..9471ccdf 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java @@ -1,12 +1,11 @@ package com.seaofnodes.simple.node.cpus.x86_64_v2; import com.seaofnodes.simple.SB; +import com.seaofnodes.simple.Utils; import com.seaofnodes.simple.codegen.*; import com.seaofnodes.simple.node.LoadNode; import com.seaofnodes.simple.node.Node; -import com.seaofnodes.simple.type.Type; -import com.seaofnodes.simple.type.TypeFloat; -import com.seaofnodes.simple.type.TypeInteger; +import com.seaofnodes.simple.type.*; public class LoadX86 extends MemOpX86 { LoadX86( LoadNode ld, Node base, Node idx, int off, int scale ) { @@ -60,12 +59,14 @@ public class LoadX86 extends MemOpX86 { // zero extend: REX.W + 0F B7 /r MOVZX r64, r/m16 enc.add1(0x0F); enc.add1(0xB7); - } else if(_declaredType == TypeInteger.U32) { + } else if(_declaredType == TypeInteger.U32 ) { // zero extend: 8B /r MOV r32, r/m32 enc.add1(0x8B); - } else if(_declaredType == TypeInteger.BOT) { + } else if(_declaredType == TypeInteger.BOT || _declaredType instanceof TypeMemPtr) { // REX.W + 8B /r MOV r64, r/m64 enc.add1(0x8B); + } else { + throw Utils.TODO(); } // includes modrm internally diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java index 25064e37..334791cc 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java @@ -12,7 +12,7 @@ public abstract class RegX86 extends MachConcreteNode { abstract int opcode(); @Override public void encoding( Encoding enc ) { // REX.W + 01 /r - short dst = enc.reg(this ); // src1 + short dst = enc.reg(in(1)); // src1 short src = enc.reg(in(2)); // src2 enc.add1(x86_64_v2.rex(dst, src, 0)); enc.add1(opcode()); // opcode diff --git a/chapter21/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java b/chapter21/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java index 7e607838..284bf581 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java @@ -77,7 +77,7 @@ public class TypeMemPtr extends TypeNil { // Is forward-reference @Override public boolean isFRef() { return _obj.isFRef(); } - @Override public int log_size() { return 2; } // (1<<2)==4-byte pointers + @Override public int log_size() { return 3; } // (1<<3)==8-byte pointers @Override int hash() { return _obj.hashCode() ^ super.hash(); } |
