summaryrefslogtreecommitdiff
path: root/chapter21/src/main
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-06 10:37:17 -0700
committerCliff Click <cliffc@acm.org>2025-04-06 10:37:17 -0700
commitabd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e (patch)
tree3ad7515a154c7db6d732baa9a6433fb18d9c1991 /chapter21/src/main
parente30990ad8929084cf433894843adc04b577d6e9f (diff)
parent8db8f75006a1daf522976ee97048aa4f06780c8e (diff)
downloadSimple-abd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e.tar.gz
Simple-abd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e.zip
Merge branch 'ch21' of https://github.com/SeaOfNodes/Simple into ch21
Diffstat (limited to 'chapter21/src/main')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java10
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java4
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java4
3 files changed, 10 insertions, 8 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 c857c0b1..63bd8fb4 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
@@ -27,15 +27,17 @@ public class LoadX86 extends MemOpX86 {
}
static void enc( Encoding enc, Type decl, short dst, short ptr, short idx, int off, int scale ) {
- if( decl != TypeInteger.U32 && decl != TypeFloat.F32 && decl != TypeFloat.F64 )
- enc.add1(x86_64_v2.rex(dst, ptr, idx));
+ if( decl == TypeFloat.F32) enc.add1(0xF3);
+ if( decl == TypeFloat.F64) enc.add1(0xF2);
if( decl.isa(TypeFloat.F64) )
dst -= (short)x86_64_v2.XMM_OFFSET;
+ x86_64_v2.rexF(dst, ptr, idx, decl != TypeInteger.U32 && decl != TypeFloat.F32 && decl != TypeFloat.F64, enc);
+
if( false ) ;
- else if( decl == TypeFloat.F32 ) enc.add1(0xF3).add1(0x0F).add1(0x10); // F3 0F 10 /r MOVSS xmm1, m32
- else if( decl == TypeFloat.F64 ) enc.add1(0xF2).add1(0x0F).add1(0x10); // F2 0F 10 /r MOVSD xmm1, m64
+ else if( decl == TypeFloat.F32 ) enc.add1(0x0F).add1(0x10); // F3 0F 10 /r MOVSS xmm1, m32
+ else if( decl == TypeFloat.F64 ) enc.add1(0x0F).add1(0x10); // F2 0F 10 /r MOVSD xmm1, m64
else if( decl == TypeInteger.I8 ) enc.add1(0x0F).add1(0xBE); // sign extend: REX.W + 0F BE /r MOVSX r64, r/m8
else if( decl == TypeInteger.I16) enc.add1(0x0F).add1(0xBF); // sign extend: REX.W + 0F BF /r MOVSX r64, r/m16
else if( decl == TypeInteger.I32) enc.add1(0x63); // sign extend: REX.W + 63 /r MOVSXD r64, r/m32
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java
index 073d1d9b..cb2e58f9 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java
@@ -26,7 +26,7 @@ public class SplitX86 extends SplitNode {
// push rcx
// popf (Pop the top of the stack into the FLAGS register)
// 50+rd PUSH r64
- if( src >= 8 ) x86_64_v2.rex(0,src,0,true);
+ if( src >= 8 ) enc.add1(x86_64_v2.rexF(0,src,0,true, enc));
enc.add1(0x50 + src);
// popf
enc.add1(0x9D);
@@ -37,7 +37,7 @@ public class SplitX86 extends SplitNode {
// pushf; pop reg
enc.add1(0x9C);
// 58+ rd POP r64
- if( dst >= 8 ) x86_64_v2.rex(0,dst,0,true);
+ if( dst >= 8 ) enc.add1(x86_64_v2.rexF(0,dst,0,true, enc));
enc.add1(0x58 + dst);
return;
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
index a8396f2e..d9bca291 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java
@@ -519,10 +519,10 @@ public class x86_64_v2 extends Machine {
Node rhs = bool.in(2);
// Vs memory
- if( lhs instanceof LoadNode ld && ld.nOuts() == 1 )
+ if( lhs instanceof LoadNode ld && ld.nOuts() == 1 && ld._declaredType.log_size() >= 3 )
return new CmpMemX86(bool, address(ld), ld.ptr(), idx, off, scale, imm(rhs), val, false);
- if( rhs instanceof LoadNode ld && ld.nOuts() == 1 )
+ if( rhs instanceof LoadNode ld && ld.nOuts() == 1 && ld._declaredType.log_size() >= 3 )
return new CmpMemX86(bool, address(ld), ld.ptr(), idx, off, scale, imm(lhs), val, true );
// Vs immediate