| ... | ... | @@ -4511,35 +4511,29 @@ fn genCondBrMir(self: *Self, ty: Type, mcv: MCValue) !u32 { |
| 4511 | 4511 | const abi_size = ty.abiSize(self.target.*); |
| 4512 | 4512 | switch (mcv) { |
| 4513 | 4513 | .eflags => |cc| { |
| 4514 | | _ = cc; |
| 4515 | | // return self.addInst(.{ |
| 4516 | | // .tag = .cond_jmp, |
| 4517 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 4518 | | // .data = .{ |
| 4519 | | // .inst_cc = .{ |
| 4520 | | // .inst = undefined, |
| 4521 | | // // Here we map the opposites since the jump is to the false branch. |
| 4522 | | // .cc = cc.negate(), |
| 4523 | | // }, |
| 4524 | | // }, |
| 4525 | | // }); |
| 4514 | return self.addInst(.{ |
| 4515 | .tag = .jcc, |
| 4516 | .ops = .inst_cc, |
| 4517 | .data = .{ |
| 4518 | .inst_cc = .{ |
| 4519 | .inst = undefined, |
| 4520 | // Here we map the opposites since the jump is to the false branch. |
| 4521 | .cc = cc.negate(), |
| 4522 | }, |
| 4523 | }, |
| 4524 | }); |
| 4526 | 4525 | }, |
| 4527 | 4526 | .register => |reg| { |
| 4528 | | _ = reg; |
| 4529 | 4527 | try self.spillEflagsIfOccupied(); |
| 4530 | | // _ = try self.addInst(.{ |
| 4531 | | // .tag = .@"test", |
| 4532 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = reg }), |
| 4533 | | // .data = .{ .imm = 1 }, |
| 4534 | | // }); |
| 4535 | | // return self.addInst(.{ |
| 4536 | | // .tag = .cond_jmp, |
| 4537 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 4538 | | // .data = .{ .inst_cc = .{ |
| 4539 | | // .inst = undefined, |
| 4540 | | // .cc = .e, |
| 4541 | | // } }, |
| 4542 | | // }); |
| 4528 | try self.asmRegisterImmediate(.@"test", reg, Immediate.u(1)); |
| 4529 | return self.addInst(.{ |
| 4530 | .tag = .jcc, |
| 4531 | .ops = .inst_cc, |
| 4532 | .data = .{ .inst_cc = .{ |
| 4533 | .inst = undefined, |
| 4534 | .cc = .e, |
| 4535 | } }, |
| 4536 | }); |
| 4543 | 4537 | }, |
| 4544 | 4538 | .immediate, |
| 4545 | 4539 | .stack_offset, |
| ... | ... | @@ -4961,22 +4955,17 @@ fn genCondSwitchMir(self: *Self, ty: Type, condition: MCValue, case: MCValue) !u |
| 4961 | 4955 | }, |
| 4962 | 4956 | } |
| 4963 | 4957 | |
| 4964 | | // _ = try self.addInst(.{ |
| 4965 | | // .tag = .@"test", |
| 4966 | | // .ops = Mir.Inst.Ops.encode(.{ |
| 4967 | | // .reg1 = registerAlias(cond_reg, abi_size), |
| 4968 | | // .reg2 = registerAlias(cond_reg, abi_size), |
| 4969 | | // }), |
| 4970 | | // .data = undefined, |
| 4971 | | // }); |
| 4972 | | // return self.addInst(.{ |
| 4973 | | // .tag = .cond_jmp, |
| 4974 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 4975 | | // .data = .{ .inst_cc = .{ |
| 4976 | | // .inst = undefined, |
| 4977 | | // .cc = .ne, |
| 4978 | | // } }, |
| 4979 | | // }); |
| 4958 | const aliased_reg = registerAlias(cond_reg, abi_size); |
| 4959 | try self.asmRegisterRegister(.@"test", aliased_reg, aliased_reg); |
| 4960 | |
| 4961 | return self.addInst(.{ |
| 4962 | .tag = .jcc, |
| 4963 | .ops = .inst_cc, |
| 4964 | .data = .{ .inst_cc = .{ |
| 4965 | .inst = undefined, |
| 4966 | .cc = .ne, |
| 4967 | } }, |
| 4968 | }); |
| 4980 | 4969 | }, |
| 4981 | 4970 | .stack_offset => { |
| 4982 | 4971 | try self.spillEflagsIfOccupied(); |
| ... | ... | @@ -5189,9 +5178,9 @@ fn canonicaliseBranches(self: *Self, parent_branch: *Branch, canon_branch: *Bran |
| 5189 | 5178 | fn performReloc(self: *Self, reloc: Mir.Inst.Index) !void { |
| 5190 | 5179 | const next_inst = @intCast(u32, self.mir_instructions.len); |
| 5191 | 5180 | switch (self.mir_instructions.items(.tag)[reloc]) { |
| 5192 | | // .cond_jmp => { |
| 5193 | | // self.mir_instructions.items(.data)[reloc].inst_cc.inst = next_inst; |
| 5194 | | // }, |
| 5181 | .jcc => { |
| 5182 | self.mir_instructions.items(.data)[reloc].inst_cc.inst = next_inst; |
| 5183 | }, |
| 5195 | 5184 | .jmp => { |
| 5196 | 5185 | self.mir_instructions.items(.data)[reloc].inst = next_inst; |
| 5197 | 5186 | }, |
| ... | ... | @@ -5806,7 +5795,6 @@ fn genInlineMemcpy( |
| 5806 | 5795 | const index_reg = regs[2].to64(); |
| 5807 | 5796 | const count_reg = regs[3].to64(); |
| 5808 | 5797 | const tmp_reg = regs[4].to8(); |
| 5809 | | _ = index_reg; |
| 5810 | 5798 | _ = tmp_reg; |
| 5811 | 5799 | |
| 5812 | 5800 | switch (dst_ptr) { |
| ... | ... | @@ -5825,15 +5813,11 @@ fn genInlineMemcpy( |
| 5825 | 5813 | // }); |
| 5826 | 5814 | }, |
| 5827 | 5815 | .register => |reg| { |
| 5828 | | _ = reg; |
| 5829 | | // _ = try self.addInst(.{ |
| 5830 | | // .tag = .mov, |
| 5831 | | // .ops = Mir.Inst.Ops.encode(.{ |
| 5832 | | // .reg1 = registerAlias(dst_addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5833 | | // .reg2 = reg, |
| 5834 | | // }), |
| 5835 | | // .data = undefined, |
| 5836 | | // }); |
| 5816 | try self.asmRegisterRegister( |
| 5817 | .mov, |
| 5818 | registerAlias(dst_addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5819 | reg, |
| 5820 | ); |
| 5837 | 5821 | }, |
| 5838 | 5822 | else => { |
| 5839 | 5823 | return self.fail("TODO implement memcpy for setting stack when dest is {}", .{dst_ptr}); |
| ... | ... | @@ -5856,15 +5840,11 @@ fn genInlineMemcpy( |
| 5856 | 5840 | // }); |
| 5857 | 5841 | }, |
| 5858 | 5842 | .register => |reg| { |
| 5859 | | _ = reg; |
| 5860 | | // _ = try self.addInst(.{ |
| 5861 | | // .tag = .mov, |
| 5862 | | // .ops = Mir.Inst.Ops.encode(.{ |
| 5863 | | // .reg1 = registerAlias(src_addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5864 | | // .reg2 = reg, |
| 5865 | | // }), |
| 5866 | | // .data = undefined, |
| 5867 | | // }); |
| 5843 | try self.asmRegisterRegister( |
| 5844 | .mov, |
| 5845 | registerAlias(src_addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5846 | reg, |
| 5847 | ); |
| 5868 | 5848 | }, |
| 5869 | 5849 | else => { |
| 5870 | 5850 | return self.fail("TODO implement memcpy for setting stack when src is {}", .{src_ptr}); |
| ... | ... | @@ -5873,30 +5853,24 @@ fn genInlineMemcpy( |
| 5873 | 5853 | |
| 5874 | 5854 | try self.genSetReg(Type.usize, count_reg, len); |
| 5875 | 5855 | |
| 5876 | | // mov index_reg, 0 |
| 5877 | | // _ = try self.addInst(.{ |
| 5878 | | // .tag = .mov, |
| 5879 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = index_reg }), |
| 5880 | | // .data = .{ .imm = 0 }, |
| 5881 | | // }); |
| 5882 | | |
| 5883 | | // loop: |
| 5884 | | // cmp count, 0 |
| 5885 | | // const loop_start = try self.addInst(.{ |
| 5886 | | // .tag = .cmp, |
| 5887 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = count_reg }), |
| 5888 | | // .data = .{ .imm = 0 }, |
| 5889 | | // }); |
| 5856 | try self.asmRegisterImmediate(.mov, index_reg, Immediate.u(0)); |
| 5890 | 5857 | |
| 5891 | | // je end |
| 5892 | | // const loop_reloc = try self.addInst(.{ |
| 5893 | | // .tag = .cond_jmp, |
| 5894 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 5895 | | // .data = .{ .inst_cc = .{ |
| 5896 | | // .inst = undefined, |
| 5897 | | // .cc = .e, |
| 5898 | | // } }, |
| 5899 | | // }); |
| 5858 | const loop_start = try self.addInst(.{ |
| 5859 | .tag = .cmp, |
| 5860 | .ops = .ri_u, |
| 5861 | .data = .{ .ri_u = .{ |
| 5862 | .r1 = count_reg, |
| 5863 | .imm = 0, |
| 5864 | } }, |
| 5865 | }); |
| 5866 | const loop_reloc = try self.addInst(.{ |
| 5867 | .tag = .jcc, |
| 5868 | .ops = .inst_cc, |
| 5869 | .data = .{ .inst_cc = .{ |
| 5870 | .inst = undefined, |
| 5871 | .cc = .e, |
| 5872 | } }, |
| 5873 | }); |
| 5900 | 5874 | |
| 5901 | 5875 | // mov tmp, [addr + index_reg] |
| 5902 | 5876 | // _ = try self.addInst(.{ |
| ... | ... | @@ -5918,29 +5892,16 @@ fn genInlineMemcpy( |
| 5918 | 5892 | // .data = .{ .payload = try self.addExtra(Mir.IndexRegisterDisp.encode(index_reg, 0)) }, |
| 5919 | 5893 | // }); |
| 5920 | 5894 | |
| 5921 | | // add index_reg, 1 |
| 5922 | | // _ = try self.addInst(.{ |
| 5923 | | // .tag = .add, |
| 5924 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = index_reg }), |
| 5925 | | // .data = .{ .imm = 1 }, |
| 5926 | | // }); |
| 5927 | | |
| 5928 | | // sub count, 1 |
| 5929 | | // _ = try self.addInst(.{ |
| 5930 | | // .tag = .sub, |
| 5931 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = count_reg }), |
| 5932 | | // .data = .{ .imm = 1 }, |
| 5933 | | // }); |
| 5895 | try self.asmRegisterImmediate(.add, index_reg, Immediate.u(1)); |
| 5896 | try self.asmRegisterImmediate(.sub, count_reg, Immediate.u(1)); |
| 5934 | 5897 | |
| 5935 | | // jmp loop |
| 5936 | | // _ = try self.addInst(.{ |
| 5937 | | // .tag = .jmp, |
| 5938 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 5939 | | // .data = .{ .inst = loop_start }, |
| 5940 | | // }); |
| 5898 | _ = try self.addInst(.{ |
| 5899 | .tag = .jmp, |
| 5900 | .ops = .inst, |
| 5901 | .data = .{ .inst = loop_start }, |
| 5902 | }); |
| 5941 | 5903 | |
| 5942 | | // end: |
| 5943 | | // try self.performReloc(loop_reloc); |
| 5904 | try self.performReloc(loop_reloc); |
| 5944 | 5905 | } |
| 5945 | 5906 | |
| 5946 | 5907 | fn genInlineMemset( |
| ... | ... | @@ -5982,15 +5943,11 @@ fn genInlineMemset( |
| 5982 | 5943 | // }); |
| 5983 | 5944 | }, |
| 5984 | 5945 | .register => |reg| { |
| 5985 | | _ = reg; |
| 5986 | | // _ = try self.addInst(.{ |
| 5987 | | // .tag = .mov, |
| 5988 | | // .ops = Mir.Inst.Ops.encode(.{ |
| 5989 | | // .reg1 = registerAlias(addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5990 | | // .reg2 = reg, |
| 5991 | | // }), |
| 5992 | | // .data = undefined, |
| 5993 | | // }); |
| 5946 | try self.asmRegisterRegister( |
| 5947 | .mov, |
| 5948 | registerAlias(addr_reg, @intCast(u32, @divExact(reg.bitSize(), 8))), |
| 5949 | reg, |
| 5950 | ); |
| 5994 | 5951 | }, |
| 5995 | 5952 | else => { |
| 5996 | 5953 | return self.fail("TODO implement memcpy for setting stack when dest is {}", .{dst_ptr}); |
| ... | ... | @@ -6000,26 +5957,23 @@ fn genInlineMemset( |
| 6000 | 5957 | try self.genSetReg(Type.usize, index_reg, len); |
| 6001 | 5958 | try self.genBinOpMir(.sub, Type.usize, .{ .register = index_reg }, .{ .immediate = 1 }); |
| 6002 | 5959 | |
| 6003 | | // loop: |
| 6004 | | // cmp index_reg, -1 |
| 6005 | | // const loop_start = try self.addInst(.{ |
| 6006 | | // .tag = .cmp, |
| 6007 | | // .ops = Mir.Inst.Ops.encode(.{ |
| 6008 | | // .reg1 = index_reg, |
| 6009 | | // .flags = 0b11, |
| 6010 | | // }), |
| 6011 | | // .data = .{ .imm_s = -1 }, |
| 6012 | | // }); |
| 5960 | const loop_start = try self.addInst(.{ |
| 5961 | .tag = .cmp, |
| 5962 | .ops = .ri_s, |
| 5963 | .data = .{ .ri_s = .{ |
| 5964 | .r1 = index_reg, |
| 5965 | .imm = -1, |
| 5966 | } }, |
| 5967 | }); |
| 6013 | 5968 | |
| 6014 | | // je end |
| 6015 | | // const loop_reloc = try self.addInst(.{ |
| 6016 | | // .tag = .cond_jmp, |
| 6017 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 6018 | | // .data = .{ .inst_cc = .{ |
| 6019 | | // .inst = undefined, |
| 6020 | | // .cc = .e, |
| 6021 | | // } }, |
| 6022 | | // }); |
| 5969 | const loop_reloc = try self.addInst(.{ |
| 5970 | .tag = .jcc, |
| 5971 | .ops = .inst_cc, |
| 5972 | .data = .{ .inst_cc = .{ |
| 5973 | .inst = undefined, |
| 5974 | .cc = .e, |
| 5975 | } }, |
| 5976 | }); |
| 6023 | 5977 | |
| 6024 | 5978 | switch (value) { |
| 6025 | 5979 | .immediate => |x| { |
| ... | ... | @@ -6042,22 +5996,15 @@ fn genInlineMemset( |
| 6042 | 5996 | else => return self.fail("TODO inline memset for value of type {}", .{value}), |
| 6043 | 5997 | } |
| 6044 | 5998 | |
| 6045 | | // sub index_reg, 1 |
| 6046 | | // _ = try self.addInst(.{ |
| 6047 | | // .tag = .sub, |
| 6048 | | // .ops = Mir.Inst.Ops.encode(.{ .reg1 = index_reg }), |
| 6049 | | // .data = .{ .imm = 1 }, |
| 6050 | | // }); |
| 5999 | try self.asmRegisterImmediate(.sub, index_reg, Immediate.u(1)); |
| 6051 | 6000 | |
| 6052 | | // jmp loop |
| 6053 | | // _ = try self.addInst(.{ |
| 6054 | | // .tag = .jmp, |
| 6055 | | // .ops = Mir.Inst.Ops.encode(.{}), |
| 6056 | | // .data = .{ .inst = loop_start }, |
| 6057 | | // }); |
| 6001 | _ = try self.addInst(.{ |
| 6002 | .tag = .jmp, |
| 6003 | .ops = .inst, |
| 6004 | .data = .{ .inst = loop_start }, |
| 6005 | }); |
| 6058 | 6006 | |
| 6059 | | // end: |
| 6060 | | // try self.performReloc(loop_reloc); |
| 6007 | try self.performReloc(loop_reloc); |
| 6061 | 6008 | } |
| 6062 | 6009 | |
| 6063 | 6010 | fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void { |