x86codegenerator.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 419 行

JAVA
419
字号
/*
 * $Id: X86CodeGenerator.java,v 1.9 2004/02/16 18:46:26 epr Exp $
 */
package org.jnode.vm.x86.compiler.l2;

import org.jnode.assembler.x86.AbstractX86Stream;
import org.jnode.assembler.x86.Register;
import org.jnode.assembler.x86.X86Constants;
import org.jnode.vm.compiler.ir.CodeGenerator;
import org.jnode.vm.compiler.ir.Constant;
import org.jnode.vm.compiler.ir.IntConstant;
import org.jnode.vm.compiler.ir.Location;
import org.jnode.vm.compiler.ir.Operand;
import org.jnode.vm.compiler.ir.RegisterLocation;
import org.jnode.vm.compiler.ir.RegisterPool;
import org.jnode.vm.compiler.ir.StackLocation;
import org.jnode.vm.compiler.ir.Variable;
import org.jnode.vm.compiler.ir.quad.BinaryQuad;
import org.jnode.vm.compiler.ir.quad.ConditionalBranchQuad;
import org.jnode.vm.compiler.ir.quad.ConstantRefAssignQuad;
import org.jnode.vm.compiler.ir.quad.UnaryQuad;
import org.jnode.vm.compiler.ir.quad.UnconditionalBranchQuad;
import org.jnode.vm.compiler.ir.quad.VarReturnQuad;
import org.jnode.vm.compiler.ir.quad.VariableRefAssignQuad;
import org.jnode.vm.compiler.ir.quad.VoidReturnQuad;

/**
 * @author Madhu Siddalingaiah
 * 
 */
public class X86CodeGenerator extends CodeGenerator {
	private Variable[] spilledVariables;
	private AbstractX86Stream os;
	private int displacement;

	private final RegisterPool registerPool;

