|
@@ -5,9 +5,7 @@
|
|
|
*/
|
|
|
package targets.mips;
|
|
|
|
|
|
-import API.Utils;
|
|
|
import ast.Node;
|
|
|
-import common.Block;
|
|
|
import common.Code;
|
|
|
import common.DataFrame;
|
|
|
import common.Instruction;
|
|
@@ -31,7 +29,7 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
protected HashMap<String, String> AddressCalculated = new HashMap<>();
|
|
|
// protected AllocatorMipsProcessor allocation = new AllocatorMipsProcessor();
|
|
|
- protected HashMap<String, String> formatMips = new HashMap<String, String>() {
|
|
|
+ public static HashMap<String, String> formatMips = new HashMap<String, String>() {
|
|
|
{
|
|
|
String base = "{[HEX(global.position,_addressLen,' ')]': '}{[INSTDEC()]}{[T(1)]}{[inst]}' '",
|
|
|
// String base = "{[HEX(global.position,_addressLen,' ')]': '}{[INSTHEX()]}{[T(1)]}{[inst]}' '",
|
|
@@ -76,7 +74,6 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
public Gen() {
|
|
|
super("mips");
|
|
|
-
|
|
|
}
|
|
|
|
|
|
public void Init() {
|
|
@@ -99,37 +96,21 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
@Override
|
|
|
public void TranslateLabel(Instruction inst) {
|
|
|
+
|
|
|
Add(new Instruction()
|
|
|
.S("type", "label")
|
|
|
.S("format", "norender")
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("label", inst.G("label")));
|
|
|
+
|
|
|
getTarget().RegisterLabelAddress(inst.G("label"));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void TranslateCopy(Instruction inst) throws Exception {
|
|
|
-
|
|
|
- //Se o valor deve ser armazenado em memoria
|
|
|
-// 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
|
|
@@ -149,8 +130,10 @@ public class Gen extends API.TargetGen {
|
|
|
// System.out.println("Assign:" + inst);
|
|
|
|
|
|
if (inst.eq("p2value", "true")) {
|
|
|
+ String op = inst.G("op");
|
|
|
+
|
|
|
LoadParam(inst, "p1");
|
|
|
- ninst.S("offset", inst.G("p2"))
|
|
|
+ ninst.S("offset", (op.equals("-") ? "-" : "") + inst.G("p2"))
|
|
|
.S("rs", inst.G("reg.p1"));
|
|
|
} else {
|
|
|
LoadParam(inst, "p2");
|
|
@@ -190,20 +173,18 @@ public class Gen extends API.TargetGen {
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
);
|
|
|
}
|
|
|
-
|
|
|
- // Gravar na memoria?
|
|
|
-// System.out.println("ASSIGN:" + inst);
|
|
|
- StoreResult(inst, rd, dst);
|
|
|
+// StoreResult(inst, rd, dst);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void TranslateJump(Instruction inst) {
|
|
|
+ public void TranslateJump(Instruction inst) throws Exception {
|
|
|
Add(new Instruction("J", "j")
|
|
|
.copy("label", inst)
|
|
|
.S("comment", inst.getText())
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
);
|
|
|
- Noop();
|
|
|
+
|
|
|
+ AddNop();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -242,6 +223,7 @@ public class Gen extends API.TargetGen {
|
|
|
// Restaura o array de registradores de retorno para fazer o pop dos returns
|
|
|
ResetReturnArgs();
|
|
|
|
|
|
+ AddNop();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -287,7 +269,7 @@ public class Gen extends API.TargetGen {
|
|
|
CopyReg(reg, inst.G("reg.p1"));
|
|
|
} else {
|
|
|
StoreWord(reg,
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
+ FrameRegister(p1),
|
|
|
getTarget().Block().Data().Offset(p1));
|
|
|
}
|
|
|
|
|
@@ -307,7 +289,7 @@ public class Gen extends API.TargetGen {
|
|
|
// System.out.println("PopParams:" + inst);
|
|
|
int offset = getTarget().Block().Data().Offset(p1);
|
|
|
StoreWord(returnRegisters.remove(2),
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
+ FrameRegister(p1),
|
|
|
offset)
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("comment", "pop param");
|
|
@@ -358,8 +340,12 @@ public class Gen extends API.TargetGen {
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("comment", comments.get(instruction));
|
|
|
|
|
|
-// Noop();
|
|
|
-// System.out.println("Translate branch:" + I);
|
|
|
+ AddNop();
|
|
|
+ // System.out.println("Translate branch:" + I);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected void AddNop() throws Exception {
|
|
|
+ Add(Mips.Instruction("nop").copy());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -384,7 +370,7 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
// Aloca o espaco da pilha
|
|
|
Instruction alloc = Copy(Registers.R_SP, Registers.R_SP, "-" + data.Size())
|
|
|
- .S("comment", "p| push stack frame");
|
|
|
+ .S("comment", "prolog| push stack frame");
|
|
|
|
|
|
if (!getTarget().Block().getName().equals("main")) {
|
|
|
// Restaura o fp
|
|
@@ -403,7 +389,7 @@ public class Gen extends API.TargetGen {
|
|
|
newvars -= WORD_INC;
|
|
|
|
|
|
StoreWord(reg, Registers.R_SP, data.Offset(reg))
|
|
|
- .S("comment", "p| backup " + reg);
|
|
|
+ .S("comment", "prolog| backup " + reg);
|
|
|
}
|
|
|
|
|
|
alloc.somar("offset", newvars);
|
|
@@ -413,7 +399,7 @@ public class Gen extends API.TargetGen {
|
|
|
// System.out.println("Activation Registry:()\n" + data);
|
|
|
if (alloc.getInt("offset", 0) != 0) {
|
|
|
// Copia o sp para o fp
|
|
|
- CopyReg(Registers.R_SP, Registers.R_FP).Prepend("comment", "p|");
|
|
|
+ CopyReg(Registers.R_SP, Registers.R_FP).Prepend("comment", "prolog|");
|
|
|
ResetReturnArgs();
|
|
|
} else {
|
|
|
getTarget().Block().Remove(alloc);
|
|
@@ -435,23 +421,23 @@ 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", "epilog| restore " + reg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Desaloca a pilha
|
|
|
Copy(Registers.R_SP, Registers.R_SP, data.Size())
|
|
|
- .S("comment", "e|pop stack frame");
|
|
|
+ .S("comment", "epilog|pop stack frame");
|
|
|
CopyReg(Registers.R_SP, Registers.R_FP)
|
|
|
- .S("comment", "e|pop stack frame");
|
|
|
+ .S("comment", "epilog|pop stack frame");
|
|
|
|
|
|
// if (getIR().Block().HasCall()) {
|
|
|
Add(new Instruction("jr")
|
|
|
.S("rs", Registers.R_RA)
|
|
|
- .S("comment", "e|return"));
|
|
|
+ .S("comment", "epilog|return"));
|
|
|
// }[]
|
|
|
} else {
|
|
|
- Add(new Instruction("stop").S("txt", "11111111111111111111111111111111").S("comment", "end of programa"));
|
|
|
+ Add(Mips.Instruction("stop").copy());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -517,6 +503,30 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void TranslateLoad(Instruction inst) throws Exception {
|
|
|
+ String addr = inst.G("p1");
|
|
|
+
|
|
|
+// System.out.println("Load " + addr + " on block ");
|
|
|
+ LoadWord(
|
|
|
+ inst.G("reg.p1"),
|
|
|
+ FrameRegister(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"),
|
|
|
+ FrameRegister(addr),
|
|
|
+ getTarget().Block().Data().Offset(addr)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Traducao de intrucoeS do tipo
|
|
|
*
|
|
@@ -538,7 +548,7 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
case "&": // Lendo o endereco de um ponteiro
|
|
|
Copy(regp1,
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
+ FrameRegister(p1),
|
|
|
getIR().Block().Data().Offset(p1)
|
|
|
)
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
@@ -546,10 +556,10 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
System.out.println("PointerAssi&:" + inst);
|
|
|
// Se nao fez o store
|
|
|
- if (StoreResult(inst, regp1, dst) == null) {
|
|
|
- CopyReg(regp1, regdst);
|
|
|
+// 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
|
|
|
/**
|
|
@@ -560,7 +570,7 @@ public class Gen extends API.TargetGen {
|
|
|
* lw ${dst},0(${p1}) $s<br>
|
|
|
*/
|
|
|
LoadWord(regp1,
|
|
|
- GlobalOrFrameRegister(p1),
|
|
|
+ FrameRegister(p1),
|
|
|
getIR().Block().Data().Offset(p1))
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("comment", "load address stored in " + p1);
|
|
@@ -570,12 +580,12 @@ public class Gen extends API.TargetGen {
|
|
|
"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);
|
|
|
- }
|
|
|
|
|
|
+ /*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);
|
|
@@ -587,7 +597,7 @@ public class Gen extends API.TargetGen {
|
|
|
* conteudo da variavel referenciada
|
|
|
*/
|
|
|
LoadWord(regdst,
|
|
|
- GlobalOrFrameRegister(dst),
|
|
|
+ FrameRegister(dst),
|
|
|
getIR().Block().Data().Offset(dst))
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("comment", "load address stored in " + dst);
|
|
@@ -599,54 +609,6 @@ public class Gen extends API.TargetGen {
|
|
|
|
|
|
}
|
|
|
|
|
|
- @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;
|
|
@@ -701,7 +663,6 @@ public class Gen extends API.TargetGen {
|
|
|
LoadParam(inst, "p1");
|
|
|
c = CopyReg(inst.G("reg.p1"), rt);
|
|
|
}
|
|
|
-// System.out.println("COPY::" + c);
|
|
|
return c.S("tac.position", inst.G("block.position"));
|
|
|
}
|
|
|
|
|
@@ -712,7 +673,7 @@ public class Gen extends API.TargetGen {
|
|
|
int offset = getTarget().Block().Data().Offset(inst.G("p1"));
|
|
|
String p1 = inst.G("p1"),
|
|
|
rt = inst.G("reg.p1"),
|
|
|
- rs = GlobalOrFrameRegister(p1);
|
|
|
+ rs = FrameRegister(p1);
|
|
|
// System.out.println("Indexed read:" + inst);
|
|
|
if (!inst.isNumber("p1.indice")) {
|
|
|
String rd = inst.G("reg.p1.indice");
|
|
@@ -727,6 +688,9 @@ 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"));
|
|
|
+
|
|
|
+ AddNop();
|
|
|
+
|
|
|
} catch (Exception ex) {
|
|
|
Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
}
|
|
@@ -757,7 +721,7 @@ public class Gen extends API.TargetGen {
|
|
|
// deve ser armazenado
|
|
|
|
|
|
String dst = inst.G("dst"),
|
|
|
- rs = GlobalOrFrameRegister(dst),
|
|
|
+ rs = FrameRegister(dst),
|
|
|
comment;
|
|
|
int offset = getTarget().Block().Data().Offset(dst);
|
|
|
if (dstIndexed) {
|
|
@@ -783,6 +747,11 @@ public class Gen extends API.TargetGen {
|
|
|
StoreWord(regp1, rs, offset)
|
|
|
.S("tac.position", inst.G("block.position"))
|
|
|
.S("comment", comment);
|
|
|
+
|
|
|
+ Instruction n = Next();
|
|
|
+ if (n != null && (n.eq("rs", regp1) || n.eq("rts", regp1))) {
|
|
|
+ AddNop();
|
|
|
+ }
|
|
|
} catch (Exception ex) {
|
|
|
Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
}
|
|
@@ -832,7 +801,7 @@ public class Gen extends API.TargetGen {
|
|
|
try {
|
|
|
Ninst.S("inst", "lw") // R[$rt] ← Mem4B(R[$rs] + SignExt16b(imm))
|
|
|
.S("rt", inst.G("reg." + param))
|
|
|
- .S("rs", GlobalOrFrameRegister(pname))
|
|
|
+ .S("rs", FrameRegister(pname))
|
|
|
.S("comment", "load address stored in " + pname)
|
|
|
.set("offset", getTarget().Block().Data().Offset(pname));
|
|
|
} catch (Exception ex) {
|
|
@@ -875,37 +844,43 @@ public class Gen extends API.TargetGen {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- protected Instruction StoreWord(String rt, String rs, int offset) {
|
|
|
+ protected Instruction StoreWord(String rt, String rs, int offset) throws Exception {
|
|
|
return StoreWord(rt, rs, "" + offset);
|
|
|
}
|
|
|
|
|
|
- protected Instruction StoreWord(String rt, String rs, String offset) {
|
|
|
- return Add(new Instruction("sw")
|
|
|
+ protected Instruction StoreWord(String rt, String rs, String offset) throws Exception {
|
|
|
+ Instruction n = Next();
|
|
|
+
|
|
|
+ Instruction sw = Add(new Instruction("sw")
|
|
|
.S("rt", rt)
|
|
|
.S("rs", rs)
|
|
|
.S("offset", offset));
|
|
|
+
|
|
|
+ // System.out.println("N:" + n);
|
|
|
+ // Se a proxima instrução depende do valor armazenado
|
|
|
+ if (n != null && (n.eq("reg.p1", rt) || n.eq("reg.p2", rt))) {
|
|
|
+ AddNop();
|
|
|
+ }
|
|
|
+ return sw;
|
|
|
}
|
|
|
|
|
|
- protected Instruction LoadWord(String rt, String rs, int offset) {
|
|
|
+ protected Instruction LoadWord(String rt, String rs, int offset) throws Exception {
|
|
|
return LoadWord(rt, rs, "" + offset);
|
|
|
}
|
|
|
|
|
|
- protected Instruction LoadWord(String rt, String rs, String offset) {
|
|
|
- return Add(new Instruction("lw") // lw $rt, imm($rs)
|
|
|
+ protected Instruction LoadWord(String rt, String rs, String offset) throws Exception {
|
|
|
+ Instruction n = Next();
|
|
|
+
|
|
|
+ Instruction lw = Add(new Instruction("lw") // lw $rt, imm($rs)
|
|
|
.S("rt", rt)
|
|
|
.S("rs", rs)
|
|
|
.S("offset", offset));
|
|
|
- }
|
|
|
|
|
|
- protected Instruction Noop() {
|
|
|
- return new Instruction("sll")
|
|
|
- .S("rs", "zero")
|
|
|
- .S("rt", "zero")
|
|
|
- .S("rd", "zero");
|
|
|
- }
|
|
|
-
|
|
|
- protected Instruction AddNoop() {
|
|
|
- return Add(Noop());
|
|
|
+ // Se a proxima instrução depende do valor armazenado
|
|
|
+ if (n != null && (n.eq("reg.p1", rt) || n.eq("reg.p2", rt))) {
|
|
|
+ AddNop();
|
|
|
+ }
|
|
|
+ return lw;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -922,28 +897,14 @@ public class Gen extends API.TargetGen {
|
|
|
.getName()).log(Level.SEVERE, null, ex);
|
|
|
}
|
|
|
|
|
|
+// System.out.println("Add:" + inst);
|
|
|
return super.Add(inst); //To change body of generated methods, choose Tools | Templates.
|
|
|
}
|
|
|
|
|
|
- protected String GlobalOrFrameRegister(String var) {
|
|
|
-// System.out.println("GlobalOrFrameRegister:" + var);
|
|
|
+ protected String FrameRegister(String var) {
|
|
|
return var.contains("_G") ? Registers.R_GP : Registers.R_FP;
|
|
|
}
|
|
|
|
|
|
- protected Instruction StoreResult(Instruction inst, String rd, String dst) {
|
|
|
- if (inst.eq("reg.dst.store", "true")) {
|
|
|
- try {
|
|
|
- return StoreWord(rd,
|
|
|
- GlobalOrFrameRegister(dst),
|
|
|
- getTarget().Block().Data().Offset(dst)
|
|
|
- ).S("tac.position", inst.G("block.position"));
|
|
|
- } catch (Exception ex) {
|
|
|
- Logger.getLogger(Gen.class.getName()).log(Level.SEVERE, null, ex);
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
private void ResetReturnArgs() {
|
|
|
returnRegisters = new ArrayList<String>() {
|
|
|
{
|
|
@@ -957,85 +918,4 @@ 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
|