Browse Source

basic blocks

eugeniucarvalho 5 years ago
parent
commit
fd7fc2f559

BIN
build/classes/target/mips/AllocatorMipsProcessor.class


BIN
build/classes/target/mips/Gen$3.class


BIN
build/classes/target/mips/Gen$4.class


BIN
build/classes/target/mips/Gen.class


BIN
build/classes/tools/mips/MipsProcessor.class


+ 25 - 27
build/classes/tools/mips/memory/md.memory

@@ -1,27 +1,27 @@
-0000:	1
-0004:	2
-0008:	3
-0012:	4
-0016:	1
-0020:	2
-0024:	3
-0028:	4
+0000:	0
+0004:	0
+0008:	0
+0012:	0
+0016:	0
+0020:	0
+0024:	0
+0028:	0
 0032:	0
 0036:	0
 0040:	0
 0044:	0
-0048:	3
-0052:	4
-0056:	5
-0060:	6
-0064:	3
-0068:	4
-0072:	5
-0076:	6
-0080:	69
-0084:	80
-0088:	93
-0092:	108
+0048:	0
+0052:	0
+0056:	0
+0060:	0
+0064:	0
+0068:	0
+0072:	0
+0076:	0
+0080:	0
+0084:	0
+0088:	0
+0092:	0
 0096:	0
 0100:	0
 0104:	0
@@ -4089,10 +4089,8 @@
 16352:	0
 16356:	0
 16360:	0
-16364:	-37131
-16368:	-18559
-16372:	9464
-16376:	-18572
-16380:	0
-16370:	7
-16366:	2
+16364:	-18554
+16368:	0
+16372:	0
+16376:	-18552
+16380:	10

+ 15 - 8
build/classes/tools/mips/memory/mi.memory

@@ -1,25 +1,27 @@
 0666763252
 0001962017
+0605028352
 2949644288
-0605140852
+0605103888
 2949709828
+0605159424
 2949775368
-0134217748
+0134217750
 2412969988
 0001253409
-0201326619
+0201326621
 0000153633
 2413035520
 0042704929
 2949906432
 2413101060
-0649396237
+0649396226
 2949971972
 2413166600
 0651558913
 2950037512
 2413232136
-0604906744
+0604897290
 0049156131
 0071368687
 2412773376
@@ -28,20 +30,25 @@
 0666763256
 0001962017
 2948857856
-2412773376
+0605093888
 2949709828
+2412773376
 0033558563
-0406847497
+0406847500
 2412904452
 0642908161
 2949775364
 2412969984
 0604700673
 0040591395
+2412969984
 0040671268
+2949840896
+2412969984
 0308281345
-0134217762
+0134217765
 2413035524
 0001314849
 0666697736
+0001962017
 0065011720

+ 7 - 1
src/API/TargetGen.java

@@ -5,9 +5,9 @@
  */
 package API;
 
-import common.Instruction;
 import common.Block;
 import common.Code;
+import common.Instruction;
 import common.IvannosysTargetArch;
 import java.util.Map;
 import java.util.logging.Level;
@@ -175,6 +175,12 @@ public abstract class TargetGen implements IvannosysTargetArch {
                 case "pointer_assign":
                     TranslatePointerAssignment(inst);
                     break;
+                case "store":
+                    TranslateStore(inst);
+                    break;
+                case "load":
+                    TranslateLoad(inst);
+                    break;
                 default:
                     throw new Exception(String.format("TAC instruction type '%s' not defined", inst.G("type")));
             }

+ 5 - 1
src/IntermediaryCode/BlockBaseGroup.java

@@ -108,7 +108,11 @@ public class BlockBaseGroup {
     }
 
     public BlockBaseOcorrences getBasicBlocks(Integer i) {
-        return bbs.get(currentIndex + i);
+        int index = currentIndex + i;
+        if (index > bbs.size() - 1) {
+            return null;
+        }
+        return bbs.get(index);
 
     }
 

+ 6 - 4
src/IntermediaryCode/BlockBaseOcorrences.java