	/**
	 * Initialize this instance
	 */
	public X86CodeGenerator(AbstractX86Stream x86Stream) {
		CodeGenerator.setCodeGenerator(this);
		this.registerPool = new X86RegisterPool();
		this.os = x86Stream;
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#getRegisterPool()
	 */
	public RegisterPool getRegisterPool() {
		return registerPool;
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#supports3AddrOps()
	 */
	public boolean supports3AddrOps() {
		return false;
	}

	/**
	 * @param vars
	 * @param nArgs
	 */
	public void setArgumentVariables(Variable[] vars, int nArgs) {
		displacement = 0;
		for (int i=0; i<nArgs; i+=1) {
			// TODO this might not be right, check with Ewout
			displacement = vars[i].getIndex() * 4;
			vars[i].setLocation(new StackLocation(displacement));
		}
		// not sure how big the last arg is...
		displacement += 8;
	}

	/**
	 * @param variables
	 */
	public void setSpilledVariables(Variable[] variables) {
		this.spilledVariables = variables;
		int n = spilledVariables.length;
		for (int i=0; i<n; i+=1) {
			StackLocation loc = (StackLocation) spilledVariables[i].getLocation();
			loc.setDisplacement(displacement);
			switch (spilledVariables[i].getType()) {
				case Operand.BYTE:
				case Operand.CHAR:
				case Operand.SHORT:
				case Operand.INT:
				case Operand.FLOAT:
				case Operand.REFERENCE:
					displacement += 4;
					break;
				case Operand.LONG:
				case Operand.DOUBLE:
					displacement += 8;
					break;
			}
		}
	}

	/**
	 * 
	 */
	public void emitHeader() {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.ConditionalBranchQuad)
	 */
	public void generateCodeFor(ConditionalBranchQuad quad) {
		// TODO Auto-generated method stub

	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.ConstantRefAssignQuad)
	 */
	public void generateCodeFor(ConstantRefAssignQuad quad) {
		// TODO Auto-generated method stub

	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnconditionalBranchQuad)
	 */
	public void generateCodeFor(UnconditionalBranchQuad quad) {
		// TODO Auto-generated method stub

	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.VariableRefAssignQuad)
	 */
	public void generateCodeFor(VariableRefAssignQuad quad) {
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.VarReturnQuad)
	 */
	public void generateCodeFor(VarReturnQuad quad) {
		Operand op = quad.getOperand();
		// TODO must deal with other types, see else case also
		if (op instanceof IntConstant) {
			IntConstant iconst = (IntConstant) op;
			os.writeMOV_Const(Register.EAX, iconst.getValue());
		} else if (op instanceof Variable) {
			Variable var = (Variable) op;
			Location loc = var.getLocation();
			if (loc instanceof RegisterLocation) {
				RegisterLocation regLoc = (RegisterLocation) loc;
				Register src = (Register) regLoc.getRegister();
				if (!src.equals(Register.EAX)) {
					os.writeMOV(X86Constants.BITS32, Register.EAX, src);
				}
			} else {
				StackLocation stackLoc = (StackLocation) loc;
				os.writeMOV(X86Constants.BITS32, Register.EAX, Register.EBP,
					stackLoc.getDisplacement());
			}
		}
		os.writeRET();
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.VoidReturnQuad)
	 */
	public void generateCodeFor(VoidReturnQuad quad) {
		os.writeRET();
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, java.lang.Object, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateCodeFor(UnaryQuad quad, Object lhsReg, int operation,
		Constant con) {
		switch(operation) {
			case UnaryQuad.INEG:
				IntConstant iconst = (IntConstant) con;
				os.writeMOV_Const((Register) lhsReg, iconst.getValue());
				os.writeNEG((Register) lhsReg);
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, java.lang.Object, int, java.lang.Object)
	 */
	public void generateCodeFor(UnaryQuad quad, Object lhsReg, int operation,
		Object rhsReg) {
		switch(operation) {
			case UnaryQuad.INEG:
				if (lhsReg != rhsReg) {
					os.writeMOV(X86Constants.BITS32, (Register) lhsReg, (Register) rhsReg);
				}
				os.writeNEG((Register) lhsReg);
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, java.lang.Object, int, int)
	 */
	public void generateCodeFor(UnaryQuad quad, Object lhsReg, int operation,
		int rhsDisp) {
		switch(operation) {
			case UnaryQuad.INEG:
				os.writeMOV(X86Constants.BITS32, (Register) lhsReg, Register.EBP,
					rhsDisp);
				os.writeNEG((Register) lhsReg);
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, int, int, java.lang.Object)
	 */
	public void generateCodeFor(UnaryQuad quad, int lhsDisp, int operation,
		Object rhsReg) {
		switch(operation) {
			case UnaryQuad.INEG:
				os.writeMOV(X86Constants.BITS32, Register.EBP,
					lhsDisp, (Register) rhsReg);
				os.writeNEG(Register.EBP, lhsDisp);
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, int, int, int)
	 */
	public void generateCodeFor(UnaryQuad quad, int lhsDisp, int operation, int rhsDisp) {
		throw new IllegalArgumentException("ineg memory-memory not done");
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateCodeFor(org.jnode.vm.compiler.ir.quad.UnaryQuad, int, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateCodeFor(UnaryQuad quad, int lhsDisp, int operation, Constant con) {
		switch(operation) {
			case UnaryQuad.INEG:
				IntConstant iconst = (IntConstant) con;
				os.writeMOV_Const(Register.EBP, lhsDisp, iconst.getValue());
				os.writeNEG(Register.EBP, lhsDisp);
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, org.jnode.vm.compiler.ir.Constant, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(Object reg1, Constant c2, int operation, Constant c3) {
		switch(operation) {
			case BinaryQuad.IADD:
				IntConstant iconst1 = (IntConstant) c2;
				//IntConstant iconst2 = (IntConstant) c3;
				os.writeMOV_Const((Register) reg1, iconst1.getValue());
				// TODO STOPPED HERE...
				break;
			// TODO finish operations
			default:
				throw new IllegalArgumentException("Unknown operation");
		}
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, org.jnode.vm.compiler.ir.Constant, int, java.lang.Object)
	 */
	public void generateBinaryOP(Object reg1, Constant c2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, org.jnode.vm.compiler.ir.Constant, int, int)
	 */
	public void generateBinaryOP(Object reg1, Constant c2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, java.lang.Object, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(Object reg1, Object reg2, int operation, Constant c3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, java.lang.Object, int, java.lang.Object)
	 */
	public void generateBinaryOP(Object reg1, Object reg2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, java.lang.Object, int, int)
	 */
	public void generateBinaryOP(Object reg1, Object reg2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, int, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(Object reg1, int disp2, int operation, Constant c3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, int, int, java.lang.Object)
	 */
	public void generateBinaryOP(Object reg1, int disp2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(java.lang.Object, int, int, int)
	 */
	public void generateBinaryOP(Object reg1, int disp2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, org.jnode.vm.compiler.ir.Constant, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(int disp1, Constant c2, int operation, Constant c3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, org.jnode.vm.compiler.ir.Constant, int, java.lang.Object)
	 */
	public void generateBinaryOP(int disp1, Constant c2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, org.jnode.vm.compiler.ir.Constant, int, int)
	 */
	public void generateBinaryOP(int disp1, Constant c2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, java.lang.Object, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(int disp1, Object reg2, int operation, Constant c3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, java.lang.Object, int, java.lang.Object)
	 */
	public void generateBinaryOP(int disp1, Object reg2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, java.lang.Object, int, int)
	 */
	public void generateBinaryOP(int disp1, Object reg2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, int, int, org.jnode.vm.compiler.ir.Constant)
	 */
	public void generateBinaryOP(int disp1, int disp2, int operation, Constant c3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, int, int, java.lang.Object)
	 */
	public void generateBinaryOP(int disp1, int disp2, int operation, Object reg3) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @see org.jnode.vm.compiler.ir.CodeGenerator#generateBinaryOP(int, int, int, int)
	 */
	public void generateBinaryOP(int disp1, int disp2, int operation, int disp3) {
		// TODO Auto-generated method stub
		
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?