diff options
Diffstat (limited to 'chapter18/src/main/java/com/seaofnodes')
4 files changed, 12 insertions, 0 deletions
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/AddFNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/AddFNode.java index fd713156..3b37dc84 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/AddFNode.java +++ b/chapter18/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/chapter18/src/main/java/com/seaofnodes/simple/node/DivFNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/DivFNode.java index a3f4318d..80b7dccf 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/DivFNode.java +++ b/chapter18/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/chapter18/src/main/java/com/seaofnodes/simple/node/MulFNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/MulFNode.java index 6a57f3c5..f24270cf 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/MulFNode.java +++ b/chapter18/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/chapter18/src/main/java/com/seaofnodes/simple/node/SubFNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/SubFNode.java index 2d218a03..4dbc141e 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/SubFNode.java +++ b/chapter18/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); } |
