summaryrefslogtreecommitdiff
path: root/chapter21/src
diff options
context:
space:
mode:
Diffstat (limited to 'chapter21/src')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java8
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java10
2 files changed, 11 insertions, 7 deletions
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);