コード例 #1
0
 // Ranjay
 public static ExpressionInstruction generateTile(MemIR mem, TempTable tTable) {
   ExpressionInstruction inst = new ExpressionInstruction();
   SyntaxIR address = (SyntaxIR) mem.getChildren().get(0);
   Instruction childInst = generateTile(address, tTable);
   inst.addAll(childInst.getTiles());
   AddressingMode addr = ((ExpressionInstruction) childInst).getAddr();
   if (addr.getMemAccess()) {
     inst.add(new Tile(1, "movq", addr, new AddressingMode("r12")));
     inst.setAddr(new AddressingMode(true, "r12"));
   } else {
     inst.setAddr(new AddressingMode(true, addr.getBaseReg()));
   }
   return inst;
 }
コード例 #2
0
 // Ranjay,
 public static ExpressionInstruction generateTile(ConstIR cons, TempTable tTable) {
   ExpressionInstruction inst = new ExpressionInstruction();
   AddressingMode addr = new AddressingMode(cons.getValue());
   inst.setAddr(addr);
   return inst;
 }
コード例 #3
0
 // Ranjay
 public static ExpressionInstruction generateTile(OpIR op, TempTable tTable) {
   ExpressionInstruction inst = new ExpressionInstruction();
   if (op.getChildren().size() > 1) {
     ExpressionInstruction child1 =
         (ExpressionInstruction) generateTile((SyntaxIR) op.getChildren().get(0), tTable);
     ExpressionInstruction child2 =
         (ExpressionInstruction) generateTile((SyntaxIR) op.getChildren().get(1), tTable);
     inst.addAll(child1.getTiles());
     inst.add(new Tile(1, "pushq", child1.getAddr(), null));
     inst.addAll(child2.getTiles());
     inst.add(new Tile(1, "movq", child2.getAddr(), new AddressingMode("r12")));
     inst.add(new Tile(1, "popq", new AddressingMode("r13"), null));
     if (op.getOp() == opEnum.DIVIDE || op.getOp() == opEnum.MODULO) {
       inst.add(new Tile(1, "pushq", new AddressingMode("rdx"), null));
       inst.add(new Tile(1, "pushq", new AddressingMode("rax"), null));
       inst.add(new Tile(1, "movq", new AddressingMode("r13"), new AddressingMode("rax")));
       // we need to sign extend r13 into rdx
       inst.add(new Tile(1, "cmp", new AddressingMode(0), new AddressingMode("r13")));
       // if r12 is less than 0 we move FFFFFFFFFFFFFFFF to rdx otherwise move zero
       int div = tTable.getNewJumpLabel();
       inst.add(new Tile(1, "jl", new AddressingMode("div" + div, true), null));
       // fall through to moving zero
       inst.add(new Tile(1, "movq", new AddressingMode(0), new AddressingMode("rdx")));
       inst.add(new Tile(1, "jmp", new AddressingMode("divEnd" + div, true), null));
       inst.add(new Tile(1, "div" + div + ":", null, null));
       inst.add(new Tile(1, "movq", new AddressingMode(-1), new AddressingMode("rdx")));
       inst.add(new Tile(1, "divEnd" + div + ":", null, null));
       inst.add(new Tile(1, "idiv", new AddressingMode("r12"), null));
       // The result is put in RAX so we need to push that on the stack
       if (op.getOp() == opEnum.DIVIDE)
         inst.add(new Tile(1, "movq", new AddressingMode("rax"), new AddressingMode("r12")));
       else inst.add(new Tile(1, "movq", new AddressingMode("rdx"), new AddressingMode("r12")));
       inst.add(new Tile(1, "popq", new AddressingMode("rax"), null));
       inst.add(new Tile(1, "popq", new AddressingMode("rdx"), null));
       inst.setAddr(new AddressingMode("r12"));
     } else if (op.returnsBool() && op.getOp() != opEnum.AND && op.getOp() != opEnum.OR) {
       int x = tTable.getNewJumpLabel();
       inst.add(new Tile(1, "cmp", new AddressingMode("r12"), new AddressingMode("r13")));
       inst.add(new Tile(1, op.opToAssembly(), new AddressingMode("_true" + x, true), null));
       inst.add(new Tile(1, "movq", new AddressingMode(0), new AddressingMode("r12")));
       inst.add(new Tile(1, "jmp", new AddressingMode("_end" + x, true), null));
       inst.add(new Tile(1, "_true" + x + ": ", null, null));
       inst.add(new Tile(1, "movq", new AddressingMode(1), new AddressingMode("r12")));
       inst.add(new Tile(1, "_end" + x + ": ", null, null));
       inst.setAddr(new AddressingMode("r12"));
     } else if (op.getOp() == opEnum.LSHIFT || op.getOp() == opEnum.RSHIFT) {
       inst.add(new Tile(1, op.opToAssembly(), new AddressingMode(3), new AddressingMode("r13")));
       inst.setAddr(new AddressingMode("r13"));
     } else {
       inst.add(
           new Tile(1, op.opToAssembly(), new AddressingMode("r12"), new AddressingMode("r13")));
       inst.setAddr(new AddressingMode("r13"));
     }
   } else {
     ExpressionInstruction child =
         (ExpressionInstruction) generateTile((SyntaxIR) op.getChildren().get(0), tTable);
     inst.addAll(child.getTiles());
     switch (op.getOp()) {
       case NOT:
         inst.add(new Tile(1, "btc", new AddressingMode(0), child.getAddr()));
         inst.setAddr(child.getAddr());
         break;
       case UNARY_MINUS:
         inst.add(new Tile(1, "neg", child.getAddr(), null));
         inst.setAddr(child.getAddr());
         break;
     }
   }
   return inst;
 }
