irtest.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 174 行
JAVA
174 行
/*
* $Id: IRTest.java,v 1.6 2004/02/15 11:06:33 epr Exp $
*/
package org.jnode.vm.compiler.ir;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.jnode.assembler.x86.TextX86Stream;
import org.jnode.util.BootableArrayList;
import org.jnode.util.BootableHashMap;
import org.jnode.vm.VmSystemClassLoader;
import org.jnode.vm.bytecode.BytecodeParser;
import org.jnode.vm.classmgr.VmByteCode;
import org.jnode.vm.classmgr.VmMethod;
import org.jnode.vm.classmgr.VmType;
import org.jnode.vm.compiler.ir.quad.Quad;
import org.jnode.vm.x86.VmX86Architecture;
import org.jnode.vm.x86.X86CpuID;
import org.jnode.vm.x86.compiler.l2.X86CodeGenerator;
/**
* @author Madhu Siddalingaiah
*
*/
public class IRTest {
public static void main(String args[]) throws SecurityException, IOException, ClassNotFoundException {
X86CpuID cpuId = X86CpuID.createID("p5");
TextX86Stream os = new TextX86Stream(new OutputStreamWriter(System.out), cpuId);
X86CodeGenerator x86cg = new X86CodeGenerator(os);
VmByteCode code = loadByteCode(args);
IRControlFlowGraph cfg = new IRControlFlowGraph(code);
IRGenerator irg = new IRGenerator(cfg);
BytecodeParser.parse(code, irg);
BootableArrayList quads = irg.getQuadList();
int n = quads.size();
BootableHashMap liveVariables = new BootableHashMap();
for (int i=0; i<n; i+=1) {
Quad quad = (Quad) quads.get(i);
quad.doPass2(liveVariables);
}
Collection lv = liveVariables.values();
n = lv.size();
LiveRange[] liveRanges = new LiveRange[n];
Iterator it = lv.iterator();
for (int i=0; i<n; i+=1) {
Variable v = (Variable) it.next();
liveRanges[i] = new LiveRange(v);
}
Arrays.sort(liveRanges);
LinearScanAllocator lsa = new LinearScanAllocator(liveRanges);
lsa.allocate();
x86cg.setArgumentVariables(irg.getVariables(), irg.getNoArgs());
x86cg.setSpilledVariables(lsa.getSpilledVariables());
x86cg.emitHeader();
/*
BytecodeViewer bv = new BytecodeViewer();
BytecodeParser.parse(code, bv);
// System.out.println(cfg.toString());
// System.out.println();
boolean printDeadCode = false;
boolean printDetail = false;
IRBasicBlock currentBlock = null;
for (int i=0; i<n; i+=1) {
Quad quad = (Quad) quads.get(i);
if (currentBlock != quad.getBasicBlock()) {
currentBlock = quad.getBasicBlock();
System.out.println();
System.out.println(currentBlock);
}
if (printDeadCode && quad.isDeadCode()) {
if (printDetail) {
printQuadDetail(quad);
}
System.out.println(quad);
}
if (!quad.isDeadCode()) {
if (printDetail) {
printQuadDetail(quad);
}
System.out.println(quad);
}
}
System.out.println();
System.out.println("Live ranges:");
n = lv.size();
for (int i=0; i<n; i+=1) {
System.out.println(liveRanges[i]);
}
*/
n = quads.size();
for (int i=0; i<n; i+=1) {
Quad quad = (Quad) quads.get(i);
if (!quad.isDeadCode()) {
quad.generateCode(x86cg);
}
}
os.flush();
}
private static VmByteCode loadByteCode(String[] args)
throws MalformedURLException, ClassNotFoundException {
String className = "org.jnode.vm.compiler.ir.IRTest";
if (args.length > 0) {
className = args[0];
}
VmSystemClassLoader vmc = new VmSystemClassLoader(new File(".").toURL(), new VmX86Architecture());
VmType type = vmc.loadClass(className, true);
VmMethod arithMethod = null;
int nMethods = type.getNoDeclaredMethods();
for (int i=0; i<nMethods; i+=1) {
VmMethod method = type.getDeclaredMethod(i);
if ("simple".equals(method.getName())) {
arithMethod = method;
break;
}
}
VmByteCode code = arithMethod.getBytecode();
return code;
}
public static void printQuadDetail(Quad quad) {
System.out.print(quad.getBasicBlock());
System.out.print(" ");
Variable[] vars = quad.getBasicBlock().getVariables();
System.out.print("[");
for (int j=0; j<vars.length; j+=1) {
System.out.print(vars[j]);
System.out.print(",");
}
System.out.print("] ");
if (quad.isDeadCode()) {
System.out.print("(dead) ");
}
}
public static int arithOptLoop(int a0, int a1, int a2) {
int l3 = 1;
int l4 = 3*a1;
for (int l5=10; l5 > 0; l5-=1) {
l3 += 2*a0 + l4;
l4 += 1;
}
return l3;
}
public static int arithOptIntx(int a0, int a1, int a2) {
return a0 + a1;
}
public static int discriminant(int a0, int a1, int a2) {
return a1*a1 - 4*a0*a2;
}
public static int simple(int a0, int a1) {
int l0 = a1;
return -l0;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?