From f3ca559f9fe58d221e2d465845932f92278a7928 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 14 Mar 2025 12:24:17 -0700 Subject: Encoding driver ch21 --- .../com/seaofnodes/simple/codegen/CodeGen.java | 8 ++++---- .../seaofnodes/simple/node/cpus/arm/OrIARM.java | 22 ++++++++++++++++++++++ .../com/seaofnodes/simple/node/cpus/arm/arm.java | 9 ++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 chapter21/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java (limited to 'chapter21/src/main/java/com') 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) { -- cgit v1.2.3