| ... | ... | @@ -2217,7 +2217,26 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs: |
| 2217 | 2217 | // Now for step 2, we assing an MIR instruction |
| 2218 | 2218 | const air_tags = self.air.instructions.items(.tag); |
| 2219 | 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 | 2240 | .bool_or, .bit_or => try self.genBinMathOpMir(.@"or", dst_ty, dst_mcv, src_mcv), |
| 2222 | 2241 | .bool_and, .bit_and => try self.genBinMathOpMir(.@"and", dst_ty, dst_mcv, src_mcv), |
| 2223 | 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 | 2263 | .none => unreachable, |
| 2245 | 2264 | .undef => try self.genSetReg(dst_ty, dst_reg, .undef), |
| 2246 | 2265 | .dead, .unreach => unreachable, |
| 2247 | | .ptr_stack_offset => |off| { |
| 2248 | | return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .immediate = @bitCast(u32, off) }); |
| 2266 | .ptr_stack_offset => { |
| 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 | 2272 | .ptr_embedded_in_code => unreachable, |
| 2251 | 2273 | .register => |src_reg| { |