Files
MY_COMPILER/midend/llvm/instr/AluInstr.java
2025-12-12 20:14:00 +08:00

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);
}
}