diff options
| author | Cliff Click <cliffc@acm.org> | 2025-03-14 12:24:17 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-03-14 12:24:17 -0700 |
| commit | f3ca559f9fe58d221e2d465845932f92278a7928 (patch) | |
| tree | c83a9424e5df3f8563f1212eb4b5e1f61e9a4b8f /chapter21/src/main/java | |
| parent | fd0123589d21c5055e4314b8bdf7e883f3d6d956 (diff) | |
| download | Simple-f3ca559f9fe58d221e2d465845932f92278a7928.tar.gz Simple-f3ca559f9fe58d221e2d465845932f92278a7928.zip | |
Encoding driver ch21
Diffstat (limited to 'chapter21/src/main/java')
3 files changed, 34 insertions, 5 deletions
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter21/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java index 214b597d..eb6d96f9 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java @@ -332,14 +332,14 @@ public class CodeGen { // --------------------------- // Encoding int _tEncode; + public Encoding _encoding; public CodeGen encode() { assert _phase == Phase.RegAlloc; _phase = Phase.Encoding; long t0 = System.currentTimeMillis(); - - - //_tEncode = (int)(System.currentTimeMillis() - t0); - //throw Utils.TODO(); + _encoding = new Encoding(this); + _encoding.encode(); + _tEncode = (int)(System.currentTimeMillis() - t0); return this; } // Encoded binary, no relocation info diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java new file mode 100644 index 00000000..68550926 --- /dev/null +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java @@ -0,0 +1,22 @@ +package com.seaofnodes.simple.node.cpus.arm; + +import com.seaofnodes.simple.*; +import com.seaofnodes.simple.codegen.*; +import com.seaofnodes.simple.node.*; + +public class OrIARM extends MachConcreteNode implements MachNode { + final int _imm; + OrIARM(Node or, int imm) { + super(or); + _inputs.pop(); + _imm = imm; + } + @Override public String op() { return "ori"; } + @Override public RegMask regmap(int i) { return arm.RMASK; } + @Override public RegMask outregmap() { return arm.RMASK; } + @Override public void encoding( Encoding enc ) { arm.imm_inst(enc,this,170,_imm); } + // General form: "ori rd = rs1 | imm" + @Override public void asm(CodeGen code, SB sb) { + sb.p(code.reg(this)).p(" = ").p(code.reg(in(1))).p(" | #").p(_imm); + } +} diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java index ca92b63e..6fc0afec 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java @@ -395,7 +395,7 @@ public class arm extends Machine { case MulNode mul -> new MulARM(mul); case NewNode nnn -> new NewARM(nnn); case NotNode not -> new NotARM(not); - case OrNode or -> new OrARM(or); + case OrNode or -> or(or); case ParmNode parm -> new ParmARM(parm); case PhiNode phi -> new PhiNode(phi); case ProjNode prj -> new ProjARM(prj); @@ -476,6 +476,13 @@ public class arm extends Machine { return new CallRRARM(call); } + private Node or(OrNode or) { + return or.in(2) instanceof ConstantNode off && off._con instanceof TypeInteger ti && imm12(ti) + ? new OrIARM(or, (int)ti.value()) + : new OrARM(or); + } + + private static int off; private static Node idx; private Node st(StoreNode st) { |
