summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/RegMask.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-02-07 08:58:36 -0800
committerCliff Click <cliffc@acm.org>2025-02-07 08:58:36 -0800
commit2aa8c5d1d0659bd1c828134f1a1f14d025a2d0f1 (patch)
tree0532f3ba5d74de006fcaa906dad9b787ebb06e2e /src/main/java/com/seaofnodes/simple/RegMask.java
parent68dc63b9390bbe4ec50cc1b814d4e559e459c057 (diff)
downloadSimple-linear-chapter19.tar.gz
Simple-linear-chapter19.zip
Ch# Chapter 19: Instruction Selection and Portable Compilationlinear-chapter19
Co-authored-by: hadha <helsgithub15@gmail.com> Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com>
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/RegMask.java')
-rw-r--r--src/main/java/com/seaofnodes/simple/RegMask.java39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/main/java/com/seaofnodes/simple/RegMask.java b/src/main/java/com/seaofnodes/simple/RegMask.java
new file mode 100644
index 00000000..20be7157
--- /dev/null
+++ b/src/main/java/com/seaofnodes/simple/RegMask.java
@@ -0,0 +1,39 @@
+package com.seaofnodes.simple;
+
+import java.util.BitSet;
+
+// A "register mask" - 1 bit set for each allowed register. In addition "stack
+// slot" registers may be allowed, effectively making the set infinite.
+public class RegMask {
+
+ public static final RegMask EMPTY = new RegMask();
+
+ final BitSet _bits;
+
+ public RegMask(long x ) { _bits = BitSet.valueOf(new long[]{x}); }
+ public RegMask(long[] xs) { _bits = BitSet.valueOf( xs); }
+ // Internal constructor
+ RegMask() { _bits = new BitSet(); }
+ RegMask(BitSet bs) { _bits = bs; }
+
+ public boolean get(int r) { return _bits.get(r); }
+
+ // Defensive writable copy
+ public RegMaskRW copy() { return new RegMaskRW( (BitSet)_bits.clone() ); }
+
+ boolean size1() { return _bits.cardinality()==1; }
+}
+
+class RegMaskRW extends RegMask {
+ public RegMaskRW() { super(); }
+ public RegMaskRW(long x) { super(new long[]{x}); }
+ public RegMaskRW(long[] xs) { super(xs); }
+ public RegMaskRW(BitSet bs) { super(bs); }
+ public void set(int r) { _bits.set(r); }
+ public void clr(int r) { _bits.clear(r); }
+ public void set(int r, boolean b) { _bits.set(r,b); }
+ public RegMaskRW and( RegMask r ) {
+ _bits.and(r._bits);
+ return this;
+ }
+}