mips without optimize
This commit is contained in:
85
midend/llvm/instr/AluInstr.java
Normal file → Executable file
85
midend/llvm/instr/AluInstr.java
Normal file → Executable file
@@ -1,24 +1,61 @@
|
||||
package midend.llvm.instr;
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user