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