40 lines
1.2 KiB
Java
Executable File
40 lines
1.2 KiB
Java
Executable File
package midend.llvm.instr;
|
|
|
|
import backend.mips.MipsBuilder;
|
|
import backend.mips.Register;
|
|
import backend.mips.instr.MipsLs;
|
|
import backend.mips.instr.type.MipsLsType;
|
|
import midend.llvm.type.IrPointerType;
|
|
import midend.llvm.value.IrValue;
|
|
|
|
public class LoadInstr extends IrInstr {
|
|
public LoadInstr(IrValue pointer, String name) {
|
|
super(((IrPointerType) pointer.getType()).getPointeeType(), name, IrInstrType.LOAD);
|
|
addUse(pointer);
|
|
}
|
|
|
|
public IrValue getPointer() {
|
|
return getUse(0);
|
|
}
|
|
|
|
public String toString() {
|
|
return getName() + " = load " + getType() + ", "
|
|
+ getPointer().getType() + " " + getPointer().getName();
|
|
}
|
|
|
|
public void toMips() {
|
|
IrValue pointer = getPointer();
|
|
Register reg = MipsBuilder.getRegister(pointer);
|
|
if (reg == null) { // 未分配寄存器情况
|
|
reg = Register.K0;
|
|
}
|
|
loadValueToReg(pointer, reg);
|
|
Register resultReg = MipsBuilder.getRegister(this);
|
|
if (resultReg == null) {
|
|
resultReg = Register.K1;
|
|
}
|
|
new MipsLs(MipsLsType.LW, resultReg, reg, 0);
|
|
saveResult(this, resultReg);
|
|
}
|
|
}
|