package midend.llvm.instr; import backend.mips.MipsBuilder; import backend.mips.instr.MipsAlu; import backend.mips.instr.MipsMd; import backend.mips.instr.type.MipsAluType; import backend.mips.instr.type.MipsMdType; import backend.mips.Register; import midend.llvm.type.IrInterType; import midend.llvm.value.IrValue; public class AluInstr extends IrInstr { private AluType alutype; public AluInstr(String name, String op, IrValue left, IrValue right) { super(IrInterType.INT32, name, IrInstrType.ALU); this.alutype = AluType.getAluType(op); addUse(left); addUse(right); } public AluType getAluType() { return alutype; } public String toString() { return getName() + " = " + alutype.toString() + " " + getType() + " " + getUse(0).getName() + ", " + getUse(1).getName(); } public void toMips() { IrValue left = getUse(0); IrValue right = getUse(1); Register leftReg = MipsBuilder.getRegister(left) != null ? MipsBuilder.getRegister(left) : Register.K0; Register rightReg = MipsBuilder.getRegister(right) != null ? MipsBuilder.getRegister(right) : Register.K1; Register resultReg = MipsBuilder.getRegister(this) != null ? MipsBuilder.getRegister(this) : Register.K1; loadValueToReg(left, leftReg); loadValueToReg(right, rightReg); if (getAluType() == AluType.ADD) { new MipsAlu(MipsAluType.ADDU, resultReg, leftReg, rightReg); } else if (getAluType() == AluType.SUB) { new MipsAlu(MipsAluType.SUBU, resultReg, leftReg, rightReg); } else if (getAluType() == AluType.AND) { new MipsAlu(MipsAluType.AND, resultReg, leftReg, rightReg); } else if (getAluType() == AluType.OR) { new MipsAlu(MipsAluType.OR, resultReg, leftReg, rightReg); } else if (getAluType() == AluType.MUL) { new MipsMd(MipsMdType.MULT, leftReg, rightReg); new MipsMd(MipsMdType.MFLO, resultReg); } else if (getAluType() == AluType.SDIV) { new MipsMd(MipsMdType.DIV, leftReg, rightReg); new MipsMd(MipsMdType.MFLO, resultReg); } else if (getAluType() == AluType.SREM) { new MipsMd(MipsMdType.DIV, leftReg, rightReg); new MipsMd(MipsMdType.MFHI, resultReg); } saveResult(this, resultReg); } }