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 + -
显示快捷键?