summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-20 22:38:58 -0700
committerCliff Click <cliffc@acm.org>2026-09-20 22:38:58 -0700
commit40b33cb6f8b8dc4d8551c3b522e7c5682a44540a (patch)
treee44d0380390109e3597bc5a1b1744e715cc30b62 /chapter23/src/main/java
parent1e527b16b28f31b08cbb36b7b1bf2d689487a989 (diff)
downloadSimple-40b33cb6f8b8dc4d8551c3b522e7c5682a44540a.tar.gz
Simple-40b33cb6f8b8dc4d8551c3b522e7c5682a44540a.zip
Final reg-alloc across chapters cleanup
Diffstat (limited to 'chapter23/src/main/java')
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/codegen/IFG.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java10
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java11
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java8
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java2
5 files changed, 15 insertions, 18 deletions
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/codegen/IFG.java b/chapter23/src/main/java/com/seaofnodes/simple/codegen/IFG.java
index bc14aadd..ecff9aac 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/codegen/IFG.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/codegen/IFG.java
@@ -522,7 +522,7 @@ abstract public class IFG {
if( reg == -1 && alrg._mask.size1() )
reg = alrg._mask.firstReg();
if( reg != -1 ) {
- mask.clr(alrg._reg);
+ mask.clr(reg);
if( mask.size1() )
return mask.firstReg();
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java
index 1e5d2094..8967d654 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java
@@ -3,7 +3,6 @@ package com.seaofnodes.simple.node.cpus.arm;
import com.seaofnodes.simple.codegen.*;
import com.seaofnodes.simple.node.LoadNode;
import com.seaofnodes.simple.node.Node;
-import com.seaofnodes.simple.type.TypeFloat;
import com.seaofnodes.simple.util.SB;
// Load memory addressing on ARM
@@ -17,20 +16,15 @@ public class LoadARM extends MemOpARM {
super(ld, base, idx, off, 0);
}
@Override public String op() { return "ld"+_sz; }
- @Override public RegMask outregmap() { return arm.MEM_MASK; }
+ @Override public RegMask outregmap() { return size() >= 4 ? arm.MEM_MASK : arm.RMASK; }
private static final int[] OP_LOADS = new int[]{ arm.OP_LOAD_IMM_8, arm.OP_LOAD_IMM_16, arm.OP_LOAD_IMM_32, arm.OP_LOAD_IMM_64, };
- private int imm_op() {
- return _declaredType == TypeFloat.F32 ? arm.OPF_LOAD_IMM_32
- : _declaredType == TypeFloat.F64 ? arm.OPF_LOAD_IMM_64
- : OP_LOADS[_declaredType.log_size()];
- }
private static final int[] OP_LOAD_RS = new int[]{ arm.OP_LOAD_R_8 , arm.OP_LOAD_R_16 , arm.OP_LOAD_R_32 , arm.OP_LOAD_R_64, };
// ldr(immediate - unsigned offset) | ldr(register)
@Override public void encoding( Encoding enc ) {
- ldst_encode(enc, imm_op(), OP_LOAD_RS[_declaredType.log_size()], this, size());
+ ldst_encode(enc, OP_LOADS[Integer.numberOfTrailingZeros(size())], OP_LOAD_RS[_declaredType.log_size()], this, size());
}
@Override public void asm(CodeGen code, SB sb) {
sb.p(code.reg(this)).p(",");
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java
index e877931d..01066f47 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java
@@ -44,7 +44,7 @@ public abstract class MemOpARM extends MemOpNode implements MachNode {
if( i==1 ) return null; // memory
if( i==2 ) return arm.RMASK; // ptr/base
if( i==3 ) return arm.RMASK; // off/index
- if( i==4 ) return arm.RMASK; // value
+ if( i==4 ) return size() >= 4 ? arm.MEM_MASK : arm.RMASK; // value
return null; // Anti-dependence
}
@@ -53,6 +53,15 @@ public abstract class MemOpARM extends MemOpNode implements MachNode {
short ptr = enc.reg(ptr());
short off = enc.reg(off());
short val = enc.reg(xval);
+ // The allocated register selects integer vs SIMD/FP encoding, even for
+ // bitwise copies. ARM numbers each register bank from zero in the opcode.
+ boolean fp = val >= arm.D0;
+ assert !fp || size >= 4;
+ if( fp ) {
+ opcode_imm |= 1<<4;
+ opcode_reg |= 1<<5;
+ val -= arm.D0;
+ }
int body = off() == null
? arm.load_str_imm(opcode_imm, _off, ptr, val, size)
: arm.indr_adr(opcode_reg, off, arm.STORE_LOAD_OPTION.SXTX, 0, ptr, val);
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java
index 91385ac9..4fd8ac79 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java
@@ -3,7 +3,6 @@ package com.seaofnodes.simple.node.cpus.arm;
import com.seaofnodes.simple.codegen.*;
import com.seaofnodes.simple.node.Node;
import com.seaofnodes.simple.node.StoreNode;
-import com.seaofnodes.simple.type.TypeFloat;
import com.seaofnodes.simple.util.SB;
// Store memory addressing on ARM
@@ -24,16 +23,11 @@ public class StoreARM extends MemOpARM {
@Override public RegMask outregmap() { return null; }
private static final int[] OP_STORES = new int[]{ arm.OP_STORE_IMM_8, arm.OP_STORE_IMM_16, arm.OP_STORE_IMM_32, arm.OP_STORE_IMM_64, };
- private int imm_op() {
- return _declaredType == TypeFloat.F32 ? arm.OPF_STORE_IMM_32
- : _declaredType == TypeFloat.F64 ? arm.OPF_STORE_IMM_64
- : OP_STORES[_declaredType.log_size()];
- }
private static final int[] OP_STORE_RS = new int[]{ arm.OP_STORE_R_8, arm.OP_STORE_R_16, arm.OP_STORE_R_32, arm.OP_STORE_R_64, };
@Override public void encoding( Encoding enc ) {
- ldst_encode(enc, imm_op(), OP_STORE_RS[_declaredType.log_size()], val(), size());
+ ldst_encode(enc, OP_STORES[Integer.numberOfTrailingZeros(size())], OP_STORE_RS[_declaredType.log_size()], val(), size());
}
@Override public void asm(CodeGen code, SB sb) {
asm_address(code,sb).p(",");
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java
index 716f7cb7..db179754 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java
@@ -169,7 +169,7 @@ public class arm extends Machine {
public static int OPF_STORE_R_64 = 0b11111100001;
public static int OPF_STORE_R_32 = 0b10111100001;
- public static int OPF_STORE_IMM_32 = 0b1111110100;
+ public static int OPF_STORE_IMM_32 = 0b1011110100;
public static int OPF_STORE_IMM_64 = 0b1111110100;