summaryrefslogtreecommitdiff
path: root/chapter21/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-03-30 11:19:14 -0700
committerCliff Click <cliffc@acm.org>2025-03-30 11:19:14 -0700
commit79263e424709885da08a0cada2ace6cd744158d7 (patch)
tree8bb30c9ab36b547c7e8dc9a3b3a76aa2c8c8f986 /chapter21/src/main/java/com
parent8701c671c8e6d6eedc01436ea38bde01fba634f0 (diff)
downloadSimple-79263e424709885da08a0cada2ace6cd744158d7.tar.gz
Simple-79263e424709885da08a0cada2ace6cd744158d7.zip
Encode ptr loads
ptrs become 64b Fix Cmp encoding
Diffstat (limited to 'chapter21/src/main/java/com')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java11
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java2
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(); }