|
@@ -70,99 +70,20 @@ public class Gen extends API.TargetGen {
|
|
|
put("bgtz", "branch if register > 0");
|
|
|
}
|
|
|
};
|
|
|
- private ArrayList<String> returnRegisters;
|
|
|
- private HashMap<String, Boolean> ctrlDataUpdate = new HashMap<>();
|
|
|
- private int WORD_INC = 4;
|
|
|
+ protected ArrayList<String> returnRegisters;
|
|
|
+ protected HashMap<String, Boolean> ctrlDataUpdate = new HashMap<>();
|
|
|
+ protected Integer WORD_INC = 4;
|
|
|
|
|
|
public Gen() {
|
|
|
super("MIPS");
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public IvannosysTargetArch Export() {
|
|
|
- Code Target = getTarget();
|
|
|
- System.out.println(Target.GData());
|
|
|
- String out = "", tmp;
|
|
|
-
|
|
|
- Integer index;
|
|
|
-
|
|
|
- for (Map.Entry<String, Block> x : Target.stmts.entrySet()) {
|
|
|
- System.out.println(x.getValue().Data());
|
|
|
- index = 0;
|
|
|
- for (Instruction instr : x.getValue().Instructions()) {
|
|
|
-// System.out.println("Export:" + instr);
|
|
|
- tmp = instr.G("inst.dec");
|
|
|
- if (tmp.equals("")) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- out = out
|
|
|
- // .concat(Integer.toHexString(index))
|
|
|
- // .concat(":")
|
|
|
- // .concat(String.format("%X\n", tmp.trim()) + "\n");
|
|
|
- .concat(tmp + "\n");
|
|
|
- index++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-// System.out.println("Export:" + out);
|
|
|
- // Grava resutlado no arquivo de memoria do simulador
|
|
|
- Utils.WriteFile("\\src\\tools\\mips\\memory\\mi.memory", out);
|
|
|
- try {
|
|
|
- new tools.mips.MipsProcessor(new tools.mips.MipsSettings() {
|
|
|
- {
|
|
|
- debugmode = false;
|
|
|
- SetInstructionMemoryFile("\\src\\tools\\mips\\memory\\mi.memory");
|
|
|
- SetDataMemoryFile("\\src\\tools\\mips\\memory\\md.memory");
|
|
|
- }
|
|
|
- }).Run().Persist();
|
|
|
- } catch (Exception ex) {
|
|
|
- Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
- }
|
|
|
-
|
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
|
- }
|
|
|
-
|
|
|
-// public void CopyData(LinkedHashMap<String, Node> dst, LinkedHashMap<String, Node> src) throws Exception {
|
|
|
- public void CopyData(DataFrame dst, DataFrame src) throws Exception {
|
|
|
- Node value;
|
|
|
- LinkedHashMap<String, Node> svalues = src.values(),
|
|
|
- dvalues = dst.values();
|
|
|
-
|
|
|
- for (Map.Entry<String, Node> x : svalues.entrySet()) {
|
|
|
- value = x.getValue().copy();
|
|
|
- value.S("size", value.getInt("size") * WORD_INC);
|
|
|
-// System.out.println("Copy:[" + x.getKey() + "][" + value.G("id") + "]" + value.G("size") + "\n" + value);
|
|
|
-// dvalues.put(x.getKey(), value);
|
|
|
-
|
|
|
- dst.Set(x.getKey(), value);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public IvannosysTargetArch SetTAC(Code tac) {
|
|
|
- try {
|
|
|
- this.IR = tac;
|
|
|
-
|
|
|
- Init();
|
|
|
-
|
|
|
- getTarget().AfterTranslateBlock("copy.dep", new CopyDeps(tac));
|
|
|
-
|
|
|
-// CopyData(target.GData().values(), IR.GData().values());
|
|
|
- CopyData(
|
|
|
- target.GData(),
|
|
|
- tac.GData()
|
|
|
- );
|
|
|
-
|
|
|
- } catch (Exception ex) {
|
|
|
- Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
- }
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
public void Init() {
|
|
|
BaseBlockProcessor ocorrences = new BaseBlockProcessor();
|
|
|
// Rotinas executadas no codigo intermediario de um bloco antes de ser traduzido.
|
|
|
getIR()
|
|
|
- .BeforeTranslateBlock("live.var", ocorrences)
|
|
|
+ .BeforeTranslateBlock("basic.blocks", ocorrences)
|
|
|
+ .BeforeTranslateBlock("remove.load.store", new LoadStoreProcessor(ocorrences))
|
|
|
.BeforeTranslateBlock("register.alloc", new AllocatorMipsProcessor(ocorrences));
|
|
|
|
|
|
getTarget()
|
|
@@ -183,7 +104,6 @@ public class Gen extends API.TargetGen {
|
|
|
Add(new Instruction()
|
|
|
.S("type", "label")
|
|
|
.S("format", "norender")
|
|
|
- // .S("format", "label")
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("label", inst.G("label")));
|
|
|
getTarget().RegisterLabelAddress(inst.G("label"));
|
|
@@ -193,26 +113,26 @@ public class Gen extends API.TargetGen {
|
|
|
public void TranslateCopy(Instruction inst) throws Exception {
|
|
|
|
|
|
//Se o valor deve ser armazenado em memoria
|
|
|
- String regDst = inst.G("reg.dst");
|
|
|
-
|
|
|
- if (inst.eq("reg.dst.store", "true")) {
|
|
|
-
|
|
|
-// System.out.println("::" + inst);
|
|
|
- inst.S("reg.p1", regDst);
|
|
|
- String dst = inst.G("dst");
|
|
|
- LoadParam(inst, "p1");
|
|
|
-// StoreWord(inst.G("reg.p1"),
|
|
|
- StoreWord(regDst,
|
|
|
- GlobalOrFrameRegister(dst),
|
|
|
- getTarget().Block().Data().Offset(dst))
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "store content of " + inst.G("reg.p1") + " in " + dst);
|
|
|
- } else {
|
|
|
- Copy(inst, regDst)
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "copy " + inst.G("dst") + " ← " + inst.G("p1"));
|
|
|
- }
|
|
|
+// String regDst = inst.G("reg.dst");
|
|
|
+ System.out.println("COPY:::::::::::" + inst);
|
|
|
|
|
|
+// if (inst.eq("reg.dst.store", "true")) {
|
|
|
+//
|
|
|
+//// System.out.println("::" + inst);
|
|
|
+// inst.S("reg.p1", regDst);
|
|
|
+// String dst = inst.G("dst");
|
|
|
+// LoadParam(inst, "p1");
|
|
|
+//// StoreWord(inst.G("reg.p1"),
|
|
|
+// StoreWord(regDst,
|
|
|
+// GlobalOrFrameRegister(dst),
|
|
|
+// getTarget().Block().Data().Offset(dst))
|
|
|
+// .S("tac.position", inst.G("block.position"))
|
|
|
+// .S("comment", "store content of " + inst.G("reg.p1") + " in " + dst);
|
|
|
+// } else {
|
|
|
+ Copy(inst, inst.G("reg.dst"))
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "copy " + inst.G("dst") + " ← " + inst.G("p1"));
|
|
|
+// }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -356,29 +276,6 @@ public class Gen extends API.TargetGen {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Criar uma inStrucao que copia o valor ou conteudo do regiStrador para o
|
|
|
- * regiStrador 'r'
|
|
|
- *
|
|
|
- * @param inst
|
|
|
- * @param push
|
|
|
- * @param rt
|
|
|
- */
|
|
|
- protected Instruction Copy(Instruction inst, String rt) {
|
|
|
- Instruction c;
|
|
|
- if (inst.eq("p1value", "true")) {
|
|
|
- // andi Rt,Rs,immediate | Rt <-- [Rs] + ([I15]16 || [I15..0]);
|
|
|
- c = Copy(rt, Registers.R_ZERO, inst.G("p1"));
|
|
|
-
|
|
|
- } else {
|
|
|
- // addu Rd,Rs,Rt | Rd <-- [Rs] + [Rt];
|
|
|
- LoadParam(inst, "p1");
|
|
|
- c = CopyReg(inst.G("reg.p1"), rt);
|
|
|
- }
|
|
|
-// System.out.println("COPY::" + c);
|
|
|
- return c.S("tac.position", inst.G("block.position"));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public void TranslatePushParam(Instruction inst) {
|
|
|
// Tratado no metodo 'TranslateCall'
|
|
@@ -419,7 +316,7 @@ public class Gen extends API.TargetGen {
|
|
|
.S("comment", "pop param");
|
|
|
|
|
|
// System.out.println("POPpARAM:" + inst);
|
|
|
- LoadWord(inst.G("reg.p1"), Registers.R_FP, offset);
|
|
|
+// LoadWord(inst.G("reg.p1"), Registers.R_FP, offset);
|
|
|
} catch (Exception ex) {
|
|
|
Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
}
|
|
@@ -541,14 +438,15 @@ public class Gen extends API.TargetGen {
|
|
|
boolean call = getIR().Block().HasCall();
|
|
|
for (String reg : new String[]{Registers.R_FP, Registers.R_RA}) {
|
|
|
if (call) {
|
|
|
- LoadWord(reg, Registers.R_SP, data.Offset(reg))
|
|
|
- .S("comment", "e| restore " + reg);
|
|
|
+ LoadWord(reg, Registers.R_SP, data.Offset(reg)).S("comment", "e| restore " + reg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Desaloca a pilha
|
|
|
Copy(Registers.R_SP, Registers.R_SP, data.Size())
|
|
|
.S("comment", "e|pop stack frame");
|
|
|
+ CopyReg(Registers.R_SP, Registers.R_FP)
|
|
|
+ .S("comment", "e|pop stack frame");
|
|
|
|
|
|
// if (getIR().Block().HasCall()) {
|
|
|
Add(new Instruction("jr")
|
|
@@ -568,6 +466,249 @@ public class Gen extends API.TargetGen {
|
|
|
IndexedDest(inst);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void TranslateUnary(Instruction inst) throws Exception {
|
|
|
+ // Carrega o valor se nao esta em registrador
|
|
|
+// System.out.println("Translate Unary:" + inst);
|
|
|
+
|
|
|
+ switch (inst.G("op")) {
|
|
|
+ case "-": // Retorna o valor negado 10 -> -10
|
|
|
+
|
|
|
+ Add(new Instruction("subu")// Rd <-- [Rs] - [Rt];
|
|
|
+ .S("rd", inst.G("reg.dst"))
|
|
|
+ .S("rs", Registers.R_ZERO)
|
|
|
+ .S("rt", inst.G("reg.p1"))
|
|
|
+ .S("comment", "negation arith")
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ );
|
|
|
+ break;
|
|
|
+ case "!": // XOR ( 0 1 -> 1) XOR( 1 1 -> 0)
|
|
|
+ Add(new Instruction("xori") // Rt <-- [Rs] AND (016 || [I15..0]); ;
|
|
|
+ .S("rt", inst.G("reg.dst"))
|
|
|
+ .S("rs", inst.G("reg.p1"))
|
|
|
+ .S("offset", "1")
|
|
|
+ .S("comment", "negation bool")
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ );
|
|
|
+ break;
|
|
|
+// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
+//
|
|
|
+// case "&": // Copia do endereco da variavel
|
|
|
+// break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Traducao de intrucoeS do tipo
|
|
|
+ *
|
|
|
+ * - x = &a - copia do endereco de uma varaivel <br>
|
|
|
+ * - x = *b - x recebe o conteudo da variavel referenciada por b<br>
|
|
|
+ * - *x = y - conpia o conteudo de y para o endereco armazenado em x
|
|
|
+ *
|
|
|
+ * @param inst
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void TranslatePointerAssignment(Instruction inst) throws Exception {
|
|
|
+ String p1 = inst.G("p1"),
|
|
|
+ dst = inst.G("dst"),
|
|
|
+ regdst = inst.G("reg.dst"),
|
|
|
+ regp1 = inst.G("reg.p1");
|
|
|
+
|
|
|
+ switch (inst.G("op")) {
|
|
|
+
|
|
|
+ case "&": // Lendo o endereco de um ponteiro
|
|
|
+ Copy(regp1,
|
|
|
+ GlobalOrFrameRegister(p1),
|
|
|
+ getIR().Block().Data().Offset(p1)
|
|
|
+ )
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "copy address of " + p1);
|
|
|
+
|
|
|
+ System.out.println("PointerAssi&:" + inst);
|
|
|
+ // Se nao fez o store
|
|
|
+ if (StoreResult(inst, regp1, dst) == null) {
|
|
|
+ CopyReg(regp1, regdst);
|
|
|
+// .S("comment", "store content of " + regdst + " in " + dst);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "*": // Lendo o conteudo de um ponteiro
|
|
|
+ /**
|
|
|
+ * Carrega o valor contido no ponteiro<br>
|
|
|
+ * Utiliza o valor como endereço em um segundo load que carrega
|
|
|
+ * o dado<br>
|
|
|
+ * lw ${p1},12($fp)<br>
|
|
|
+ * lw ${dst},0(${p1}) $s<br>
|
|
|
+ */
|
|
|
+ LoadWord(regp1,
|
|
|
+ GlobalOrFrameRegister(p1),
|
|
|
+ getIR().Block().Data().Offset(p1))
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "load address stored in " + p1);
|
|
|
+
|
|
|
+ LoadWord(regdst,
|
|
|
+ regp1,
|
|
|
+ "0")
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "load content of address stored in " + regp1);
|
|
|
+ /*Se for a ultima operacao de escrita nessa variavel salva em memoria*/
|
|
|
+ Instruction store = StoreResult(inst, regdst, dst);
|
|
|
+ if (store != null) {
|
|
|
+ store.S("comment", "store content of " + regdst + " in " + dst);
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ default: // Atribuicao a um ponteiro
|
|
|
+ LoadParam(inst);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Carrega o valor dentro do endereco do ponteiro <br>
|
|
|
+ * lw ${p1},12(${fp|gp})<br>
|
|
|
+ * lw ${dst},0(${p1}) $s<br>
|
|
|
+ * conteudo da variavel referenciada
|
|
|
+ */
|
|
|
+ LoadWord(regdst,
|
|
|
+ GlobalOrFrameRegister(dst),
|
|
|
+ getIR().Block().Data().Offset(dst))
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "load address stored in " + dst);
|
|
|
+ // Grava o valor do registrador na memoria
|
|
|
+ StoreWord(regp1, regdst, "0")
|
|
|
+ .S("tac.position", inst.G("block.position"))
|
|
|
+ .S("comment", "store content of " + regp1 + " in *" + dst);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IvannosysTargetArch Export() {
|
|
|
+ Code Target = getTarget();
|
|
|
+ System.out.println(Target.GData());
|
|
|
+ String out = "", tmp;
|
|
|
+
|
|
|
+ Integer index;
|
|
|
+
|
|
|
+ for (Map.Entry<String, Block> x : Target.stmts.entrySet()) {
|
|
|
+ System.out.println(x.getValue().Data());
|
|
|
+ index = 0;
|
|
|
+ for (Instruction instr : x.getValue().Instructions()) {
|
|
|
+// System.out.println("Export:" + instr);
|
|
|
+ tmp = instr.G("inst.dec");
|
|
|
+ if (tmp.equals("")) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ out = out
|
|
|
+ // .concat(Integer.toHexString(index))
|
|
|
+ // .concat(":")
|
|
|
+ // .concat(String.format("%X\n", tmp.trim()) + "\n");
|
|
|
+ .concat(tmp + "\n");
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// System.out.println("Export:" + out);
|
|
|
+ // Grava resutlado no arquivo de memoria do simulador
|
|
|
+ Utils.WriteFile("\\src\\tools\\mips\\memory\\mi.memory", out);
|
|
|
+ try {
|
|
|
+ new tools.mips.MipsProcessor(new tools.mips.MipsSettings() {
|
|
|
+ {
|
|
|
+ debugmode = true;
|
|
|
+// stepByStep = true;
|
|
|
+ SetInstructionMemoryFile("\\src\\tools\\mips\\memory\\mi.memory");
|
|
|
+ SetDataMemoryFile("\\src\\tools\\mips\\memory\\md.memory");
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .SetBreak("6c")
|
|
|
+ .Run()
|
|
|
+ .Persist();
|
|
|
+ } catch (Exception ex) {
|
|
|
+ Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
|
+ }
|
|
|
+
|
|
|
+// public void CopyData(LinkedHashMap<String, Node> dst, LinkedHashMap<String, Node> src) throws Exception {
|
|
|
+ public void CopyData(DataFrame dst, DataFrame src) throws Exception {
|
|
|
+ Node value;
|
|
|
+ LinkedHashMap<String, Node> svalues = src.values(),
|
|
|
+ dvalues = dst.values();
|
|
|
+
|
|
|
+ for (Map.Entry<String, Node> x : svalues.entrySet()) {
|
|
|
+ value = x.getValue().copy();
|
|
|
+ value.S("size", value.getInt("size") * WORD_INC);
|
|
|
+// System.out.println("Copy:[" + x.getKey() + "][" + value.G("id") + "]" + value.G("size") + "\n" + value);
|
|
|
+// dvalues.put(x.getKey(), value);
|
|
|
+
|
|
|
+ dst.Set(x.getKey(), value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public IvannosysTargetArch SetTAC(Code tac) {
|
|
|
+ try {
|
|
|
+ this.IR = tac;
|
|
|
+
|
|
|
+ Init();
|
|
|
+
|
|
|
+ getTarget().AfterTranslateBlock("copy.dep", new CopyDeps(tac));
|
|
|
+
|
|
|
+// CopyData(target.GData().values(), IR.GData().values());
|
|
|
+ CopyData(
|
|
|
+ target.GData(),
|
|
|
+ tac.GData()
|
|
|
+ );
|
|
|
+
|
|
|
+ } catch (Exception ex) {
|
|
|
+ Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
+ }
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Criar uma inStrucao que copia o valor ou conteudo do regiStrador para o
|
|
|
+ * regiStrador 'r'
|
|
|
+ *
|
|
|
+ * @param inst
|
|
|
+ * @param push
|
|
|
+ * @param rt
|
|
|
+ */
|
|
|
+ protected Instruction Copy(Instruction inst, String rt) {
|
|
|
+ Instruction c;
|
|
|
+ if (inst.eq("p1value", "true")) {
|
|
|
+ // andi Rt,Rs,immediate | Rt <-- [Rs] + ([I15]16 || [I15..0]);
|
|
|
+ c = Copy(rt, Registers.R_ZERO, inst.G("p1"));
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // addu Rd,Rs,Rt | Rd <-- [Rs] + [Rt];
|
|
|
+ LoadParam(inst, "p1");
|
|
|
+ c = CopyReg(inst.G("reg.p1"), rt);
|
|
|
+ }
|
|
|
+// System.out.println("COPY::" + c);
|
|
|
+ return c.S("tac.position", inst.G("block.position"));
|
|
|
+ }
|
|
|
+
|
|
|
protected void IndexedRead(Instruction inst) {
|
|
|
// Se a fonte é indexada
|
|
|
if (inst.eq("src_indexed", "true")) {
|
|
@@ -589,8 +730,7 @@ public class Gen extends API.TargetGen {
|
|
|
}
|
|
|
rs = rd;
|
|
|
} // Carrega o conteudo enderecado em rt para rt
|
|
|
- LoadWord(rt, rs, offset)
|
|
|
- .S("tac.position", inst.G("block.position"));
|
|
|
+ LoadWord(rt, rs, offset).S("tac.position", inst.G("block.position"));
|
|
|
} catch (Exception ex) {
|
|
|
Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
}
|
|
@@ -744,26 +884,21 @@ public class Gen extends API.TargetGen {
|
|
|
}
|
|
|
|
|
|
protected Instruction StoreWord(String rt, String rs, String offset) {
|
|
|
- Instruction sw = new Instruction("sw").S("rt", rt).S("rs", rs).S("offset", offset);
|
|
|
- Add(sw);
|
|
|
-// Add(Noop());
|
|
|
- return sw;
|
|
|
+ return Add(new Instruction("sw")
|
|
|
+ .S("rt", rt)
|
|
|
+ .S("rs", rs)
|
|
|
+ .S("offset", offset));
|
|
|
}
|
|
|
|
|
|
protected Instruction LoadWord(String rt, String rs, int offset) {
|
|
|
-// System.out.println("LoadWord:" + rt + ":" + rs + ":" + "off:" + offset);
|
|
|
return LoadWord(rt, rs, "" + offset);
|
|
|
}
|
|
|
|
|
|
protected Instruction LoadWord(String rt, String rs, String offset) {
|
|
|
-// System.out.println("LoadWord:" + rt + ":" + rs + ":" + "off:" + offset);
|
|
|
- Instruction lw = new Instruction("lw") // lw $rt, imm($rs)
|
|
|
+ return Add(new Instruction("lw") // lw $rt, imm($rs)
|
|
|
.S("rt", rt)
|
|
|
.S("rs", rs)
|
|
|
- .S("offset", offset);
|
|
|
- Add(lw);
|
|
|
-// Add(Noop());
|
|
|
- return lw;
|
|
|
+ .S("offset", offset));
|
|
|
}
|
|
|
|
|
|
protected Instruction Noop() {
|
|
@@ -777,142 +912,6 @@ public class Gen extends API.TargetGen {
|
|
|
return Add(Noop());
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void TranslateUnary(Instruction inst) throws Exception {
|
|
|
- // Carrega o valor se nao esta em registrador
|
|
|
-// System.out.println("Translate Unary:" + inst);
|
|
|
-
|
|
|
- switch (inst.G("op")) {
|
|
|
- case "-": // Retorna o valor negado 10 -> -10
|
|
|
-
|
|
|
- Add(new Instruction("subu")// Rd <-- [Rs] - [Rt];
|
|
|
- .S("rd", inst.G("reg.dst"))
|
|
|
- .S("rs", Registers.R_ZERO)
|
|
|
- .S("rt", inst.G("reg.p1"))
|
|
|
- .S("comment", "negation arith")
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- );
|
|
|
- break;
|
|
|
- case "!": // XOR ( 0 1 -> 1) XOR( 1 1 -> 0)
|
|
|
- Add(new Instruction("xori") // Rt <-- [Rs] AND (016 || [I15..0]); ;
|
|
|
- .S("rt", inst.G("reg.dst"))
|
|
|
- .S("rs", inst.G("reg.p1"))
|
|
|
- .S("offset", "1")
|
|
|
- .S("comment", "negation bool")
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- );
|
|
|
- break;
|
|
|
-// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;// case "*": // Copia do conteudo do ponteiro
|
|
|
-//
|
|
|
-// case "&": // Copia do endereco da variavel
|
|
|
-// break;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Traducao de intrucoeS do tipo
|
|
|
- *
|
|
|
- * - x = &a - copia do endereco de uma varaivel <br>
|
|
|
- * - x = *b - x recebe o conteudo da variavel referenciada por b<br>
|
|
|
- * - *x = y - conpia o conteudo de y para o endereco armazenado em x
|
|
|
- *
|
|
|
- * @param inst
|
|
|
- * @throws Exception
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void TranslatePointerAssignment(Instruction inst) throws Exception {
|
|
|
- String p1 = inst.G("p1"),
|
|
|
- dst = inst.G("dst"),
|
|
|
- regdst = inst.G("reg.dst"),
|
|
|
- regp1 = inst.G("reg.p1");
|
|
|
-
|
|
|
- switch (inst.G("op")) {
|
|
|
-
|
|
|
- case "&": // Lendo o endereco de um ponteiro
|
|
|
- Copy(regp1,
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
- getIR().Block().Data().Offset(p1)
|
|
|
- )
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "copy address of " + p1);
|
|
|
-
|
|
|
- System.out.println("PointerAssi&:" + inst);
|
|
|
- // Se nao fez o store
|
|
|
- if (StoreResult(inst, regp1, dst) == null) {
|
|
|
- CopyReg(regp1, regdst);
|
|
|
-// .S("comment", "store content of " + regdst + " in " + dst);
|
|
|
- }
|
|
|
- break;
|
|
|
- case "*": // Lendo o conteudo de um ponteiro
|
|
|
- /**
|
|
|
- * Carrega o valor contido no ponteiro<br>
|
|
|
- * Utiliza o valor como endereço em um segundo load que carrega
|
|
|
- * o dado<br>
|
|
|
- * lw ${p1},12($fp)<br>
|
|
|
- * lw ${dst},0(${p1}) $s<br>
|
|
|
- */
|
|
|
- LoadWord(regp1,
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
- getIR().Block().Data().Offset(p1))
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "load address stored in " + p1);
|
|
|
-
|
|
|
- LoadWord(regdst,
|
|
|
- regp1,
|
|
|
- "0")
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "load content of address stored in " + regp1);
|
|
|
- /*Se for a ultima operacao de escrita nessa variavel salva em memoria*/
|
|
|
- Instruction store = StoreResult(inst, regdst, dst);
|
|
|
- if (store != null) {
|
|
|
- store.S("comment", "store content of " + regdst + " in " + dst);
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- default: // Atribuicao a um ponteiro
|
|
|
- LoadParam(inst);
|
|
|
-
|
|
|
- /**
|
|
|
- * Carrega o valor dentro do endereco do ponteiro <br>
|
|
|
- * lw ${p1},12(${fp|gp})<br>
|
|
|
- * lw ${dst},0(${p1}) $s<br>
|
|
|
- * conteudo da variavel referenciada
|
|
|
- */
|
|
|
- LoadWord(regdst,
|
|
|
- GlobalOrFrameRegister(dst),
|
|
|
- getIR().Block().Data().Offset(dst))
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "load address stored in " + dst);
|
|
|
- // Grava o valor do registrador na memoria
|
|
|
- StoreWord(regp1, regdst, "0")
|
|
|
- .S("tac.position", inst.G("block.position"))
|
|
|
- .S("comment", "store content of " + regp1 + " in *" + dst);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
protected Instruction Add(Instruction inst) {
|
|
|
try {
|
|
@@ -962,4 +961,85 @@ public class Gen extends API.TargetGen {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void TranslateLoad(Instruction inst) throws Exception {
|
|
|
+// System.out.println("TranslateLoad:" + inst);
|
|
|
+
|
|
|
+ String addr = inst.G("p1");
|
|
|
+
|
|
|
+// System.out.println("Load " + addr + " on block ");
|
|
|
+ LoadWord(
|
|
|
+ inst.G("reg.p1"),
|
|
|
+ GlobalOrFrameRegister(addr),
|
|
|
+ getTarget().Block().Data().Offset(addr)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void TranslateStore(Instruction inst) throws Exception {
|
|
|
+ String addr = inst.G("p1");
|
|
|
+
|
|
|
+// System.out.println("Store " + addr + " on block ");
|
|
|
+ StoreWord(
|
|
|
+ inst.G("reg.p1"),
|
|
|
+ GlobalOrFrameRegister(addr),
|
|
|
+ getTarget().Block().Data().Offset(addr)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+// 00000000 <main>:
|
|
|
+// 0: 0666763252 addiu sp,sp,-12 --p| push stack frame
|
|
|
+// 4: 0001962017 addu fp,zero,sp --p|copy fp ← sp
|
|
|
+// 8: 0605028352 addiu s0,zero,0 .0.--copy _V1 ← 0
|
|
|
+// c: 2949644288 sw s0,fp,0
|
|
|
+//10: 0605093890 addiu s1,zero,2 .2.--copy _V2 ← 2
|
|
|
+//14: 2949709828 sw s1,fp,4
|
|
|
+//18: 0605159424 addiu s2,zero,0 .4.--copy _V3 ← 0
|
|
|
+//1c: 2949775368 sw s2,fp,8
|
|
|
+//20: 0134217750 j 58 <main+0x58> .6.
|
|
|
+//24: 2412969988 lw s3,fp,4
|
|
|
+//28: 0001253409 addu a0,zero,s3 .8.--push param
|
|
|
+//2c: 0201326621 jal 74 <bitCount+0x0> .9.--jump to <bitCount>
|
|
|
+//30: 0000153633 addu t3,zero,v0 --copy t3 ← v0
|
|
|
+//34: 2413035520 lw s4,fp,0
|
|
|
+//38: 0042704929 addu s4,s4,t3 .12.
|
|
|
+//3c: 2949906432 sw s4,fp,0
|
|
|
+//40: 2413101060 lw s5,fp,4
|
|
|
+//44: 0649396225 addiu s5,s5,1 .15.
|
|
|
+//48: 2949971972 sw s5,fp,4
|
|
|
+//4c: 2413166600 lw s6,fp,8
|
|
|
+//50: 0651558913 addiu s6,s6,1 .18.
|
|
|
+//54: 2950037512 sw s6,fp,8
|
|
|
+//58: 2413232136 lw s7,fp,8
|
|
|
+//5c: 0604897282 addiu t6,zero,2 .21.
|
|
|
+//60: 0049156131 subu v0,s7,t6 .21.
|
|
|
+//64: 0071368687 bltz v0,24 <main+0x24> .21.--branch if register < 0
|
|
|
+//68: 2412773376 lw s0,fp,0
|
|
|
+//6c: 0001052705 addu v0,zero,s0 .23.--push return
|
|
|
+//70: 4294967295 stop --end of programa
|
|
|
+// 00000074 <bitCount>:
|
|
|
+//74: 0666763256 addiu sp,sp,-8 --p| push stack frame
|
|
|
+//78: 0001962017 addu fp,zero,sp --p|copy fp ← sp
|
|
|
+//7c: 2948857856 sw a0,fp,0 .0.--pop param
|
|
|
+//80: 0605093888 addiu s1,zero,0 .1.--copy _V5 ← 0
|
|
|
+//84: 2949709828 sw s1,fp,4
|
|
|
+//88: 2412773376 lw s0,fp,0
|
|
|
+//8c: 0033558563 subu v0,s0,zero .4.
|
|
|
+//90: 0406847500 blez v0,c4 <bitCount+0x50> .4.--branch if register <= 0
|
|
|
+//94: 2412904452 lw s2,fp,4
|
|
|
+//98: 0642908161 addiu s2,s2,1 .6.
|
|
|
+//9c: 2949775364 sw s2,fp,4
|
|
|
+//a0: 2412969984 lw s3,fp,0
|
|
|
+//a4: 0604700673 addiu t3,zero,1 .9.
|
|
|
+//a8: 0040591395 subu t4,s3,t3 .9.
|
|
|
+//ac: 2412969984 lw s3,fp,0
|
|
|
+//b0: 0040671268 and s3,s3,t4 .11.
|
|
|
+//b4: 2949840896 sw s3,fp,0
|
|
|
+//b8: 2412969984 lw s3,fp,0
|
|
|
+//bc: 0308281345 beq zero,s3,c4 <bitCount+0x50> .14.--branch if equals
|
|
|
+//c0: 0134217765 j 94 <bitCount+0x20> .15.
|
|
|
+//c4: 2413035524 lw s4,fp,4
|
|
|
+//c8: 0001314849 addu v0,zero,s4 .42.--push return
|
|
|
+//cc: 0666697736 addiu sp,sp,8 --e|pop stack frame
|
|
|
+//d0: 0065011720 jr ra --e|return
|