From bb97129daa1504d67a8e3a76f16d6db15f7e5e7b Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 5 Apr 2025 15:55:48 -0700 Subject: Float uses unsigned compare --- .../java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java | 8 +++++--- .../com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'chapter21/src/main/java/com') diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java index b684b4c4..11a0c6e0 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java @@ -8,13 +8,15 @@ import com.seaofnodes.simple.node.*; // Use result of comparison without jump. public class SetX86 extends MachConcreteNode implements MachNode { final String _bop; // One of <,<=,== + final boolean _unsigned; // Constructor expects input is an X86 and not an Ideal node. - SetX86( Node cmp, String bop ) { + SetX86( Node cmp, String bop, boolean unsigned ) { super(cmp); _inputs.setLen(1); // Pop the cmp inputs // Replace with the matched cmp _inputs.push(cmp); _bop = bop; + _unsigned = unsigned; } @Override public String op() { return "set"+_bop; } @Override public RegMask regmap(int i) { assert i==1; return x86_64_v2.FLAGS_MASK; } @@ -29,8 +31,8 @@ public class SetX86 extends MachConcreteNode implements MachNode { enc.add1(0x0F); // opcode enc.add1(switch (_bop) { case "==" -> 0x94; // SETE - case "<" -> 0x9C; // SETL - case "<=" -> 0x96; //0X9E; // SETLE + case "<" -> _unsigned ? 0x92 : 0x9C; // SETB /SETL + case "<=" -> _unsigned ? 0x96 : 0x9E; // SETBE/SETLE default -> throw Utils.TODO(); }); enc.add1(x86_64_v2.modrm(x86_64_v2.MOD.DIRECT, 0, dst)); 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 98b14a3c..a8396f2e 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 @@ -502,17 +502,19 @@ public class x86_64_v2 extends Machine { // Because X86 flags, a normal ideal Bool is 2 X86 ops: a "cmp" and at "setz". // Ideal If reading from a setz will skip it and use the "cmp" instead. - private static boolean swap; + private static boolean swap, unsigned; private Node cmp( BoolNode bool ) { - swap = false; + swap = unsigned = false; Node cmp = _cmp(bool); - return new SetX86(cmp, swap ? IfNode.swap(bool.op()) : bool.op()); + return new SetX86(cmp, swap ? IfNode.swap(bool.op()) : bool.op(), unsigned); } private Node _cmp(BoolNode bool) { // Float variant - if( bool.isFloat() ) + if( bool.isFloat() ) { + unsigned = true; return new CmpFX86(bool); + } Node lhs = bool.in(1); Node rhs = bool.in(2); -- cgit v1.2.3