summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-28 15:05:08 -0700
committerCliff Click <cliffc@acm.org>2026-10-28 15:05:08 -0700
commit50924bbe7cfeecfe7aec1885dae9bbda0013ac1b (patch)
tree2d04316faa3c73e2a2586de8f95f9b9fb248425f /chapter23/src/main/java
parent86ce5bc5d5018dcb62054d214b23f7a59b9c0d7d (diff)
downloadSimple-50924bbe7cfeecfe7aec1885dae9bbda0013ac1b.tar.gz
Simple-50924bbe7cfeecfe7aec1885dae9bbda0013ac1b.zip
Remove _phase checks from Arith & Compute
Fix some monotonicty bugs, rounding bugs, in float ops
Diffstat (limited to 'chapter23/src/main/java')
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/AddFNode.java3
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/DivFNode.java3
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/MulFNode.java3
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/SubFNode.java3
4 files changed, 12 insertions, 0 deletions
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/AddFNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/AddFNode.java
index fd713156..3b37dc84 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/AddFNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/AddFNode.java
@@ -14,10 +14,13 @@ public class AddFNode extends Node {
@Override
public Type compute() {
+ if( in(1)._type.isHigh() || in(2)._type.isHigh() ) return Type.TOP;
if (in(1)._type instanceof TypeFloat i0 &&
in(2)._type instanceof TypeFloat i1) {
if (i0.isConstant() && i1.isConstant())
return TypeFloat.constant(i0.value()+i1.value());
+ // Two f32 inputs can still produce a result needing f64 precision.
+ return TypeFloat.F64;
}
return in(1)._type.meet(in(2)._type);
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/DivFNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/DivFNode.java
index 149499f9..a0d95e06 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/DivFNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/DivFNode.java
@@ -14,10 +14,13 @@ public class DivFNode extends Node {
@Override
public Type compute() {
+ if( in(1)._type.isHigh() || in(2)._type.isHigh() ) return Type.TOP;
if (in(1)._type instanceof TypeFloat i0 &&
in(2)._type instanceof TypeFloat i1) {
if (i0.isConstant() && i1.isConstant())
return TypeFloat.constant(i0.value()/i1.value());
+ // Two f32 inputs can still produce a result needing f64 precision.
+ return TypeFloat.F64;
}
return in(1)._type.meet(in(2)._type);
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/MulFNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/MulFNode.java
index 6a57f3c5..f24270cf 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/MulFNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/MulFNode.java
@@ -14,10 +14,13 @@ public class MulFNode extends Node {
@Override
public Type compute() {
+ if( in(1)._type.isHigh() || in(2)._type.isHigh() ) return Type.TOP;
if (in(1)._type instanceof TypeFloat i0 &&
in(2)._type instanceof TypeFloat i1) {
if (i0.isConstant() && i1.isConstant())
return TypeFloat.constant(i0.value()*i1.value());
+ // Two f32 inputs can still produce a result needing f64 precision.
+ return TypeFloat.F64;
}
return in(1)._type.meet(in(2)._type);
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/SubFNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/SubFNode.java
index 2d218a03..4dbc141e 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/SubFNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/SubFNode.java
@@ -14,10 +14,13 @@ public class SubFNode extends Node {
@Override
public Type compute() {
+ if( in(1)._type.isHigh() || in(2)._type.isHigh() ) return Type.TOP;
if (in(1)._type instanceof TypeFloat i0 &&
in(2)._type instanceof TypeFloat i1) {
if (i0.isConstant() && i1.isConstant())
return TypeFloat.constant(i0.value()-i1.value());
+ // Two f32 inputs can still produce a result needing f64 precision.
+ return TypeFloat.F64;
}
return in(1)._type.meet(in(2)._type);
}