@@ -81,6 +81,7 @@ public class BlockBaseOcorrences {
     }
 
     protected void CloseAllIntervals() {
+        LastPosition = Position;
 //        System.out.println("CloseAllIntervals:");
         for (Map.Entry<String, LinkedList<Interval>> x : intervals.entrySet()) {
             interval = x.getValue().peekLast();
@@ -91,7 +92,6 @@ public class BlockBaseOcorrences {
                 interval.Close(ocorrences.get(x.getKey()).peekLast());
             }
         }
-
     }
 
     void Register(Instruction x, String attr) {
@@ -210,9 +210,10 @@ public class BlockBaseOcorrences {
 
     @Override
     public String toString() {
-        StringBuilder buffer = new StringBuilder("Block: " + name + "\n");
+        StringBuilder buffer = new StringBuilder("Block: " + name + " - Leader: " + leader + " - Size: " + Position + "\n");
         buffer.append("Inst/Var   ");
-        for (int i = 0; i <= LastPosition; i++) {
+//        for (int i = 0; i <= Position; i++) {
+        for (int i = 0; i < Position; i++) {
             buffer.append(Utils.Pad(i + "", " ", "-", 3));
         }
         buffer.append("\n");
@@ -223,7 +224,8 @@ public class BlockBaseOcorrences {
             var = x.getKey();
             buffer.append(Utils.Pad(var, " ", "-", 11));
 
-            for (int i = 0; i <= LastPosition; i++) {
+//            for (int i = 0; i <= Position; i++) {
+            for (int i = 0; i < Position; i++) {
 //                System.out.println("OCOR:" +);
                 reg = "";
                 append = "---";

+ 33 - 3
src/IntermediaryCode/IRGenerator.java

@@ -124,6 +124,7 @@ public final class IRGenerator implements IRGenInterface {
                         put("pointer_assign", base + "{[dst.pointer]}{[dst]' := '}{[op]}{[p1]}{' --'[comment]}" + end);
                         put("unary", base + " {[dst]} ' := '{[op]' '}{[p1]} {' --'[comment]}" + end);
                         put("copy", base + " {[dst]} ' := '{[p1]} {' --'[comment]}" + end);
+                        put("memory", base + " {[type]} ' '{[p1]} {' --'[comment]}" + end);
                         put("jump", base + " 'goto ' {'<'[label]'>'} {' --'[comment]}" + end);
                         put("branch", base + " 'if '{[p1]} {' '[op]' '} {[p2]} ' goto ' {'<'[label]'>'} {' --'[comment]}" + end);
                         put("call", base + " {[dst]' := '} 'call <' {[funcname]} '>, ' {[nump]} {' --'[comment]}" + end);
@@ -1170,12 +1171,41 @@ public final class IRGenerator implements IRGenInterface {
         return r1;
     }
 
+    protected Instruction Store(String attr) throws Exception {
+        return code.Add(new Instruction().S("type", "store").S("format", "memory").S("p1", attr));
+    }
+
+    protected Instruction Load(String attr) throws Exception {
+        return code.Add(new Instruction().S("type", "load").S("format", "memory").S("p1", attr));
+    }
+
     protected Instruction Add(Instruction i) throws Exception {
 
-        return code.Add(
-                i.S("inloop", "" + loopScope.peek())
+//        System.out.println("ADD:" + i);
+        String loop = "" + loopScope.peek();
+
+        boolean ignoreLoadStore = !i.in("type", new String[]{"jump", "goto", "label", "pop_param", "pop_return"});
+
+        // Inseri a carga dos parametros
+        if (ignoreLoadStore) {
+            for (String param : new String[]{"p1", "p2"}) {
+                if (i.Has(param)
+                        && !i.contem(param, "_T")
+                        && i.eq(param + "value", "false")) {
+
+                    Load(i.G(param)).S("inloop", loop);
+                }
+            }
+        }
+        // Adiciona a instrução
+        code.Add(i.S("inloop", loop));
+
+        if (i.Has("dst") && !i.contem("dst", "_T")) {
+            Store(i.G("dst")).S("inloop", loop);
+        }
+
         //                .S("basicBlock", basicBlock.peek() + "." + basicBlockCount.peek())
-        );
+        return i;
     }
 
     protected Instruction Branch(Node n, int index) throws Exception {

+ 66 - 15
src/IntermediaryCode/RemoveUnusedLabelsProcessor.java

@@ -21,21 +21,27 @@ import java.util.LinkedList;
  */
 class RemoveUnusedLabelsProcessor implements CodeProcessing {
 
+    protected HashMap<String, HashMap<String, ArrayList<Instruction>>> labelMap = new HashMap<>();
+    protected String currentBlock;
+    private Block block;
+
     public RemoveUnusedLabelsProcessor() {
+
     }
 
     @Override
     public void Exec(Code c, LinkedHashMap<String, CodeProcessing> cp) throws Exception {
         String label;
         Instruction instruction = null;
-        Block block = c.Block();
+        block = c.Block();
+        currentBlock = block.getName();
 
         HashMap<String, Integer> rc = c.labelsReferenceCount;
         LinkedList<Instruction> instructions = block.Instructions();
         ArrayList<Instruction> remover = new ArrayList();
         Iterator<Instruction> interator = instructions.iterator();
         String[] ignore = new String[]{"block", "user"};
-        Instruction branch = null, last;
+        Instruction branch = null, last = null;
         int position = 0;
 
         System.out.println("block:" + block.getName() + "-------------------------------");
@@ -53,7 +59,8 @@ class RemoveUnusedLabelsProcessor implements CodeProcessing {
             }
 
             if (position == 3 && branch != null && last.eq("type", "jump")) {
-                System.out.println(":" + branch + last);
+
+//                System.out.println(":" + branch + last);
                 branch.S("op", Utils.ComplementOperation(branch.G("op")))
                         .S("label", last.G("label"));
                 branch = null;
@@ -63,22 +70,13 @@ class RemoveUnusedLabelsProcessor implements CodeProcessing {
 //                interator.remove(last);
                 remover.add(last);
                 remover.add(instruction);
-                
-//                System.out.println("'ERA UMA LABEL:" + instruction);
+
                 continue;
             }
-//            if (position == 1 //                    && instruction.eq("type", "label") //                    && (last != null && last.eq("type", "jump"))
-//                    ) {
-//
-////
-////                instructions.remove(last);
-////                instructions.remove(instruction);
-////
-////                continue;
-//            }
 
             if (!instruction.eq("type", "label") || instruction.in("label_type", ignore)) {
                 continue;
+                // Unifica labels sequenciais e atualiza as chamadas dos outros labels
             }
 
             label = instruction.G("label");
@@ -88,8 +86,61 @@ class RemoveUnusedLabelsProcessor implements CodeProcessing {
         }
 
 //        System.out.println("Remover:" + remover);
-        for (Instruction r : remover) {
+        Instruction r;
+        while (!remover.isEmpty()) {
+            r = remover.remove(0);
+            instructions.remove(r);
+        }
+
+        // Remove labels sequenciais
+        for (Instruction i : block.Instructions()) {
+            if (last != null) {
+                if (i.eq("type", "label") && last.eq("type", "label")) {
+                    UpdateLabel(last.G("label"), i.G("label"));
+                    last.copy("label", i);
+                    remover.add(last);
+                }
+            }
+            last = i;
+        }
+
+        while (!remover.isEmpty()) {
+            r = remover.remove(0);
             instructions.remove(r);
         }
     }
+
+    protected void UpdateLabel(String old, String newl) {
+        HashMap<String, ArrayList<Instruction>> lab;
+        ArrayList<Instruction> labelInstructions;
+        String label;
+        // Cria o mapa de labels para o bloco atual caso não exista
+        if (!labelMap.containsKey(currentBlock)) {
+            lab = new HashMap<String, ArrayList<Instruction>>();
+            labelMap.put(currentBlock, lab);
+            // Popula a lista de cada de instrucao de cada label
+            for (Instruction instruction : block.Instructions()) {
+                if (instruction.Has("label") || instruction.eq("type", "label")) {
+                    label = instruction.G("label");
+                    if (!lab.containsKey(label)) {
+                        lab.put(label, new ArrayList<Instruction>());
+                    }
+                    lab.get(label).add(instruction);
+                }
+            }
+        } else {
+            lab = labelMap.get(currentBlock);
+        }
+//            System.out.println("lab:" + lab);
+//        System.out.println("update label:" + old + "." + newl);
+
+        if (lab.containsKey(old)) {
+
+            for (Instruction instruction : lab.get(old)) {
+                instruction.S("label", newl);
+            }
+        }
+
+//labelInstructions
+    }
 }

+ 4 - 3
src/common/IvannosysTargetArch.java

@@ -5,9 +5,6 @@
  */
 package common;
 
-import common.Instruction;
-import common.Code;
-
 /**
  *
  * @author Eugenio
@@ -60,4 +57,8 @@ public interface IvannosysTargetArch {
 
     public void TranslatePointerAssignment(Instruction inst) throws Exception;
 
+    public void TranslateLoad(Instruction inst) throws Exception;
+
+    public void TranslateStore(Instruction inst) throws Exception;
+
 }

+ 5 - 3
src/samples/program_jun_bit_count.go

@@ -58,13 +58,15 @@ func bitCount(x int) int {
 func main(){
     var (
 	n     = 0
-	seed  = 112500
+	seed  = 10033
 	//seed2 int = 112500
     )
     
-    for i := 0; i < 75000; i++ {
+    for i := 0; i < 10; i++ {
+    //for i := 0; i < 2; i++ {
         n += bitCount(seed)
-	seed += 13
+	//seed += 1
+	seed += 2
     }
 
     return n

+ 14 - 10
src/target/mips/AllocatorMipsProcessor.java

@@ -36,6 +36,7 @@ public class AllocatorMipsProcessor implements AllocatorInterface, CodeProcessin
 
     @Override
     public void Exec(Code c, LinkedHashMap<String, CodeProcessing> cp) throws Exception {
+        BlockBaseOcorrences bb;
         registers = new Registers();
 //        System.out.println("Exec Allocation:" + c.getCurrentBlockName());
 //        BlockBaseOcorrences group = ((BaseBlockProcessor) cp.get("live.var"))
@@ -56,9 +57,12 @@ public class AllocatorMipsProcessor implements AllocatorInterface, CodeProcessin
                 case "label":
                     continue;
                 default:
-//                    System.out.println("###ASSIGN:(" + instructionPosition + ")(" + group.getBasicBlocks(1).getLeader() + ")");
                     // Se a instruncao pertence ao proximo bloco basico atualiza o grupo
-                    if (instructionPosition >= group.getBasicBlocks(1).getLeader()) {
+                    bb = group.getBasicBlocks(1);
+                    
+//                    System.out.println("###ASSIGN:(" + instructionPosition + ")(" + group.getBasicBlocks(1).getLeader() + ")");
+
+                    if (bb != null && instructionPosition >= bb.getLeader()) {
                         group.NextBlock();
                         System.out.println(">>>>> Mudei para bloco basico:" + group.Current().getName());
                     }
@@ -134,12 +138,12 @@ public class AllocatorMipsProcessor implements AllocatorInterface, CodeProcessin
 
         boolean dst = address.equals("dst");
 
-        System.out.println("GetRegister: (" + address + "):(" + addr + ") : ["
-                + instructionPosition
-                + " : "
-                + position
-                + " : "
-                + leader + "] {");
+//        System.out.println("GetRegister: (" + address + "):(" + addr + ") : ["
+//                + instructionPosition
+//                + " : "
+//                + position
+//                + " : "
+//                + leader + "] {");
 //        System.out.println(x);
 
         Interval interval = bb.Get(addr, position);
@@ -153,7 +157,7 @@ public class AllocatorMipsProcessor implements AllocatorInterface, CodeProcessin
             // Verifica a existencia de um registrador disponivel
             reg = AvaliableRegister(addr);
 
-            System.out.println("[" + dst + "]GerRegister não definido: (" + address + ")/add: " + addr);
+//            System.out.println("[" + dst + "]GerRegister não definido: (" + address + ")/add: " + addr);
             if (!dst) {
                 // Parametro define que o valor deve ser carregado em registrador;
                 Load(x, address);
@@ -194,7 +198,7 @@ public class AllocatorMipsProcessor implements AllocatorInterface, CodeProcessin
             }
         }
 
-        System.out.println("}" + reg + "::" + position);
+//        System.out.println("}" + reg + "::" + position);
         return reg;
     }
 

+ 359 - 279
src/target/mips/Gen.java

@@ -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

+ 27 - 0
src/target/mips/LoadStoreProcessor.java

@@ -0,0 +1,27 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package target.mips;
+
+import IntermediaryCode.BaseBlockProcessor;
+import IntermediaryCode.CodeProcessing;
+import common.Code;
+import java.util.LinkedHashMap;
+
+/**
+ *
+ * @author EUGENIO CARVALHO
+ */
+class LoadStoreProcessor implements CodeProcessing {
+
+    public LoadStoreProcessor(BaseBlockProcessor ocorrences) {
+    }
+
+    @Override
+    public void Exec(Code c, LinkedHashMap<String, CodeProcessing> cp) throws Exception {
+//        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+}

+ 2 - 3
src/target/mips/OTMinActivationRegister.java

@@ -6,7 +6,6 @@
 package target.mips;
 
 import common.Block;
-import IntermediaryCode.BlockBaseOcorrences;
 import common.Code;
 import IntermediaryCode.CodeProcessing;
 import common.DataFrame;
@@ -29,8 +28,8 @@ public class OTMinActivationRegister implements CodeProcessing {
     public void Exec(Code c, LinkedHashMap<String, CodeProcessing> cp) throws Exception {
         Block B = c.Block();
         DataFrame D = B.Data();
-        BlockBaseOcorrences o = ocorrences.getBlocks().get(B.getName());
-        System.out.println("o:" + o.All());
+//        BlockBaseOcorrences o = ocorrences.getBlocks().get(B.getName());
+//        System.out.println("o:" + o.All());
     }
 
 }

+ 11 - 2
src/tools/mips/MipsProcessor.java

@@ -58,13 +58,20 @@ public class MipsProcessor {
 
     public MipsProcessor Persist() {
         MD.Save();
+
         return this;
     }
 
     protected void Log(String msg) {
-        if (settings.debugmode) {
-            System.out.println(msg);
+        if (!settings.debugmode) {
+            return;
+        }
+
+        if (breakPoint.size() > 0 && !breakPoint.containsKey(Integer.toHexString((int) PC))) {
+            return;
         }
+
+        System.out.println(msg);
     }
 
     public MipsProcessor Run() {
@@ -78,11 +85,13 @@ public class MipsProcessor {
             String cAddress;
             while (true) {
                 long inst = MI.R(PC);
+
                 instruction = Decode(inst);
 
                 if (instruction.eq("inst", "stop")) {
                     break;
                 }
+
                 cAddress = Integer.toHexString((int) PC);
 
                 Log("Interation(" + (i++) + ")["

+ 25 - 27
src/tools/mips/memory/md.memory

@@ -1,27 +1,27 @@
-0000:	1
-0004:	2
-0008:	3
-0012:	4
-0016:	1
-0020:	2
-0024:	3
-0028:	4
+0000:	0
+0004:	0
+0008:	0
+0012:	0
+0016:	0
+0020:	0
+0024:	0
+0028:	0
 0032:	0
 0036:	0
 0040:	0
 0044:	0
-0048:	3
-0052:	4
-0056:	5
-0060:	6
-0064:	3
-0068:	4
-0072:	5
-0076:	6
-0080:	69
-0084:	80
-0088:	93
-0092:	108
+0048:	0
+0052:	0
+0056:	0
+0060:	0
+0064:	0
+0068:	0
+0072:	0
+0076:	0
+0080:	0
+0084:	0
+0088:	0
+0092:	0
 0096:	0
 0100:	0
 0104:	0
@@ -4089,10 +4089,8 @@
 16352:	0
 16356:	0
 16360:	0
-16364:	-37131
-16368:	-18559
-16372:	9464
-16376:	-18572
-16380:	0
-16370:	7
-16366:	2
+16364:	-18554
+16368:	0
+16372:	0
+16376:	-18552
+16380:	10

+ 15 - 8
src/tools/mips/memory/mi.memory

@@ -1,25 +1,27 @@
 0666763252
 0001962017
+0605028352
 2949644288
-0605140852
+0605103921
 2949709828
+0605159424
 2949775368
-0134217748
+0134217750
 2412969988
 0001253409
-0201326619
+0201326621
 0000153633
 2413035520
 0042704929
 2949906432
 2413101060
-0649396237
+0649396226
 2949971972
 2413166600
 0651558913
 2950037512
 2413232136
-0604906744
+0604897290
 0049156131
 0071368687
 2412773376
@@ -28,20 +30,25 @@
 0666763256
 0001962017
 2948857856
-2412773376
+0605093888
 2949709828
+2412773376
 0033558563
-0406847497
+0406847500
 2412904452
 0642908161
 2949775364
 2412969984
 0604700673
 0040591395
+2412969984
 0040671268
+2949840896
+2412969984
 0308281345
-0134217762
+0134217765
 2413035524
 0001314849
 0666697736
+0001962017
 0065011720