76 lines
2.3 KiB
Java
Executable File
76 lines
2.3 KiB
Java
Executable File
package midend.llvm.instr;
|
|
|
|
import midend.llvm.use.IrUser;
|
|
import midend.llvm.value.IrBasicBlock;
|
|
import midend.llvm.value.IrGlobalValue;
|
|
import midend.llvm.value.IrValue;
|
|
import midend.llvm.constant.IrConstantInt;
|
|
import backend.mips.MipsBuilder;
|
|
import backend.mips.Register;
|
|
import backend.mips.instr.MipsLs;
|
|
import backend.mips.instr.fake.MipsLa;
|
|
import backend.mips.instr.fake.MipsLi;
|
|
import backend.mips.instr.fake.MipsMove;
|
|
import backend.mips.instr.type.MipsLsType;
|
|
import midend.llvm.type.IrType;
|
|
|
|
public class IrInstr extends IrUser {
|
|
private IrInstrType type;
|
|
private IrBasicBlock block;
|
|
|
|
public IrInstr(IrType type, String name, IrInstrType instrType) {
|
|
super(type, name);
|
|
this.type = instrType;
|
|
this.block = null;
|
|
}
|
|
|
|
public IrInstrType getInstrType() {
|
|
return type;
|
|
}
|
|
|
|
public IrBasicBlock getBBlock() {
|
|
return block;
|
|
}
|
|
|
|
public void setBBlock(IrBasicBlock block) {
|
|
this.block = block;
|
|
}
|
|
|
|
public void saveResult(IrValue value, Register reg) {
|
|
Register valueReg = MipsBuilder.getRegister(value);
|
|
if (valueReg == null) {
|
|
Integer offset = MipsBuilder.getOffset(value);
|
|
if (offset == null) {
|
|
MipsBuilder.allocaOffset(value);
|
|
offset = MipsBuilder.getOffset(value);
|
|
}
|
|
new MipsLs(MipsLsType.SW, reg, Register.SP, offset);
|
|
} else {
|
|
new MipsMove(valueReg, reg);
|
|
}
|
|
}
|
|
|
|
public void loadValueToReg(IrValue value, Register reg) {
|
|
if (value instanceof IrGlobalValue) {
|
|
new MipsLa(reg, value.getMipsLabel());
|
|
return;
|
|
}
|
|
if (value instanceof IrConstantInt) {
|
|
new MipsLi(reg, ((IrConstantInt) value).getValue());
|
|
return;
|
|
}
|
|
|
|
Register valueReg = MipsBuilder.getRegister(value);
|
|
if (valueReg != null) {
|
|
new MipsMove(reg, valueReg);
|
|
return;
|
|
}
|
|
Integer offset = MipsBuilder.getOffset(value);
|
|
if (offset == null) {
|
|
MipsBuilder.allocaOffset(value);
|
|
offset = MipsBuilder.getOffset(value);
|
|
}
|
|
new MipsLs(MipsLsType.LW, reg, Register.SP, offset);
|
|
}
|
|
}
|