summaryrefslogtreecommitdiff
path: root/chapter22/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter22/src/main/java')
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/StoreNode.java12
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java6
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java6
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java2
7 files changed, 29 insertions, 5 deletions
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
index 25e3054c..d551a72a 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java
@@ -115,7 +115,7 @@ public class Parser {
put("i32" ,TypeInteger.I32);
put("i64" ,TypeInteger.BOT);
put("i8" ,TypeInteger.I8 );
- put("int" ,TypeInteger.BOT);
+ put("int" ,TypeInteger.I32);
put("u1" ,TypeInteger.U1 );
put("u16" ,TypeInteger.U16);
put("u32" ,TypeInteger.U32);
@@ -135,7 +135,7 @@ public class Parser {
_scope.define(ScopeNode.CTRL, Type.CONTROL , false, null, _lexer);
_scope.define(ScopeNode.MEM0, TypeMem.BOT , false, null, _lexer);
- _scope.define(ScopeNode.ARG0, TypeInteger.BOT, false, null, _lexer);
+ _scope.define(ScopeNode.ARG0, TypeInteger.I32, false, null, _lexer);
ctrl(XCTRL);
_scope.mem(new MemMergeNode(false));
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index b9f99f4e..6e92c67a 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -84,6 +84,18 @@ public class StoreNode extends MemOpNode {
}
}
+ if( val() instanceof SarNode shr &&
+ shr.in(1) instanceof ShlNode shl &&
+ shr.in(2)._type.isConstant() &&
+ shl.in(2)._type.isConstant() ) {
+
+ ConstantNode shr_s = (ConstantNode)(shr.in(2));
+ ConstantNode shl_s = (ConstantNode)(shl.in(2));
+
+ if( shl_s._type == shr_s._type )
+ return setDef(3, shl.in(1));
+ }
+
return null;
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java
index 9303e566..d77a4ff9 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java
@@ -40,6 +40,12 @@ abstract public class ImmRISC extends MachConcreteNode implements MachNode {
@Override public void encoding( Encoding enc ) {
short dst = enc.reg(this );
short src = enc.reg(in(1));
+ // special case for SRAI
+ if(this instanceof SraIRISC) {
+ int body = riscv.sra_i_type(opcode(), dst, func3(), src, _imm12 & 0xFFF);
+ enc.add4(body);
+ return;
+ }
int body = riscv.i_type(opcode(), dst, func3(), src, _imm12 & 0xFFF);
enc.add4(body);
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java
index b8eb7644..7f9b582a 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java
@@ -52,7 +52,7 @@ public abstract class MemOpRISC extends MemOpNode implements MachNode {
// float
if(_declaredType == TypeFloat.F32) func3 = 2; // fLW fSW
if(_declaredType == TypeFloat.F64) func3 = 3; // fLD fSD
- if( _declaredType instanceof TypeMemPtr ) func3=3; // 8 byte pointers
+ if( _declaredType instanceof TypeMemPtr) func3 = 6; // 4 byte pointers(pick lw/u)
if( func3 == -1 ) throw Utils.TODO();
return func3;
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java
index d34d94fc..cef56f6a 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java
@@ -19,7 +19,7 @@ import com.seaofnodes.simple.node.*;
// sw rs2,offset(rs1)
public class StoreRISC extends MemOpRISC {
- StoreRISC( StoreNode st, Node base, int off, Node val ) { super(st, base, off, val); }
+ StoreRISC( StoreNode st, Node base, int off, Node val ) { super(st, base, off, val);}
@Override public String op() { return "st"+_sz; }
@Override public RegMask regmap(int i) {
// 0 - ctrl
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
index 47d1db75..9db6bd5a 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java
@@ -188,6 +188,12 @@ public class riscv extends Machine {
return (imm12 << 20) | (rs1 << 15) | (func3 << 12) | (rd << 7) | opcode;
}
+ public static int sra_i_type(int opcode, int rd, int func3, int rs1, int imm12) {
+ assert 0 <= rd && rd < 32;
+ assert 0 <= rs1 && rs1 < 32;
+ assert opcode >= 0 && func3 >=0 && imm12 >= 0; // Zero-extend by caller
+ return (((0x20 << 5) | imm12) << 20) | (rs1 << 15) | (func3 << 12) | (rd << 7) | opcode;
+ }
// S-type instructions(store)
public static int s_type(int opcode, int func3, int rs1, int rs2, int imm12) {
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java b/chapter22/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
index 78605e81..8c038f8e 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
@@ -82,7 +82,7 @@ public class TypeMemPtr extends TypeNil {
// Is forward-reference
@Override public boolean isFRef() { return _obj.isFRef(); }
- @Override public int log_size() { return 3; } // (1<<3)==8-byte pointers
+ @Override public int log_size() { return 2; } // (1<<3)==4-byte pointers
@Override int hash() { return _obj.hashCode() ^ super.hash() ^ (_one ? 2048 : 0); }