summaryrefslogtreecommitdiff
path: root/chapter14/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-09-06 09:32:28 -0700
committerThalia Archibald <thalia@archibald.dev>2024-09-07 10:54:48 -0700
commit0f56449bc90e77cc9a0e490413585a8823bc1bf2 (patch)
tree6857b34a611e59b8591262e65f99932d1a31d64e /chapter14/src
parent511bbfc081de83a600197450a023131655592eaf (diff)
downloadSimple-0f56449bc90e77cc9a0e490413585a8823bc1bf2.tar.gz
Simple-0f56449bc90e77cc9a0e490413585a8823bc1bf2.zip
Fix bugs
AND on floats Shift-extend idiom smartly makes sharper int types.
Diffstat (limited to 'chapter14/src')
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java5
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java9
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java5
-rw-r--r--chapter14/src/test/java/com/seaofnodes/simple/Chapter07Test.java1
-rw-r--r--chapter14/src/test/java/com/seaofnodes/simple/Chapter14Test.java25
5 files changed, 44 insertions, 1 deletions
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 91bb13db..06e02d9a 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -57,4 +57,9 @@ public class AndNode extends Node {
return null;
}
@Override Node copy(Node lhs, Node rhs) { return new AndNode(lhs,rhs); }
+ @Override String err() {
+ if( !(in(1)._type instanceof TypeInteger) ) return "Cannot '&' " + in(1)._type;
+ if( !(in(2)._type instanceof TypeInteger) ) return "Cannot '&' " + in(2)._type;
+ return null;
+ }
}
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
index f84b5789..2c877bf3 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -25,6 +25,10 @@ public class SarNode extends Node {
in(2)._type instanceof TypeInteger i1) {
if( i0.isConstant() && i1.isConstant() )
return TypeInteger.constant(i0.value()>>i1.value());
+ if( i1.isConstant() ) {
+ int log = (int)i1.value();
+ return TypeInteger.make(-1L<<(63-log),(1L<<(63-log))-1);
+ }
}
return TypeInteger.BOT;
}
@@ -49,4 +53,9 @@ public class SarNode extends Node {
return null;
}
@Override Node copy(Node lhs, Node rhs) { return new SarNode(lhs,rhs); }
+ @Override String err() {
+ if( !(in(1)._type instanceof TypeInteger) ) return "Cannot '&' " + in(1)._type;
+ if( !(in(2)._type instanceof TypeInteger) ) return "Cannot '&' " + in(2)._type;
+ return null;
+ }
}
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 5c7f43be..ad016158 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -49,4 +49,9 @@ public class ShlNode extends Node {
return null;
}
@Override Node copy(Node lhs, Node rhs) { return new ShlNode(lhs,rhs); }
+ @Override String err() {
+ if( !(in(1)._type instanceof TypeInteger) ) return "Cannot '&' " + in(1)._type;
+ if( !(in(2)._type instanceof TypeInteger) ) return "Cannot '&' " + in(2)._type;
+ return null;
+ }
}
diff --git a/chapter14/src/test/java/com/seaofnodes/simple/Chapter07Test.java b/chapter14/src/test/java/com/seaofnodes/simple/Chapter07Test.java
index f9251be7..faa81347 100644
--- a/chapter14/src/test/java/com/seaofnodes/simple/Chapter07Test.java
+++ b/chapter14/src/test/java/com/seaofnodes/simple/Chapter07Test.java
@@ -1,7 +1,6 @@
package com.seaofnodes.simple;
import com.seaofnodes.simple.node.*;
-import com.seaofnodes.simple.type.TypeInteger;
import org.junit.Test;
import static org.junit.Assert.*;
diff --git a/chapter14/src/test/java/com/seaofnodes/simple/Chapter14Test.java b/chapter14/src/test/java/com/seaofnodes/simple/Chapter14Test.java
index 8b3c3c9a..962b8e4d 100644
--- a/chapter14/src/test/java/com/seaofnodes/simple/Chapter14Test.java
+++ b/chapter14/src/test/java/com/seaofnodes/simple/Chapter14Test.java
@@ -116,6 +116,19 @@ return b; // Sign extend
}
@Test
+ public void testI8() {
+ Parser parser = new Parser(
+"""
+i8 b = arg;
+b = b + 1;// Truncate
+return b;
+""");
+ StopNode stop = parser.parse(false).iterate(false);
+ assertEquals("return (((((arg<<56)>>56)+1)<<56)>>56);", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ }
+
+ @Test
public void testMask() {
Parser parser = new Parser(
"""
@@ -129,6 +142,18 @@ return c; //
}
@Test
+ public void testMaskFloat() {
+ Parser parser = new Parser(
+"""
+flt f = arg;
+arg = f & 0;
+return arg;
+""");
+ try { parser.parse(true).iterate(true); fail(); }
+ catch( Exception e ) { assertEquals("Cannot '&' FltBot",e.getMessage()); }
+ }
+
+ @Test
public void testTypes() {
Parser parser = new Parser(
"""