summaryrefslogtreecommitdiff
path: root/chapter21/src
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-04 16:32:25 -0700
committerCliff Click <cliffc@acm.org>2025-04-04 16:32:25 -0700
commit3016c9fcf8361cb1a0c494dbb7b997df33df5728 (patch)
treea7c5cf534974a366cd0c41fd7ee6337ad07cd701 /chapter21/src
parent887f3d9caf68b051c630bab6c8895778be8f044f (diff)
downloadSimple-3016c9fcf8361cb1a0c494dbb7b997df33df5728.tar.gz
Simple-3016c9fcf8361cb1a0c494dbb7b997df33df5728.zip
Support constant tuples
Diffstat (limited to 'chapter21/src')
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java68
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java42
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/type/TypeTuple.java15
3 files changed, 85 insertions, 40 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
index 845e7bb3..065a555f 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/Encoding.java
@@ -68,9 +68,17 @@ public class Encoding {
add4((int) i64 );
add4((int)(i64>>32));
}
+ public int read1(int idx) {
+ byte[] buf = _bits.buf();
+ return (buf[idx]&0xFF);
+ }
+ public int read2(int idx) {
+ byte[] buf = _bits.buf();
+ return (buf[idx]&0xFF) | (buf[idx+1]&0xFF) <<8;
+ }
public int read4(int idx) {
byte[] buf = _bits.buf();
- return buf[idx] | (buf[idx+1]&0xFF) <<8 | (buf[idx+2]&0xFF)<<16 | (buf[idx+3]&0xFF)<<24;
+ return (buf[idx]&0xFF) | (buf[idx+1]&0xFF) <<8 | (buf[idx+2]&0xFF)<<16 | (buf[idx+3]&0xFF)<<24;
}
public long read8(int idx) {
return (read4(idx) & 0xFFFFFFFFL) | read4(idx+4);
@@ -363,37 +371,45 @@ public class Encoding {
ts.add(t);
}
- // Write the 8-byte constants
- for( Node relo : _bigCons.keySet() ) {
- Type t = _bigCons.get(relo);
- if( t.log_size()==3 ) {
- long x = t instanceof TypeInteger ti
- ? ti.value()
- : Double.doubleToRawLongBits(((TypeFloat)t).value());
- // Map from relo to constant start
- //if( elf ) _cbits.write8(x);
- //else {
- // Else local patch
- _cpool.put(relo,_bits.size());
- add8(x);
- //}
+ // By log size
+ for( int log = 3; log >= 0; log-- ) {
+ // Write the 8-byte constants
+ for( Node relo : _bigCons.keySet() ) {
+ Type t = _bigCons.get(relo);
+ if( t.log_size()==log ) {
+ // Map from relo to constant start
+ // Else local patch
+ int target = _bits.size();
+ int start = _opStart[relo._nid];
+ ((RIPRelSize)relo).patch(this, start, _opLen[relo._nid], target - start);
+ if( t instanceof TypeTuple tt ) {
+ for( Type tx : tt._types )
+ addN(log,tx);
+ } else
+ addN(log,t);
+ //if( elf ) _cbits.write8(x);
+ //else {
+ //}
+ }
}
}
+ }
- // Write the 4-byte constants
- for( Node relo : _bigCons.keySet() ) {
- Type t = _bigCons.get(relo);
- if( t.log_size()==2 ) {
- // Map from relo to constant start
- _cpool.put(relo,_bits.size());
- int x = t instanceof TypeInteger ti
- ? (int)ti.value()
- : Float.floatToRawIntBits((float)((TypeFloat)t).value());
- add4(x);
- }
+ private void addN( int log, Type t ) {
+ long x = t instanceof TypeInteger ti
+ ? ti.value()
+ : log==3
+ ? Double.doubleToRawLongBits( ((TypeFloat)t).value())
+ : Float.floatToRawIntBits((float)((TypeFloat)t).value());
+ switch(log) {
+ case 0: add1((int)x); break;
+ case 1: add2((int)x); break;
+ case 2: add4((int)x); break;
+ case 3: add8( x); break;
}
}
+
// Patch local encodings now
private void patchLocalRelocations() {
// Walk the local code-address relocations
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
index b39e2705..2e475f13 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
@@ -27,20 +27,34 @@ public abstract class ASMPrinter {
Encoding enc = code._encoding;
if( enc!=null && !enc._bigCons.isEmpty() ) {
sb.p("--- Constant Pool ------").nl();
- for( Node relo : enc._bigCons.keySet() ) {
- Type t = enc._bigCons.get(relo);
- if( t.log_size()==3 ) {
- sb.hex2(iadr).p(" ").hex8(enc.read8(iadr)).p(" ");
- t.print(sb).nl();
- iadr += 8;
- }
- }
- for( Node relo : enc._bigCons.keySet() ) {
- Type t = enc._bigCons.get(relo);
- if( t.log_size()==2 ) {
- sb.hex2(iadr).p(" ").hex4(enc.read4(iadr)).fix(9,"");
- t.print(sb).nl();
- iadr += 4;
+ // By log size
+ for( int log = 3; log >= 0; log-- ) {
+ for( Node relo : enc._bigCons.keySet() ) {
+ Type t = enc._bigCons.get(relo);
+ if( t.log_size()==log ) {
+ sb.hex2(iadr).p(" ");
+ if( t instanceof TypeTuple tt ) {
+ for( Type tx : tt._types ) {
+ switch( log ) {
+ case 0: sb.hex1(enc.read1(iadr)); break;
+ case 1: sb.hex2(enc.read2(iadr)); break;
+ case 2: sb.hex4(enc.read4(iadr)); break;
+ case 3: sb.hex8(enc.read8(iadr)); break;
+ }
+ iadr += (1<<log);
+ sb.p(" ");
+ }
+ } else {
+ switch( log ) {
+ case 0: sb.hex1(enc.read1(iadr)).fix(9-1,""); break;
+ case 1: sb.hex2(enc.read2(iadr)).fix(9-2,""); break;
+ case 2: sb.hex4(enc.read4(iadr)).fix(9-4,""); break;
+ case 3: sb.hex8(enc.read8(iadr)).p(" "); break;
+ }
+ iadr += (1<<log);
+ }
+ t.print(sb).nl();
+ }
}
}
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/type/TypeTuple.java b/chapter21/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
index 95e35e99..2d40a1cf 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
@@ -55,6 +55,21 @@ public class TypeTuple extends Type {
return make(ts);
}
+ @Override public boolean isConstant() {
+ for( Type t : _types )
+ if( !t.isConstant() )
+ return false;
+ return true;
+ }
+
+ @Override public int log_size() {
+ assert isConstant();
+ int log_size = 0;
+ for( Type t : _types )
+ log_size = Math.max(log_size,t.log_size());
+ return log_size;
+ }
+
public Type ret() { assert _types.length==3; return _types[2]; }
@Override public String str() { return print(new SB()).toString(); }