コード例 #4
0
  // Ranjay
  public static Instruction generateTile(CallIR call, TempTable tTable) {
    ExpressionInstruction inst = new ExpressionInstruction();
    // Push caller saved: rcx,rdx,rsp,rsi,rdi,r8,r9,r10,r11
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("rcx"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rcx"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("rdx"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rdx"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("rsp"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rsp"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("rsi"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rsi"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("rdi"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rdi"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("r8"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r8"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("r9"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r9"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("r10"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r10"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("r11"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r11"), "rbp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode("r15"),
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r15"), "rbp")));
    inst.add(new Tile(1, "pushq", new AddressingMode("rbx"), null));
    inst.add(new Tile(1, "pushq", new AddressingMode("rbp"), null));

    // handle arguments
    Instruction args = handleArguments(call, tTable);
    inst.addAll(args.getTiles());

    // make call
    Instruction ooo = makeCall(call, tTable);
    inst.addAll(ooo.getTiles());

    // pop caller saved
    inst.add(new Tile(1, "popq", new AddressingMode("rbp"), null));
    inst.add(new Tile(1, "popq", new AddressingMode("rbx"), null));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r15"), "rbp"),
            new AddressingMode("r15")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r11"), "rbp"),
            new AddressingMode("r11")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r10"), "rbp"),
            new AddressingMode("r10")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r9"), "rbp"),
            new AddressingMode("r9")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("r8"), "rbp"),
            new AddressingMode("r8")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rdi"), "rbp"),
            new AddressingMode("rdi")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rsi"), "rbp"),
            new AddressingMode("rsi")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rsp"), "rbp"),
            new AddressingMode("rsp")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rdx"), "rbp"),
            new AddressingMode("rdx")));
    inst.add(
        new Tile(
            1,
            "movq",
            new AddressingMode(
                -1 * tTable.getCurrentFunction().getStackLocation().get("rcx"), "rbp"),
            new AddressingMode("rcx")));
    inst.setAddr(new AddressingMode("rax"));
    return inst;
  }
コード例 #5
0
 // Ranjay
 public static ExpressionInstruction generateTile(TempIR temp, TempTable tTable) {
   ExpressionInstruction inst = new ExpressionInstruction();
   String funcname = tTable.getCurrentFunction().label();
   int lastindex = funcname.lastIndexOf("_");
   String letter = funcname.substring(lastindex + 1, lastindex + 2);
   String id = temp.getId();
   if (id.startsWith("_ret")) {
     Integer offset = Integer.parseInt((id.substring(4, id.length())));
     offset = 1 * (offset) * 8;
     inst.setAddr(new AddressingMode(offset, "rax"));
   } else if (id.startsWith("_rret")) {
     Integer offset = Integer.parseInt((id.substring(5, id.length())));
     offset = 1 * (offset) * 8;
     inst.setAddr(new AddressingMode(offset, "rcx"));
   } else if (!(letter.equals("t"))) {
     if (id.startsWith("_args0")) inst.setAddr(new AddressingMode("rcx"));
     else if (id.startsWith("_args1")) inst.setAddr(new AddressingMode("rdx"));
     else if (id.startsWith("_args2")) inst.setAddr(new AddressingMode("r8"));
     else if (id.startsWith("_args3")) inst.setAddr(new AddressingMode("r9"));
     else if (id.startsWith("_args"))
       inst.setAddr(
           new AddressingMode((Integer.parseInt(id.substring(5, id.length())) - 5) * 8, "rbp"));
     else { // DANIEL!!, FIX line 203 & 226 so that
       HashMap<String, String> regs =
           tTable.getCurrentFunction().getRegAlloc(); // we can have more than 10 arguments			
       HashMap<String, Integer> stack = tTable.getCurrentFunction().getStackLocation();
       if (regs.containsKey(id)) {
         inst.setAddr(new AddressingMode(regs.get(id)));
       } else {
         // System.out.println(id);
         int offset = stack.get(id);
         inst.setAddr(new AddressingMode(-offset, "rbp"));
       }
     }
   } else {
     if (id.startsWith("_args0")) {
       inst.setAddr(new AddressingMode("rdx"));
     } else if (id.startsWith("_args1")) {
       inst.setAddr(new AddressingMode("r8"));
     } else if (id.startsWith("_args2")) {
       inst.setAddr(new AddressingMode("r9"));
     } else if (id.startsWith("_args")) {
       inst.setAddr(
           new AddressingMode((Integer.parseInt(id.substring(5, id.length())) - 3) * 8, "rbp"));
     } else {
       HashMap<String, String> regs = tTable.getCurrentFunction().getRegAlloc();
       if (regs.containsKey(id)) {
         inst.setAddr(new AddressingMode(regs.get(id)));
       } else {
         HashMap<String, Integer> stack = tTable.getCurrentFunction().getStackLocation();
         int offset = stack.get(id);
         inst.setAddr(new AddressingMode(-offset, "rbp"));
       }
     }
   }
   return inst;
 }