diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-06 10:37:17 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-06 10:37:17 -0700 |
| commit | abd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e (patch) | |
| tree | 3ad7515a154c7db6d732baa9a6433fb18d9c1991 /chapter21/src/main | |
| parent | e30990ad8929084cf433894843adc04b577d6e9f (diff) | |
| parent | 8db8f75006a1daf522976ee97048aa4f06780c8e (diff) | |
| download | Simple-abd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e.tar.gz Simple-abd2fc675d0fc29d5b525cdbe5b949e1c85b1e7e.zip | |
Merge branch 'ch21' of https://github.com/SeaOfNodes/Simple into ch21
Diffstat (limited to 'chapter21/src/main')
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 |
