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