62 lines
2.4 KiB
Java
Executable File
62 lines
2.4 KiB
Java
Executable File
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);
|
|
}
|
|
}
|