summaryrefslogtreecommitdiff
path: root/src/main/java/com/seaofnodes/simple/print
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-04-21 14:18:23 -0700
committerCliff Click <cliffc@acm.org>2025-07-03 09:50:14 -0700
commit018379b0cf4e286ceacb1e39f34dd80f770e381e (patch)
treed88eae2d5e2d9609f271ec78fb60aaf08c5aaee5 /src/main/java/com/seaofnodes/simple/print
parent49534ffa88fedb3a4ebc42094e9edb27d456e6d6 (diff)
downloadSimple-linear-chapter22.tar.gz
Simple-linear-chapter22.zip
Chapter 22: A Hello, World!linear-chapter22
Co-authored-by: godalming123 <68993177+godalming123@users.noreply.github.com> Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com>
Diffstat (limited to 'src/main/java/com/seaofnodes/simple/print')
-rw-r--r--src/main/java/com/seaofnodes/simple/print/ASMPrinter.java87
1 files changed, 53 insertions, 34 deletions
diff --git a/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
index da269d31..366ae376 100644
--- a/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
+++ b/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java
@@ -1,9 +1,11 @@
package com.seaofnodes.simple.print;
+import com.seaofnodes.simple.Ary;
import com.seaofnodes.simple.SB;
import com.seaofnodes.simple.Utils;
import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.codegen.Encoding;
+import com.seaofnodes.simple.codegen.Encoding.Relo;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.*;
import java.util.HashSet;
@@ -20,54 +22,71 @@ public abstract class ASMPrinter {
if( code._cfg.at(i) instanceof FunNode fun )
iadr = print(iadr,sb,code,fun,i);
- // Skip padding
- while( ((iadr+7) & -8) > iadr )
- iadr++;
-
// constant pool
+ iadr = (iadr+15)&-16; // pad to 16
Encoding enc = code._encoding;
- if( enc!=null && !enc._bigCons.isEmpty() ) {
- iadr = (iadr+15)&-16; // pad to 16
+ if( enc!=null && !enc._bigCons.isEmpty() && iadr < enc._bits.size() ) {
+ // radix sort the big constants by alignment
+ Ary<Relo>[] raligns = new Ary[5];
+ for( Node op : enc._bigCons.keySet() ) {
+ Relo relo = enc._bigCons.get(op);
+ int align = relo._t.alignment();
+ Ary<Relo> relos = raligns[align]==null ? (raligns[align]=new Ary<>( Relo.class)) : raligns[align];
+ relos.add(relo);
+ }
+
HashSet<Type> targets = new HashSet<>();
sb.p("--- Constant Pool ------").nl();
- // By log size
- for( int log = 3; log >= 0; log-- ) {
- for( Node op : enc._bigCons.keySet() ) {
- Encoding.Relo relo = enc._bigCons.get(op);
+
+ // By alignment
+ for( int align = 4; align >= 0; align-- ) {
+ Ary<Relo> relos = raligns[align];
+ if( relos == null ) continue;
+ for( Relo relo : relos ) {
if( targets.contains(relo._t) ) continue;
targets.add(relo._t);
- if( relo._t.log_size()==log ) {
- sb.hex2(iadr).p(" ");
- if( relo._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);
+ sb.hex2(iadr).p(" ");
+ switch( relo._t ) {
+ case TypeTuple tt -> {
+ for( Type tx : tt._types ) {
+ pN(enc,sb,iadr,align).p(" ");
+ iadr += (1<<align);
}
- relo._t.print(sb).nl();
}
+
+ case TypeStruct ts -> {
+ int sz = ts.size();
+ int log = 1<<align;
+ sz = (sz + (log -1)) & -log; // Round up final padding
+ for( int i=0; i<sz; i++ )
+ sb.hex1(enc.read1(iadr++));
+ }
+
+ // Simple primitive (e.g. larger int, float)
+ default -> {
+ pN(enc,sb,iadr,align).fix(9-(1<<align),"");
+ iadr += (1<<align);
+ }
+ }
+ relo._t.print(sb).nl();
}
}
}
+ return sb;
+ }
+ private static SB pN( Encoding enc, SB sb, int iadr, int log ) {
+ 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;
+ }
return sb;
}
+
private static int print(int iadr, SB sb, CodeGen code, FunNode fun, int cfgidx) {
FunNode old=null;
if( code._encoding!=null ) {
@@ -175,7 +194,7 @@ public abstract class ASMPrinter {
// Encoding
int fatEncoding = 0;
- if( code._encoding != null ) {
+ if( code._encoding != null && code._encoding._opLen!=null ) {
int size = code._encoding._opLen[n._nid];
if( code._asmLittle )
for( int i=0; i<Math.min(size,dopz); i++ )
@@ -224,7 +243,7 @@ public abstract class ASMPrinter {
sb.nl();
// Printing more op bits than fit
- if( isMultiOp != null && code._encoding != null ) {
+ if( isMultiOp != null && code._encoding != null && code._encoding._opLen!=null ) {
// Multiple ops, template style, no RA, no scheduling. Print out
// one-line-per-newline, with encoding bits up front.
int size = code._encoding._opLen[n._nid];