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); } }