diff options
| author | Cliff Click <cliffc@acm.org> | 2025-04-04 16:32:25 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-04-04 16:32:25 -0700 |
| commit | 3016c9fcf8361cb1a0c494dbb7b997df33df5728 (patch) | |
| tree | a7c5cf534974a366cd0c41fd7ee6337ad07cd701 /chapter21/src/main/java/com | |
| parent | 887f3d9caf68b051c630bab6c8895778be8f044f (diff) | |
| download | Simple-3016c9fcf8361cb1a0c494dbb7b997df33df5728.tar.gz Simple-3016c9fcf8361cb1a0c494dbb7b997df33df5728.zip | |
Support constant tuples
Diffstat (limited to 'chapter21/src/main/java/com')
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(); } |
