| ... | ... | @@ -17443,21 +17443,22 @@ fn genBinOp( |
| 17443 | 17443 | .float => switch (lhs_ty.floatBits(self.target.*)) { |
| 17444 | 17444 | 16 => { |
| 17445 | 17445 | assert(self.hasFeature(.f16c)); |
| 17446 | | const tmp_reg = |
| 17447 | | (try self.register_manager.allocReg(null, abi.RegisterClass.sse)).to128(); |
| 17446 | const lhs_reg = if (copied_to_dst) dst_reg else registerAlias(lhs_mcv.getReg().?, abi_size); |
| 17447 | |
| 17448 | const tmp_reg = (try self.register_manager.allocReg(null, abi.RegisterClass.sse)).to128(); |
| 17448 | 17449 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 17449 | 17450 | defer self.register_manager.unlockReg(tmp_lock); |
| 17450 | 17451 | |
| 17451 | 17452 | if (src_mcv.isBase()) try self.asmRegisterRegisterMemoryImmediate( |
| 17452 | 17453 | .{ .vp_w, .insr }, |
| 17453 | 17454 | dst_reg, |
| 17454 | | dst_reg, |
| 17455 | lhs_reg, |
| 17455 | 17456 | try src_mcv.mem(self, .{ .size = .word }), |
| 17456 | 17457 | .u(1), |
| 17457 | 17458 | ) else try self.asmRegisterRegisterRegister( |
| 17458 | 17459 | .{ .vp_, .unpcklwd }, |
| 17459 | 17460 | dst_reg, |
| 17460 | | dst_reg, |
| 17461 | lhs_reg, |
| 17461 | 17462 | (if (src_mcv.isRegister()) |
| 17462 | 17463 | src_mcv.getReg().? |
| 17463 | 17464 | else |
| ... | ... | @@ -17885,25 +17886,24 @@ fn genBinOp( |
| 17885 | 17886 | .float => switch (lhs_ty.childType(zcu).floatBits(self.target.*)) { |
| 17886 | 17887 | 16 => tag: { |
| 17887 | 17888 | assert(self.hasFeature(.f16c)); |
| 17889 | const lhs_reg = if (copied_to_dst) dst_reg else registerAlias(lhs_mcv.getReg().?, abi_size); |
| 17888 | 17890 | switch (lhs_ty.vectorLen(zcu)) { |
| 17889 | 17891 | 1 => { |
| 17890 | | const tmp_reg = (try self.register_manager.allocReg( |
| 17891 | | null, |
| 17892 | | abi.RegisterClass.sse, |
| 17893 | | )).to128(); |
| 17892 | const tmp_reg = |
| 17893 | (try self.register_manager.allocReg(null, abi.RegisterClass.sse)).to128(); |
| 17894 | 17894 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 17895 | 17895 | defer self.register_manager.unlockReg(tmp_lock); |
| 17896 | 17896 | |
| 17897 | 17897 | if (src_mcv.isBase()) try self.asmRegisterRegisterMemoryImmediate( |
| 17898 | 17898 | .{ .vp_w, .insr }, |
| 17899 | 17899 | dst_reg, |
| 17900 | | dst_reg, |
| 17900 | lhs_reg, |
| 17901 | 17901 | try src_mcv.mem(self, .{ .size = .word }), |
| 17902 | 17902 | .u(1), |
| 17903 | 17903 | ) else try self.asmRegisterRegisterRegister( |
| 17904 | 17904 | .{ .vp_, .unpcklwd }, |
| 17905 | 17905 | dst_reg, |
| 17906 | | dst_reg, |
| 17906 | lhs_reg, |
| 17907 | 17907 | (if (src_mcv.isRegister()) |
| 17908 | 17908 | src_mcv.getReg().? |
| 17909 | 17909 | else |
| ... | ... | @@ -17941,15 +17941,16 @@ fn genBinOp( |
| 17941 | 17941 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 17942 | 17942 | defer self.register_manager.unlockReg(tmp_lock); |
| 17943 | 17943 | |
| 17944 | | if (src_mcv.isBase()) try self.asmRegisterMemoryImmediate( |
| 17944 | if (src_mcv.isBase()) try self.asmRegisterRegisterMemoryImmediate( |
| 17945 | 17945 | .{ .vp_d, .insr }, |
| 17946 | 17946 | dst_reg, |
| 17947 | lhs_reg, |
| 17947 | 17948 | try src_mcv.mem(self, .{ .size = .dword }), |
| 17948 | 17949 | .u(1), |
| 17949 | 17950 | ) else try self.asmRegisterRegisterRegister( |
| 17950 | 17951 | .{ .v_ps, .unpckl }, |
| 17951 | 17952 | dst_reg, |
| 17952 | | dst_reg, |
| 17953 | lhs_reg, |
| 17953 | 17954 | (if (src_mcv.isRegister()) |
| 17954 | 17955 | src_mcv.getReg().? |
| 17955 | 17956 | else |
| ... | ... | @@ -17992,7 +17993,7 @@ fn genBinOp( |
| 17992 | 17993 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 17993 | 17994 | defer self.register_manager.unlockReg(tmp_lock); |
| 17994 | 17995 | |
| 17995 | | try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg, dst_reg); |
| 17996 | try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg, lhs_reg); |
| 17996 | 17997 | if (src_mcv.isBase()) try self.asmRegisterMemory( |
| 17997 | 17998 | .{ .v_ps, .cvtph2 }, |
| 17998 | 17999 | tmp_reg, |
| ... | ... | @@ -18035,7 +18036,7 @@ fn genBinOp( |
| 18035 | 18036 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 18036 | 18037 | defer self.register_manager.unlockReg(tmp_lock); |
| 18037 | 18038 | |
| 18038 | | try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg.to256(), dst_reg); |
| 18039 | try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg.to256(), lhs_reg); |
| 18039 | 18040 | if (src_mcv.isBase()) try self.asmRegisterMemory( |
| 18040 | 18041 | .{ .v_ps, .cvtph2 }, |
| 18041 | 18042 | tmp_reg, |
| ... | ... | @@ -18196,8 +18197,7 @@ fn genBinOp( |
| 18196 | 18197 | |
| 18197 | 18198 | switch (mir_tag[1]) { |
| 18198 | 18199 | else => if (self.hasFeature(.avx)) { |
| 18199 | | const lhs_reg = |
| 18200 | | if (copied_to_dst) dst_reg else registerAlias(lhs_mcv.getReg().?, abi_size); |
| 18200 | const lhs_reg = if (copied_to_dst) dst_reg else registerAlias(lhs_mcv.getReg().?, abi_size); |
| 18201 | 18201 | if (src_mcv.isBase()) try self.asmRegisterRegisterMemory( |
| 18202 | 18202 | mir_tag, |
| 18203 | 18203 | dst_reg, |