| ... | ... | @@ -438,9 +438,8 @@ fn gen(self: *Self) !void { |
| 438 | 438 | // mov fp, sp |
| 439 | 439 | _ = try self.addInst(.{ |
| 440 | 440 | .tag = .mov, |
| 441 | | .data = .{ .rr_op = .{ |
| 441 | .data = .{ .r_op_mov = .{ |
| 442 | 442 | .rd = .fp, |
| 443 | | .rn = .r0, |
| 444 | 443 | .op = Instruction.Operand.reg(.sp, Instruction.Operand.Shift.none), |
| 445 | 444 | } }, |
| 446 | 445 | }); |
| ... | ... | @@ -531,9 +530,8 @@ fn gen(self: *Self) !void { |
| 531 | 530 | // mov sp, fp |
| 532 | 531 | _ = try self.addInst(.{ |
| 533 | 532 | .tag = .mov, |
| 534 | | .data = .{ .rr_op = .{ |
| 533 | .data = .{ .r_op_mov = .{ |
| 535 | 534 | .rd = .sp, |
| 536 | | .rn = .r0, |
| 537 | 535 | .op = Instruction.Operand.reg(.fp, Instruction.Operand.Shift.none), |
| 538 | 536 | } }, |
| 539 | 537 | }); |
| ... | ... | @@ -1240,9 +1238,8 @@ fn airNot(self: *Self, inst: Air.Inst.Index) !void { |
| 1240 | 1238 | |
| 1241 | 1239 | _ = try self.addInst(.{ |
| 1242 | 1240 | .tag = .mvn, |
| 1243 | | .data = .{ .rr_op = .{ |
| 1241 | .data = .{ .r_op_mov = .{ |
| 1244 | 1242 | .rd = dest_reg, |
| 1245 | | .rn = undefined, |
| 1246 | 1243 | .op = Instruction.Operand.reg(op_reg, Instruction.Operand.Shift.none), |
| 1247 | 1244 | } }, |
| 1248 | 1245 | }); |
| ... | ... | @@ -1337,9 +1334,8 @@ fn minMax( |
| 1337 | 1334 | _ = try self.addInst(.{ |
| 1338 | 1335 | .tag = .mov, |
| 1339 | 1336 | .cond = cond_choose_lhs, |
| 1340 | | .data = .{ .rr_op = .{ |
| 1337 | .data = .{ .r_op_mov = .{ |
| 1341 | 1338 | .rd = dest_reg, |
| 1342 | | .rn = .r0, |
| 1343 | 1339 | .op = Instruction.Operand.reg(lhs_reg, Instruction.Operand.Shift.none), |
| 1344 | 1340 | } }, |
| 1345 | 1341 | }); |
| ... | ... | @@ -1348,9 +1344,8 @@ fn minMax( |
| 1348 | 1344 | _ = try self.addInst(.{ |
| 1349 | 1345 | .tag = .mov, |
| 1350 | 1346 | .cond = cond_choose_rhs, |
| 1351 | | .data = .{ .rr_op = .{ |
| 1347 | .data = .{ .r_op_mov = .{ |
| 1352 | 1348 | .rd = dest_reg, |
| 1353 | | .rn = .r0, |
| 1354 | 1349 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), |
| 1355 | 1350 | } }, |
| 1356 | 1351 | }); |
| ... | ... | @@ -1682,9 +1677,8 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void { |
| 1682 | 1677 | // mov rdlo, #0 |
| 1683 | 1678 | _ = try self.addInst(.{ |
| 1684 | 1679 | .tag = .mov, |
| 1685 | | .data = .{ .rr_op = .{ |
| 1680 | .data = .{ .r_op_mov = .{ |
| 1686 | 1681 | .rd = rdlo, |
| 1687 | | .rn = .r0, |
| 1688 | 1682 | .op = Instruction.Operand.fromU32(0).?, |
| 1689 | 1683 | } }, |
| 1690 | 1684 | }); |
| ... | ... | @@ -1693,9 +1687,8 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void { |
| 1693 | 1687 | _ = try self.addInst(.{ |
| 1694 | 1688 | .tag = .mov, |
| 1695 | 1689 | .cond = .ne, |
| 1696 | | .data = .{ .rr_op = .{ |
| 1690 | .data = .{ .r_op_mov = .{ |
| 1697 | 1691 | .rd = rdlo, |
| 1698 | | .rn = .r0, |
| 1699 | 1692 | .op = Instruction.Operand.fromU32(1).?, |
| 1700 | 1693 | } }, |
| 1701 | 1694 | }); |
| ... | ... | @@ -1707,9 +1700,8 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void { |
| 1707 | 1700 | _ = try self.addInst(.{ |
| 1708 | 1701 | .tag = .mov, |
| 1709 | 1702 | .cond = .ne, |
| 1710 | | .data = .{ .rr_op = .{ |
| 1703 | .data = .{ .r_op_mov = .{ |
| 1711 | 1704 | .rd = rdlo, |
| 1712 | | .rn = .r0, |
| 1713 | 1705 | .op = Instruction.Operand.fromU32(1).?, |
| 1714 | 1706 | } }, |
| 1715 | 1707 | }); |
| ... | ... | @@ -2670,7 +2662,7 @@ fn binOpRegister( |
| 2670 | 2662 | defer if (new_rhs_lock) |reg| self.register_manager.unlockReg(reg); |
| 2671 | 2663 | |
| 2672 | 2664 | const dest_reg = switch (mir_tag) { |
| 2673 | | .cmp => .r0, // cmp has no destination regardless |
| 2665 | .cmp => undefined, // cmp has no destination regardless |
| 2674 | 2666 | else => if (metadata) |md| blk: { |
| 2675 | 2667 | if (lhs_is_register and self.reuseOperand(md.inst, md.lhs, 0, lhs)) { |
| 2676 | 2668 | break :blk lhs_reg; |
| ... | ... | @@ -2690,7 +2682,6 @@ fn binOpRegister( |
| 2690 | 2682 | .adds, |
| 2691 | 2683 | .sub, |
| 2692 | 2684 | .subs, |
| 2693 | | .cmp, |
| 2694 | 2685 | .@"and", |
| 2695 | 2686 | .orr, |
| 2696 | 2687 | .eor, |
| ... | ... | @@ -2699,6 +2690,10 @@ fn binOpRegister( |
| 2699 | 2690 | .rn = lhs_reg, |
| 2700 | 2691 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), |
| 2701 | 2692 | } }, |
| 2693 | .cmp => .{ .r_op_cmp = .{ |
| 2694 | .rn = lhs_reg, |
| 2695 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), |
| 2696 | } }, |
| 2702 | 2697 | .lsl, |
| 2703 | 2698 | .asr, |
| 2704 | 2699 | .lsr, |
| ... | ... | @@ -2767,7 +2762,7 @@ fn binOpImmediate( |
| 2767 | 2762 | defer if (new_lhs_lock) |reg| self.register_manager.unlockReg(reg); |
| 2768 | 2763 | |
| 2769 | 2764 | const dest_reg = switch (mir_tag) { |
| 2770 | | .cmp => .r0, // cmp has no destination reg |
| 2765 | .cmp => undefined, // cmp has no destination reg |
| 2771 | 2766 | else => if (metadata) |md| blk: { |
| 2772 | 2767 | if (lhs_is_register and self.reuseOperand( |
| 2773 | 2768 | md.inst, |
| ... | ... | @@ -2789,7 +2784,6 @@ fn binOpImmediate( |
| 2789 | 2784 | .adds, |
| 2790 | 2785 | .sub, |
| 2791 | 2786 | .subs, |
| 2792 | | .cmp, |
| 2793 | 2787 | .@"and", |
| 2794 | 2788 | .orr, |
| 2795 | 2789 | .eor, |
| ... | ... | @@ -2798,6 +2792,10 @@ fn binOpImmediate( |
| 2798 | 2792 | .rn = lhs_reg, |
| 2799 | 2793 | .op = Instruction.Operand.fromU32(rhs.immediate).?, |
| 2800 | 2794 | } }, |
| 2795 | .cmp => .{ .r_op_cmp = .{ |
| 2796 | .rn = lhs_reg, |
| 2797 | .op = Instruction.Operand.fromU32(rhs.immediate).?, |
| 2798 | } }, |
| 2801 | 2799 | .lsl, |
| 2802 | 2800 | .asr, |
| 2803 | 2801 | .lsr, |
| ... | ... | @@ -3312,9 +3310,8 @@ fn genInlineMemcpy( |
| 3312 | 3310 | // mov count, #0 |
| 3313 | 3311 | _ = try self.addInst(.{ |
| 3314 | 3312 | .tag = .mov, |
| 3315 | | .data = .{ .rr_op = .{ |
| 3313 | .data = .{ .r_op_mov = .{ |
| 3316 | 3314 | .rd = count, |
| 3317 | | .rn = .r0, |
| 3318 | 3315 | .op = Instruction.Operand.imm(0, 0), |
| 3319 | 3316 | } }, |
| 3320 | 3317 | }); |
| ... | ... | @@ -3323,8 +3320,7 @@ fn genInlineMemcpy( |
| 3323 | 3320 | // cmp count, len |
| 3324 | 3321 | _ = try self.addInst(.{ |
| 3325 | 3322 | .tag = .cmp, |
| 3326 | | .data = .{ .rr_op = .{ |
| 3327 | | .rd = .r0, |
| 3323 | .data = .{ .r_op_cmp = .{ |
| 3328 | 3324 | .rn = count, |
| 3329 | 3325 | .op = Instruction.Operand.reg(len, Instruction.Operand.Shift.none), |
| 3330 | 3326 | } }, |
| ... | ... | @@ -3418,9 +3414,8 @@ fn genInlineMemsetCode( |
| 3418 | 3414 | // mov count, #0 |
| 3419 | 3415 | _ = try self.addInst(.{ |
| 3420 | 3416 | .tag = .mov, |
| 3421 | | .data = .{ .rr_op = .{ |
| 3417 | .data = .{ .r_op_mov = .{ |
| 3422 | 3418 | .rd = count, |
| 3423 | | .rn = .r0, |
| 3424 | 3419 | .op = Instruction.Operand.imm(0, 0), |
| 3425 | 3420 | } }, |
| 3426 | 3421 | }); |
| ... | ... | @@ -3429,8 +3424,7 @@ fn genInlineMemsetCode( |
| 3429 | 3424 | // cmp count, len |
| 3430 | 3425 | _ = try self.addInst(.{ |
| 3431 | 3426 | .tag = .cmp, |
| 3432 | | .data = .{ .rr_op = .{ |
| 3433 | | .rd = .r0, |
| 3427 | .data = .{ .r_op_cmp = .{ |
| 3434 | 3428 | .rn = count, |
| 3435 | 3429 | .op = Instruction.Operand.reg(len, Instruction.Operand.Shift.none), |
| 3436 | 3430 | } }, |
| ... | ... | @@ -4020,9 +4014,7 @@ fn condBr(self: *Self, condition: MCValue) !Mir.Inst.Index { |
| 4020 | 4014 | // bne ... |
| 4021 | 4015 | _ = try self.addInst(.{ |
| 4022 | 4016 | .tag = .cmp, |
| 4023 | | .cond = .al, |
| 4024 | | .data = .{ .rr_op = .{ |
| 4025 | | .rd = .r0, |
| 4017 | .data = .{ .r_op_cmp = .{ |
| 4026 | 4018 | .rn = reg, |
| 4027 | 4019 | .op = Instruction.Operand.imm(1, 0), |
| 4028 | 4020 | } }, |
| ... | ... | @@ -4196,8 +4188,7 @@ fn isNull(self: *Self, ty: Type, operand: MCValue) !MCValue { |
| 4196 | 4188 | |
| 4197 | 4189 | _ = try self.addInst(.{ |
| 4198 | 4190 | .tag = .cmp, |
| 4199 | | .data = .{ .rr_op = .{ |
| 4200 | | .rd = undefined, |
| 4191 | .data = .{ .r_op_cmp = .{ |
| 4201 | 4192 | .rn = reg_mcv.register, |
| 4202 | 4193 | .op = Instruction.Operand.fromU32(0).?, |
| 4203 | 4194 | } }, |
| ... | ... | @@ -4832,9 +4823,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 4832 | 4823 | .register_v_flag => .vs, |
| 4833 | 4824 | else => unreachable, |
| 4834 | 4825 | }, |
| 4835 | | .data = .{ .rr_op = .{ |
| 4826 | .data = .{ .r_op_mov = .{ |
| 4836 | 4827 | .rd = cond_reg, |
| 4837 | | .rn = .r0, |
| 4838 | 4828 | .op = Instruction.Operand.fromU32(1).?, |
| 4839 | 4829 | } }, |
| 4840 | 4830 | }); |
| ... | ... | @@ -4935,9 +4925,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 4935 | 4925 | // mov reg, 0 |
| 4936 | 4926 | _ = try self.addInst(.{ |
| 4937 | 4927 | .tag = .mov, |
| 4938 | | .data = .{ .rr_op = .{ |
| 4928 | .data = .{ .r_op_mov = .{ |
| 4939 | 4929 | .rd = reg, |
| 4940 | | .rn = .r0, |
| 4941 | 4930 | .op = zero, |
| 4942 | 4931 | } }, |
| 4943 | 4932 | }); |
| ... | ... | @@ -4946,9 +4935,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 4946 | 4935 | _ = try self.addInst(.{ |
| 4947 | 4936 | .tag = .mov, |
| 4948 | 4937 | .cond = condition, |
| 4949 | | .data = .{ .rr_op = .{ |
| 4938 | .data = .{ .r_op_mov = .{ |
| 4950 | 4939 | .rd = reg, |
| 4951 | | .rn = .r0, |
| 4952 | 4940 | .op = one, |
| 4953 | 4941 | } }, |
| 4954 | 4942 | }); |
| ... | ... | @@ -4957,18 +4945,16 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 4957 | 4945 | if (Instruction.Operand.fromU32(x)) |op| { |
| 4958 | 4946 | _ = try self.addInst(.{ |
| 4959 | 4947 | .tag = .mov, |
| 4960 | | .data = .{ .rr_op = .{ |
| 4948 | .data = .{ .r_op_mov = .{ |
| 4961 | 4949 | .rd = reg, |
| 4962 | | .rn = .r0, |
| 4963 | 4950 | .op = op, |
| 4964 | 4951 | } }, |
| 4965 | 4952 | }); |
| 4966 | 4953 | } else if (Instruction.Operand.fromU32(~x)) |op| { |
| 4967 | 4954 | _ = try self.addInst(.{ |
| 4968 | 4955 | .tag = .mvn, |
| 4969 | | .data = .{ .rr_op = .{ |
| 4956 | .data = .{ .r_op_mov = .{ |
| 4970 | 4957 | .rd = reg, |
| 4971 | | .rn = .r0, |
| 4972 | 4958 | .op = op, |
| 4973 | 4959 | } }, |
| 4974 | 4960 | }); |
| ... | ... | @@ -4984,9 +4970,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 4984 | 4970 | } else { |
| 4985 | 4971 | _ = try self.addInst(.{ |
| 4986 | 4972 | .tag = .mov, |
| 4987 | | .data = .{ .rr_op = .{ |
| 4973 | .data = .{ .r_op_mov = .{ |
| 4988 | 4974 | .rd = reg, |
| 4989 | | .rn = .r0, |
| 4990 | 4975 | .op = Instruction.Operand.imm(@truncate(u8, x), 0), |
| 4991 | 4976 | } }, |
| 4992 | 4977 | }); |
| ... | ... | @@ -5028,9 +5013,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 5028 | 5013 | // orr reg, reg, #0xdd, 8 |
| 5029 | 5014 | _ = try self.addInst(.{ |
| 5030 | 5015 | .tag = .mov, |
| 5031 | | .data = .{ .rr_op = .{ |
| 5016 | .data = .{ .r_op_mov = .{ |
| 5032 | 5017 | .rd = reg, |
| 5033 | | .rn = .r0, |
| 5034 | 5018 | .op = Instruction.Operand.imm(@truncate(u8, x), 0), |
| 5035 | 5019 | } }, |
| 5036 | 5020 | }); |
| ... | ... | @@ -5069,9 +5053,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 5069 | 5053 | // mov reg, src_reg |
| 5070 | 5054 | _ = try self.addInst(.{ |
| 5071 | 5055 | .tag = .mov, |
| 5072 | | .data = .{ .rr_op = .{ |
| 5056 | .data = .{ .r_op_mov = .{ |
| 5073 | 5057 | .rd = reg, |
| 5074 | | .rn = .r0, |
| 5075 | 5058 | .op = Instruction.Operand.reg(src_reg, Instruction.Operand.Shift.none), |
| 5076 | 5059 | } }, |
| 5077 | 5060 | }); |