mips without optimize
This commit is contained in:
90
midend/llvm/instr/CmpInstr.java
Normal file → Executable file
90
midend/llvm/instr/CmpInstr.java
Normal file → Executable file
@@ -1,32 +1,58 @@
|
||||
package midend.llvm.instr;
|
||||
|
||||
import midend.llvm.value.IrValue;
|
||||
import midend.llvm.type.IrInterType;
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user