mips without optimize

This commit is contained in:
colden
2025-12-12 20:14:00 +08:00
parent 84827838e2
commit c94bebf37b
130 changed files with 5462 additions and 4182 deletions

View File

@@ -0,0 +1,93 @@
package backend.mips;
import java.util.HashMap;
import java.util.ArrayList;
import backend.mips.instr.MipsInstr;
import backend.mips.instr.data.MipsAsciiz;
import backend.mips.instr.data.MipsSpace;
import backend.mips.instr.data.MipsWord;
import midend.llvm.value.IrFuncValue;
import midend.llvm.value.IrValue;
public class MipsBuilder {
private static MipsModule module = null;
private static int offset = 0;
private static HashMap<IrValue, Integer> valueOffsetMap = new HashMap<>();
private static HashMap<IrValue, Register> valueRegisterMap = new HashMap<>();
public static void setModule(MipsModule module) {
MipsBuilder.module = module;
}
public static int getOffset() {
return offset;
}
public static void setOffset(int offset) {
MipsBuilder.offset = offset;
}
public static void setValueOffsetMap(HashMap<IrValue, Integer> valueOffsetMap) {
MipsBuilder.valueOffsetMap = valueOffsetMap;
}
public static HashMap<IrValue, Integer> getValueOffsetMap() {
return valueOffsetMap;
}
public static void setValueRegisterMap(HashMap<IrValue, Register> valueRegisterMap) {
MipsBuilder.valueRegisterMap = valueRegisterMap;
}
public static HashMap<IrValue, Register> getValueRegisterMap() {
return valueRegisterMap;
}
public static MipsModule getModule() {
return module;
}
public static void addMipsInstr(MipsInstr instr) {
if (instr instanceof MipsAsciiz || instr instanceof MipsWord || instr instanceof MipsSpace) { //data段
module.addData(instr);
} else {
module.addText(instr);
}
}
public static void enterNewFunc(IrFuncValue func) {
offset = 0;
valueOffsetMap = func.getValueOffsetMap();
valueOffsetMap.clear(); //TODO是否需要清空
valueRegisterMap = func.getValueRegisterMap();
}
public static Register getRegister(IrValue value) {
return valueRegisterMap.get(value);
}
public static Integer getOffset(IrValue value) {
return valueOffsetMap.get(value);
}
public static void allocaRegister(IrValue value, Register reg) {
valueRegisterMap.put(value, reg);
}
public static void allocaOffset(IrValue value) {
if (!valueOffsetMap.containsKey(value)) {
offset -= 4;
int valueOffset = offset;
valueOffsetMap.put(value, valueOffset);
}
}
public static void allocaOffset(int extra) {
offset -= extra;
}
public static ArrayList<Register> getUsedRegisters() {
return new ArrayList<>(valueRegisterMap.values());
}
}