diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-05 15:55:48 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-05 15:55:48 -0700 |
| commit | bb97129daa1504d67a8e3a76f16d6db15f7e5e7b (patch) | |
| tree | 882641467656a61530d474631bc55f7c94eda721 /chapter21 | |
| parent | 532b34d34fde93b2841f4c9544c673a0d89434ea (diff) | |
| download | Simple-bb97129daa1504d67a8e3a76f16d6db15f7e5e7b.tar.gz Simple-bb97129daa1504d67a8e3a76f16d6db15f7e5e7b.zip | |
Float uses unsigned compare
Diffstat (limited to 'chapter21')
| -rw-r--r-- | chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java | 8 | ||||
| -rw-r--r-- | chapter21/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java | 10 |
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); |
