| ... | @@ -2217,7 +2217,26 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs: | ... | @@ -2217,7 +2217,26 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs: |
| 2217 | // Now for step 2, we assing an MIR instruction | 2217 | // Now for step 2, we assing an MIR instruction |
| 2218 | const air_tags = self.air.instructions.items(.tag); | 2218 | const air_tags = self.air.instructions.items(.tag); |
| 2219 | switch (air_tags[inst]) { | 2219 | switch (air_tags[inst]) { |
| 2220 | .add, .addwrap, .ptr_add => try self.genBinMathOpMir(.add, dst_ty, dst_mcv, src_mcv), | 2220 | .ptr_add => { |
| | 2221 | // TODO clean this up |
| | 2222 | // TODO take into account alignment |
| | 2223 | const elem_size = dst_ty.elemType2().abiSize(self.target.*); |
| | 2224 | const dst_reg = blk: { |
| | 2225 | switch (dst_mcv) { |
| | 2226 | .register => |reg| break :blk reg, |
| | 2227 | else => { |
| | 2228 | src_mcv.freezeIfRegister(&self.register_manager); |
| | 2229 | defer src_mcv.freezeIfRegister(&self.register_manager); |
| | 2230 | const reg = try self.copyToTmpRegister(dst_ty, dst_mcv); |
| | 2231 | break :blk reg; |
| | 2232 | }, |
| | 2233 | } |
| | 2234 | }; |
| | 2235 | try self.genIMulOpMir(dst_ty, .{ .register = dst_reg }, .{ .immediate = elem_size }); |
| | 2236 | dst_mcv = MCValue{ .register = dst_reg }; |
| | 2237 | try self.genBinMathOpMir(.add, dst_ty, dst_mcv, src_mcv); |
| | 2238 | }, |
| | 2239 | .add, .addwrap => try self.genBinMathOpMir(.add, dst_ty, dst_mcv, src_mcv), |
| 2221 | .bool_or, .bit_or => try self.genBinMathOpMir(.@"or", dst_ty, dst_mcv, src_mcv), | 2240 | .bool_or, .bit_or => try self.genBinMathOpMir(.@"or", dst_ty, dst_mcv, src_mcv), |
| 2222 | .bool_and, .bit_and => try self.genBinMathOpMir(.@"and", dst_ty, dst_mcv, src_mcv), | 2241 | .bool_and, .bit_and => try self.genBinMathOpMir(.@"and", dst_ty, dst_mcv, src_mcv), |
| 2223 | .sub, .subwrap => try self.genBinMathOpMir(.sub, dst_ty, dst_mcv, src_mcv), | 2242 | .sub, .subwrap => try self.genBinMathOpMir(.sub, dst_ty, dst_mcv, src_mcv), |
| ... | @@ -2244,8 +2263,11 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC | ... | @@ -2244,8 +2263,11 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC |
| 2244 | .none => unreachable, | 2263 | .none => unreachable, |
| 2245 | .undef => try self.genSetReg(dst_ty, dst_reg, .undef), | 2264 | .undef => try self.genSetReg(dst_ty, dst_reg, .undef), |
| 2246 | .dead, .unreach => unreachable, | 2265 | .dead, .unreach => unreachable, |
| 2247 | .ptr_stack_offset => |off| { | 2266 | .ptr_stack_offset => { |
| 2248 | return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .immediate = @bitCast(u32, off) }); | 2267 | self.register_manager.freezeRegs(&.{dst_reg}); |
| | 2268 | defer self.register_manager.unfreezeRegs(&.{dst_reg}); |
| | 2269 | const reg = try self.copyToTmpRegister(dst_ty, src_mcv); |
| | 2270 | return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg }); |
| 2249 | }, | 2271 | }, |
| 2250 | .ptr_embedded_in_code => unreachable, | 2272 | .ptr_embedded_in_code => unreachable, |
| 2251 | .register => |src_reg| { | 2273 | .register => |src_reg| { |