From 79263e424709885da08a0cada2ace6cd744158d7 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 30 Mar 2025 11:19:14 -0700 Subject: Encode ptr loads ptrs become 64b Fix Cmp encoding --- .../com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java | 11 ++++++----- .../com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java | 2 +- .../src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java | 2 +- .../src/test/java/com/seaofnodes/simple/Chapter13Test.java | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) (limited to 'chapter21') 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(); } diff --git a/chapter21/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter21/src/test/java/com/seaofnodes/simple/Chapter13Test.java index 977595cb..6bf45a22 100644 --- a/chapter21/src/test/java/com/seaofnodes/simple/Chapter13Test.java +++ b/chapter21/src/test/java/com/seaofnodes/simple/Chapter13Test.java @@ -33,7 +33,7 @@ while( arg ) { return head.next.i; """); try { code.parse().opto().typeCheck(); fail(); } - catch( Exception e ) { assertEquals("Might be null accessing 'i'",e.getMessage()); } + catch( Exception e ) { assertEquals("Might be null accessing 'next'",e.getMessage()); } } @Test -- cgit v1.2.3