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

59 lines
2.2 KiB
Java
Executable File

package midend.llvm.instr;
import midend.llvm.value.IrValue;
import backend.mips.Register;
import backend.mips.instr.MipsComp;
import backend.mips.instr.type.MipsCompareType;
import midend.llvm.type.IrInterType;
import backend.mips.MipsBuilder;
public class CmpInstr extends IrInstr {
private CmpType cmpType;
public CmpInstr(String name, String op, IrValue lhs, IrValue rhs) {
super(IrInterType.BOOL, name, IrInstrType.CMP);
cmpType = CmpType.getCmpType(op);
addUse(lhs);
addUse(rhs);
}
public CmpType getCmpType() {
return cmpType;
}
public IrValue getLhs() {
return getUse(0);
}
public IrValue getRhs() {
return getUse(1);
}
public String toString() {
return getName() + " = " + "icmp " + cmpType.toString()
+ " i32 " + getLhs().getName() + ", " + getRhs().getName();
}
public void toMips() {
Register leftReg = MipsBuilder.getRegister(getLhs()) != null ? MipsBuilder.getRegister(getLhs()) : Register.K0;
Register rightReg = MipsBuilder.getRegister(getRhs()) != null ? MipsBuilder.getRegister(getRhs()) : Register.K1;
Register resultReg = MipsBuilder.getRegister(this) != null ? MipsBuilder.getRegister(this) : Register.K1;
loadValueToReg(getLhs(), leftReg);
loadValueToReg(getRhs(), rightReg);
if (getCmpType() == CmpType.EQ) {
new MipsComp(MipsCompareType.SEQ, resultReg, leftReg, rightReg);
} else if (getCmpType() == CmpType.NE) {
new MipsComp(MipsCompareType.SNE, resultReg, leftReg, rightReg);
} else if (getCmpType() == CmpType.SGE) {
new MipsComp(MipsCompareType.SGE, resultReg, leftReg, rightReg);
} else if (getCmpType() == CmpType.SLE) {
new MipsComp(MipsCompareType.SLE, resultReg, leftReg, rightReg);
} else if (getCmpType() == CmpType.SGT) {
new MipsComp(MipsCompareType.SGT, resultReg, leftReg, rightReg);
} else if (getCmpType() == CmpType.SLT) {
new MipsComp(MipsCompareType.SLT, resultReg, leftReg, rightReg);
}
saveResult(this, resultReg);
}
}