| ... | ... | @@ -2443,7 +2443,7 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void { |
| 2443 | 2443 | else |
| 2444 | 2444 | try self.copyToTmpRegister(src_ty, src_mcv); |
| 2445 | 2445 | try self.asmRegisterRegisterImmediate( |
| 2446 | | .{ ._, .vcvtps2ph }, |
| 2446 | .{ .v_, .cvtps2ph }, |
| 2447 | 2447 | dst_reg, |
| 2448 | 2448 | mat_src_reg.to128(), |
| 2449 | 2449 | Immediate.u(0b1_00), |
| ... | ... | @@ -2455,12 +2455,12 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void { |
| 2455 | 2455 | } |
| 2456 | 2456 | } else if (src_bits == 64 and dst_bits == 32) { |
| 2457 | 2457 | if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory( |
| 2458 | | .{ ._, .vcvtsd2ss }, |
| 2458 | .{ .v_, .cvtsd2ss }, |
| 2459 | 2459 | dst_reg, |
| 2460 | 2460 | dst_reg, |
| 2461 | 2461 | src_mcv.mem(.qword), |
| 2462 | 2462 | ) else try self.asmRegisterRegisterRegister( |
| 2463 | | .{ ._, .vcvtsd2ss }, |
| 2463 | .{ .v_, .cvtsd2ss }, |
| 2464 | 2464 | dst_reg, |
| 2465 | 2465 | dst_reg, |
| 2466 | 2466 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -2506,22 +2506,22 @@ fn airFpext(self: *Self, inst: Air.Inst.Index) !void { |
| 2506 | 2506 | src_mcv.getReg().? |
| 2507 | 2507 | else |
| 2508 | 2508 | try self.copyToTmpRegister(src_ty, src_mcv); |
| 2509 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, mat_src_reg.to128()); |
| 2509 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, mat_src_reg.to128()); |
| 2510 | 2510 | switch (dst_bits) { |
| 2511 | 2511 | 32 => {}, |
| 2512 | | 64 => try self.asmRegisterRegisterRegister(.{ ._, .vcvtss2sd }, dst_reg, dst_reg, dst_reg), |
| 2512 | 64 => try self.asmRegisterRegisterRegister(.{ .v_, .cvtss2sd }, dst_reg, dst_reg, dst_reg), |
| 2513 | 2513 | else => return self.fail("TODO implement airFpext from {} to {}", .{ |
| 2514 | 2514 | src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?), |
| 2515 | 2515 | }), |
| 2516 | 2516 | } |
| 2517 | 2517 | } else if (src_bits == 32 and dst_bits == 64) { |
| 2518 | 2518 | if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory( |
| 2519 | | .{ ._, .vcvtss2sd }, |
| 2519 | .{ .v_, .cvtss2sd }, |
| 2520 | 2520 | dst_reg, |
| 2521 | 2521 | dst_reg, |
| 2522 | 2522 | src_mcv.mem(.dword), |
| 2523 | 2523 | ) else try self.asmRegisterRegisterRegister( |
| 2524 | | .{ ._, .vcvtss2sd }, |
| 2524 | .{ .v_, .cvtss2sd }, |
| 2525 | 2525 | dst_reg, |
| 2526 | 2526 | dst_reg, |
| 2527 | 2527 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -4678,8 +4678,8 @@ fn airFloatSign(self: *Self, inst: Air.Inst.Index) !void { |
| 4678 | 4678 | try self.genBinOpMir(switch (ty_bits) { |
| 4679 | 4679 | // No point using an extra prefix byte for *pd which performs the same operation. |
| 4680 | 4680 | 16, 32, 64, 128 => switch (tag) { |
| 4681 | | .neg => .{ ._, .xorps }, |
| 4682 | | .fabs => .{ ._, .andnps }, |
| 4681 | .neg => .{ ._ps, .xor }, |
| 4682 | .fabs => .{ ._ps, .andn }, |
| 4683 | 4683 | else => unreachable, |
| 4684 | 4684 | }, |
| 4685 | 4685 | 80 => return self.fail("TODO implement airFloatSign for {}", .{ |
| ... | ... | @@ -4712,23 +4712,23 @@ fn genRound(self: *Self, ty: Type, dst_reg: Register, src_mcv: MCValue, mode: u4 |
| 4712 | 4712 | |
| 4713 | 4713 | const mir_tag = if (@as(?Mir.Inst.FixedTag, switch (ty.zigTypeTag()) { |
| 4714 | 4714 | .Float => switch (ty.floatBits(self.target.*)) { |
| 4715 | | 32 => if (self.hasFeature(.avx)) .{ ._, .vroundss } else .{ ._, .roundss }, |
| 4716 | | 64 => if (self.hasFeature(.avx)) .{ ._, .vroundsd } else .{ ._, .roundsd }, |
| 4715 | 32 => if (self.hasFeature(.avx)) .{ .v_ss, .round } else .{ ._ss, .round }, |
| 4716 | 64 => if (self.hasFeature(.avx)) .{ .v_sd, .round } else .{ ._sd, .round }, |
| 4717 | 4717 | 16, 80, 128 => null, |
| 4718 | 4718 | else => unreachable, |
| 4719 | 4719 | }, |
| 4720 | 4720 | .Vector => switch (ty.childType().zigTypeTag()) { |
| 4721 | 4721 | .Float => switch (ty.childType().floatBits(self.target.*)) { |
| 4722 | 4722 | 32 => switch (ty.vectorLen()) { |
| 4723 | | 1 => if (self.hasFeature(.avx)) .{ ._, .vroundss } else .{ ._, .roundss }, |
| 4724 | | 2...4 => if (self.hasFeature(.avx)) .{ ._, .vroundps } else .{ ._, .roundps }, |
| 4725 | | 5...8 => if (self.hasFeature(.avx)) .{ ._, .vroundps } else null, |
| 4723 | 1 => if (self.hasFeature(.avx)) .{ .v_ss, .round } else .{ ._ss, .round }, |
| 4724 | 2...4 => if (self.hasFeature(.avx)) .{ .v_ps, .round } else .{ ._ps, .round }, |
| 4725 | 5...8 => if (self.hasFeature(.avx)) .{ .v_ps, .round } else null, |
| 4726 | 4726 | else => null, |
| 4727 | 4727 | }, |
| 4728 | 4728 | 64 => switch (ty.vectorLen()) { |
| 4729 | | 1 => if (self.hasFeature(.avx)) .{ ._, .vroundsd } else .{ ._, .roundsd }, |
| 4730 | | 2 => if (self.hasFeature(.avx)) .{ ._, .vroundpd } else .{ ._, .roundpd }, |
| 4731 | | 3...4 => if (self.hasFeature(.avx)) .{ ._, .vroundpd } else null, |
| 4729 | 1 => if (self.hasFeature(.avx)) .{ .v_sd, .round } else .{ ._sd, .round }, |
| 4730 | 2 => if (self.hasFeature(.avx)) .{ .v_pd, .round } else .{ ._pd, .round }, |
| 4731 | 3...4 => if (self.hasFeature(.avx)) .{ .v_pd, .round } else null, |
| 4732 | 4732 | else => null, |
| 4733 | 4733 | }, |
| 4734 | 4734 | 16, 80, 128 => null, |
| ... | ... | @@ -4743,8 +4743,8 @@ fn genRound(self: *Self, ty: Type, dst_reg: Register, src_mcv: MCValue, mode: u4 |
| 4743 | 4743 | |
| 4744 | 4744 | const abi_size = @intCast(u32, ty.abiSize(self.target.*)); |
| 4745 | 4745 | const dst_alias = registerAlias(dst_reg, abi_size); |
| 4746 | | switch (mir_tag[1]) { |
| 4747 | | .vroundss, .vroundsd => if (src_mcv.isMemory()) try self.asmRegisterRegisterMemoryImmediate( |
| 4746 | switch (mir_tag[0]) { |
| 4747 | .v_ss, .v_sd => if (src_mcv.isMemory()) try self.asmRegisterRegisterMemoryImmediate( |
| 4748 | 4748 | mir_tag, |
| 4749 | 4749 | dst_alias, |
| 4750 | 4750 | dst_alias, |
| ... | ... | @@ -4799,18 +4799,18 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4799 | 4799 | src_mcv.getReg().? |
| 4800 | 4800 | else |
| 4801 | 4801 | try self.copyToTmpRegister(ty, src_mcv); |
| 4802 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, mat_src_reg.to128()); |
| 4803 | | try self.asmRegisterRegisterRegister(.{ ._, .vsqrtss }, dst_reg, dst_reg, dst_reg); |
| 4802 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, mat_src_reg.to128()); |
| 4803 | try self.asmRegisterRegisterRegister(.{ .v_ss, .sqrt }, dst_reg, dst_reg, dst_reg); |
| 4804 | 4804 | try self.asmRegisterRegisterImmediate( |
| 4805 | | .{ ._, .vcvtps2ph }, |
| 4805 | .{ .v_, .cvtps2ph }, |
| 4806 | 4806 | dst_reg, |
| 4807 | 4807 | dst_reg, |
| 4808 | 4808 | Immediate.u(0b1_00), |
| 4809 | 4809 | ); |
| 4810 | 4810 | break :result dst_mcv; |
| 4811 | 4811 | } else null, |
| 4812 | | 32 => if (self.hasFeature(.avx)) .{ ._, .vsqrtss } else .{ ._, .sqrtss }, |
| 4813 | | 64 => if (self.hasFeature(.avx)) .{ ._, .vsqrtsd } else .{ ._, .sqrtsd }, |
| 4812 | 32 => if (self.hasFeature(.avx)) .{ .v_ss, .sqrt } else .{ ._ss, .sqrt }, |
| 4813 | 64 => if (self.hasFeature(.avx)) .{ .v_sd, .sqrt } else .{ ._sd, .sqrt }, |
| 4814 | 4814 | 80, 128 => null, |
| 4815 | 4815 | else => unreachable, |
| 4816 | 4816 | }, |
| ... | ... | @@ -4819,7 +4819,7 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4819 | 4819 | 16 => if (self.hasFeature(.f16c)) switch (ty.vectorLen()) { |
| 4820 | 4820 | 1 => { |
| 4821 | 4821 | try self.asmRegisterRegister( |
| 4822 | | .{ ._, .vcvtph2ps }, |
| 4822 | .{ .v_, .cvtph2ps }, |
| 4823 | 4823 | dst_reg, |
| 4824 | 4824 | (if (src_mcv.isRegister()) |
| 4825 | 4825 | src_mcv.getReg().? |
| ... | ... | @@ -4827,13 +4827,13 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4827 | 4827 | try self.copyToTmpRegister(ty, src_mcv)).to128(), |
| 4828 | 4828 | ); |
| 4829 | 4829 | try self.asmRegisterRegisterRegister( |
| 4830 | | .{ ._, .vsqrtss }, |
| 4830 | .{ .v_ss, .sqrt }, |
| 4831 | 4831 | dst_reg, |
| 4832 | 4832 | dst_reg, |
| 4833 | 4833 | dst_reg, |
| 4834 | 4834 | ); |
| 4835 | 4835 | try self.asmRegisterRegisterImmediate( |
| 4836 | | .{ ._, .vcvtps2ph }, |
| 4836 | .{ .v_, .cvtps2ph }, |
| 4837 | 4837 | dst_reg, |
| 4838 | 4838 | dst_reg, |
| 4839 | 4839 | Immediate.u(0b1_00), |
| ... | ... | @@ -4843,22 +4843,22 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4843 | 4843 | 2...8 => { |
| 4844 | 4844 | const wide_reg = registerAlias(dst_reg, abi_size * 2); |
| 4845 | 4845 | if (src_mcv.isMemory()) try self.asmRegisterMemory( |
| 4846 | | .{ ._, .vcvtph2ps }, |
| 4846 | .{ .v_, .cvtph2ps }, |
| 4847 | 4847 | wide_reg, |
| 4848 | 4848 | src_mcv.mem(Memory.PtrSize.fromSize( |
| 4849 | 4849 | @intCast(u32, @divExact(wide_reg.bitSize(), 16)), |
| 4850 | 4850 | )), |
| 4851 | 4851 | ) else try self.asmRegisterRegister( |
| 4852 | | .{ ._, .vcvtph2ps }, |
| 4852 | .{ .v_, .cvtph2ps }, |
| 4853 | 4853 | wide_reg, |
| 4854 | 4854 | (if (src_mcv.isRegister()) |
| 4855 | 4855 | src_mcv.getReg().? |
| 4856 | 4856 | else |
| 4857 | 4857 | try self.copyToTmpRegister(ty, src_mcv)).to128(), |
| 4858 | 4858 | ); |
| 4859 | | try self.asmRegisterRegister(.{ ._, .vsqrtps }, wide_reg, wide_reg); |
| 4859 | try self.asmRegisterRegister(.{ .v_ps, .sqrt }, wide_reg, wide_reg); |
| 4860 | 4860 | try self.asmRegisterRegisterImmediate( |
| 4861 | | .{ ._, .vcvtps2ph }, |
| 4861 | .{ .v_, .cvtps2ph }, |
| 4862 | 4862 | dst_reg, |
| 4863 | 4863 | wide_reg, |
| 4864 | 4864 | Immediate.u(0b1_00), |
| ... | ... | @@ -4868,15 +4868,15 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4868 | 4868 | else => null, |
| 4869 | 4869 | } else null, |
| 4870 | 4870 | 32 => switch (ty.vectorLen()) { |
| 4871 | | 1 => if (self.hasFeature(.avx)) .{ ._, .vsqrtss } else .{ ._, .sqrtss }, |
| 4872 | | 2...4 => if (self.hasFeature(.avx)) .{ ._, .vsqrtps } else .{ ._, .sqrtps }, |
| 4873 | | 5...8 => if (self.hasFeature(.avx)) .{ ._, .vsqrtps } else null, |
| 4871 | 1 => if (self.hasFeature(.avx)) .{ .v_ss, .sqrt } else .{ ._ss, .sqrt }, |
| 4872 | 2...4 => if (self.hasFeature(.avx)) .{ .v_ps, .sqrt } else .{ ._ps, .sqrt }, |
| 4873 | 5...8 => if (self.hasFeature(.avx)) .{ .v_ps, .sqrt } else null, |
| 4874 | 4874 | else => null, |
| 4875 | 4875 | }, |
| 4876 | 4876 | 64 => switch (ty.vectorLen()) { |
| 4877 | | 1 => if (self.hasFeature(.avx)) .{ ._, .vsqrtsd } else .{ ._, .sqrtsd }, |
| 4878 | | 2 => if (self.hasFeature(.avx)) .{ ._, .vsqrtpd } else .{ ._, .sqrtpd }, |
| 4879 | | 3...4 => if (self.hasFeature(.avx)) .{ ._, .vsqrtpd } else null, |
| 4877 | 1 => if (self.hasFeature(.avx)) .{ .v_sd, .sqrt } else .{ ._sd, .sqrt }, |
| 4878 | 2 => if (self.hasFeature(.avx)) .{ .v_pd, .sqrt } else .{ ._pd, .sqrt }, |
| 4879 | 3...4 => if (self.hasFeature(.avx)) .{ .v_pd, .sqrt } else null, |
| 4880 | 4880 | else => null, |
| 4881 | 4881 | }, |
| 4882 | 4882 | 80, 128 => null, |
| ... | ... | @@ -4888,8 +4888,8 @@ fn airSqrt(self: *Self, inst: Air.Inst.Index) !void { |
| 4888 | 4888 | })) |tag| tag else return self.fail("TODO implement airSqrt for {}", .{ |
| 4889 | 4889 | ty.fmt(self.bin_file.options.module.?), |
| 4890 | 4890 | }); |
| 4891 | | switch (mir_tag[1]) { |
| 4892 | | .vsqrtss, .vsqrtsd => if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory( |
| 4891 | switch (mir_tag[0]) { |
| 4892 | .v_ss, .v_sd => if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory( |
| 4893 | 4893 | mir_tag, |
| 4894 | 4894 | dst_reg, |
| 4895 | 4895 | dst_reg, |
| ... | ... | @@ -6325,13 +6325,13 @@ fn genBinOp( |
| 6325 | 6325 | defer self.register_manager.unlockReg(tmp_lock); |
| 6326 | 6326 | |
| 6327 | 6327 | if (src_mcv.isMemory()) try self.asmRegisterRegisterMemoryImmediate( |
| 6328 | | .{ ._, .vpinsrw }, |
| 6328 | .{ .vp_w, .insr }, |
| 6329 | 6329 | dst_reg, |
| 6330 | 6330 | dst_reg, |
| 6331 | 6331 | src_mcv.mem(.word), |
| 6332 | 6332 | Immediate.u(1), |
| 6333 | 6333 | ) else try self.asmRegisterRegisterRegister( |
| 6334 | | .{ ._, .vpunpcklwd }, |
| 6334 | .{ .vp_, .unpcklwd }, |
| 6335 | 6335 | dst_reg, |
| 6336 | 6336 | dst_reg, |
| 6337 | 6337 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -6339,15 +6339,15 @@ fn genBinOp( |
| 6339 | 6339 | else |
| 6340 | 6340 | try self.copyToTmpRegister(rhs_ty, src_mcv)).to128(), |
| 6341 | 6341 | ); |
| 6342 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, dst_reg); |
| 6343 | | try self.asmRegisterRegister(.{ ._, .vmovshdup }, tmp_reg, dst_reg); |
| 6342 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, dst_reg); |
| 6343 | try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp_reg, dst_reg); |
| 6344 | 6344 | try self.asmRegisterRegisterRegister( |
| 6345 | 6345 | switch (air_tag) { |
| 6346 | | .add => .{ ._, .vaddss }, |
| 6347 | | .sub => .{ ._, .vsubss }, |
| 6348 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivss }, |
| 6349 | | .max => .{ ._, .vmaxss }, |
| 6350 | | .min => .{ ._, .vmaxss }, |
| 6346 | .add => .{ .v_ss, .add }, |
| 6347 | .sub => .{ .v_ss, .sub }, |
| 6348 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ss, .div }, |
| 6349 | .max => .{ .v_ss, .max }, |
| 6350 | .min => .{ .v_ss, .max }, |
| 6351 | 6351 | else => unreachable, |
| 6352 | 6352 | }, |
| 6353 | 6353 | dst_reg, |
| ... | ... | @@ -6355,7 +6355,7 @@ fn genBinOp( |
| 6355 | 6355 | tmp_reg, |
| 6356 | 6356 | ); |
| 6357 | 6357 | try self.asmRegisterRegisterImmediate( |
| 6358 | | .{ ._, .vcvtps2ph }, |
| 6358 | .{ .v_, .cvtps2ph }, |
| 6359 | 6359 | dst_reg, |
| 6360 | 6360 | dst_reg, |
| 6361 | 6361 | Immediate.u(0b1_00), |
| ... | ... | @@ -6363,29 +6363,29 @@ fn genBinOp( |
| 6363 | 6363 | return dst_mcv; |
| 6364 | 6364 | } else null, |
| 6365 | 6365 | 32 => switch (air_tag) { |
| 6366 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddss } else .{ ._, .addss }, |
| 6367 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubss } else .{ ._, .subss }, |
| 6368 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulss } else .{ ._, .mulss }, |
| 6366 | .add => if (self.hasFeature(.avx)) .{ .v_ss, .add } else .{ ._ss, .add }, |
| 6367 | .sub => if (self.hasFeature(.avx)) .{ .v_ss, .sub } else .{ ._ss, .sub }, |
| 6368 | .mul => if (self.hasFeature(.avx)) .{ .v_ss, .mul } else .{ ._ss, .mul }, |
| 6369 | 6369 | .div_float, |
| 6370 | 6370 | .div_trunc, |
| 6371 | 6371 | .div_floor, |
| 6372 | 6372 | .div_exact, |
| 6373 | | => if (self.hasFeature(.avx)) .{ ._, .vdivss } else .{ ._, .divss }, |
| 6374 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxss } else .{ ._, .maxss }, |
| 6375 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminss } else .{ ._, .minss }, |
| 6373 | => if (self.hasFeature(.avx)) .{ .v_ss, .div } else .{ ._ss, .div }, |
| 6374 | .max => if (self.hasFeature(.avx)) .{ .v_ss, .max } else .{ ._ss, .max }, |
| 6375 | .min => if (self.hasFeature(.avx)) .{ .v_ss, .min } else .{ ._ss, .min }, |
| 6376 | 6376 | else => unreachable, |
| 6377 | 6377 | }, |
| 6378 | 6378 | 64 => switch (air_tag) { |
| 6379 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddsd } else .{ ._, .addsd }, |
| 6380 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubsd } else .{ ._, .subsd }, |
| 6381 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulsd } else .{ ._, .mulsd }, |
| 6379 | .add => if (self.hasFeature(.avx)) .{ .v_sd, .add } else .{ ._sd, .add }, |
| 6380 | .sub => if (self.hasFeature(.avx)) .{ .v_sd, .sub } else .{ ._sd, .sub }, |
| 6381 | .mul => if (self.hasFeature(.avx)) .{ .v_sd, .mul } else .{ ._sd, .mul }, |
| 6382 | 6382 | .div_float, |
| 6383 | 6383 | .div_trunc, |
| 6384 | 6384 | .div_floor, |
| 6385 | 6385 | .div_exact, |
| 6386 | | => if (self.hasFeature(.avx)) .{ ._, .vdivsd } else .{ ._, .divsd }, |
| 6387 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxsd } else .{ ._, .maxsd }, |
| 6388 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminsd } else .{ ._, .minsd }, |
| 6386 | => if (self.hasFeature(.avx)) .{ .v_sd, .div } else .{ ._sd, .div }, |
| 6387 | .max => if (self.hasFeature(.avx)) .{ .v_sd, .max } else .{ ._sd, .max }, |
| 6388 | .min => if (self.hasFeature(.avx)) .{ .v_sd, .min } else .{ ._sd, .min }, |
| 6389 | 6389 | else => unreachable, |
| 6390 | 6390 | }, |
| 6391 | 6391 | 80, 128 => null, |
| ... | ... | @@ -6401,13 +6401,13 @@ fn genBinOp( |
| 6401 | 6401 | defer self.register_manager.unlockReg(tmp_lock); |
| 6402 | 6402 | |
| 6403 | 6403 | if (src_mcv.isMemory()) try self.asmRegisterRegisterMemoryImmediate( |
| 6404 | | .{ ._, .vpinsrw }, |
| 6404 | .{ .vp_w, .insr }, |
| 6405 | 6405 | dst_reg, |
| 6406 | 6406 | dst_reg, |
| 6407 | 6407 | src_mcv.mem(.word), |
| 6408 | 6408 | Immediate.u(1), |
| 6409 | 6409 | ) else try self.asmRegisterRegisterRegister( |
| 6410 | | .{ ._, .vpunpcklwd }, |
| 6410 | .{ .vp_, .unpcklwd }, |
| 6411 | 6411 | dst_reg, |
| 6412 | 6412 | dst_reg, |
| 6413 | 6413 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -6415,15 +6415,15 @@ fn genBinOp( |
| 6415 | 6415 | else |
| 6416 | 6416 | try self.copyToTmpRegister(rhs_ty, src_mcv)).to128(), |
| 6417 | 6417 | ); |
| 6418 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, dst_reg); |
| 6419 | | try self.asmRegisterRegister(.{ ._, .vmovshdup }, tmp_reg, dst_reg); |
| 6418 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, dst_reg); |
| 6419 | try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp_reg, dst_reg); |
| 6420 | 6420 | try self.asmRegisterRegisterRegister( |
| 6421 | 6421 | switch (air_tag) { |
| 6422 | | .add => .{ ._, .vaddss }, |
| 6423 | | .sub => .{ ._, .vsubss }, |
| 6424 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivss }, |
| 6425 | | .max => .{ ._, .vmaxss }, |
| 6426 | | .min => .{ ._, .vmaxss }, |
| 6422 | .add => .{ .v_ss, .add }, |
| 6423 | .sub => .{ .v_ss, .sub }, |
| 6424 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ss, .div }, |
| 6425 | .max => .{ .v_ss, .max }, |
| 6426 | .min => .{ .v_ss, .max }, |
| 6427 | 6427 | else => unreachable, |
| 6428 | 6428 | }, |
| 6429 | 6429 | dst_reg, |
| ... | ... | @@ -6431,7 +6431,7 @@ fn genBinOp( |
| 6431 | 6431 | tmp_reg, |
| 6432 | 6432 | ); |
| 6433 | 6433 | try self.asmRegisterRegisterImmediate( |
| 6434 | | .{ ._, .vcvtps2ph }, |
| 6434 | .{ .v_, .cvtps2ph }, |
| 6435 | 6435 | dst_reg, |
| 6436 | 6436 | dst_reg, |
| 6437 | 6437 | Immediate.u(0b1_00), |
| ... | ... | @@ -6444,12 +6444,12 @@ fn genBinOp( |
| 6444 | 6444 | defer self.register_manager.unlockReg(tmp_lock); |
| 6445 | 6445 | |
| 6446 | 6446 | if (src_mcv.isMemory()) try self.asmRegisterMemoryImmediate( |
| 6447 | | .{ ._, .vpinsrd }, |
| 6447 | .{ .vp_d, .insr }, |
| 6448 | 6448 | dst_reg, |
| 6449 | 6449 | src_mcv.mem(.dword), |
| 6450 | 6450 | Immediate.u(1), |
| 6451 | 6451 | ) else try self.asmRegisterRegisterRegister( |
| 6452 | | .{ ._, .vunpcklps }, |
| 6452 | .{ .v_ps, .unpckl }, |
| 6453 | 6453 | dst_reg, |
| 6454 | 6454 | dst_reg, |
| 6455 | 6455 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -6457,20 +6457,20 @@ fn genBinOp( |
| 6457 | 6457 | else |
| 6458 | 6458 | try self.copyToTmpRegister(rhs_ty, src_mcv)).to128(), |
| 6459 | 6459 | ); |
| 6460 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, dst_reg); |
| 6460 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, dst_reg); |
| 6461 | 6461 | try self.asmRegisterRegisterRegister( |
| 6462 | | .{ ._, .vmovhlps }, |
| 6462 | .{ .v_ps, .movhl }, |
| 6463 | 6463 | tmp_reg, |
| 6464 | 6464 | dst_reg, |
| 6465 | 6465 | dst_reg, |
| 6466 | 6466 | ); |
| 6467 | 6467 | try self.asmRegisterRegisterRegister( |
| 6468 | 6468 | switch (air_tag) { |
| 6469 | | .add => .{ ._, .vaddps }, |
| 6470 | | .sub => .{ ._, .vsubps }, |
| 6471 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivps }, |
| 6472 | | .max => .{ ._, .vmaxps }, |
| 6473 | | .min => .{ ._, .vmaxps }, |
| 6469 | .add => .{ .v_ps, .add }, |
| 6470 | .sub => .{ .v_ps, .sub }, |
| 6471 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ps, .div }, |
| 6472 | .max => .{ .v_ps, .max }, |
| 6473 | .min => .{ .v_ps, .max }, |
| 6474 | 6474 | else => unreachable, |
| 6475 | 6475 | }, |
| 6476 | 6476 | dst_reg, |
| ... | ... | @@ -6478,7 +6478,7 @@ fn genBinOp( |
| 6478 | 6478 | tmp_reg, |
| 6479 | 6479 | ); |
| 6480 | 6480 | try self.asmRegisterRegisterImmediate( |
| 6481 | | .{ ._, .vcvtps2ph }, |
| 6481 | .{ .v_, .cvtps2ph }, |
| 6482 | 6482 | dst_reg, |
| 6483 | 6483 | dst_reg, |
| 6484 | 6484 | Immediate.u(0b1_00), |
| ... | ... | @@ -6490,13 +6490,13 @@ fn genBinOp( |
| 6490 | 6490 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 6491 | 6491 | defer self.register_manager.unlockReg(tmp_lock); |
| 6492 | 6492 | |
| 6493 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg, dst_reg); |
| 6493 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg, dst_reg); |
| 6494 | 6494 | if (src_mcv.isMemory()) try self.asmRegisterMemory( |
| 6495 | | .{ ._, .vcvtph2ps }, |
| 6495 | .{ .v_, .cvtph2ps }, |
| 6496 | 6496 | tmp_reg, |
| 6497 | 6497 | src_mcv.mem(.qword), |
| 6498 | 6498 | ) else try self.asmRegisterRegister( |
| 6499 | | .{ ._, .vcvtph2ps }, |
| 6499 | .{ .v_, .cvtph2ps }, |
| 6500 | 6500 | tmp_reg, |
| 6501 | 6501 | (if (src_mcv.isRegister()) |
| 6502 | 6502 | src_mcv.getReg().? |
| ... | ... | @@ -6505,11 +6505,11 @@ fn genBinOp( |
| 6505 | 6505 | ); |
| 6506 | 6506 | try self.asmRegisterRegisterRegister( |
| 6507 | 6507 | switch (air_tag) { |
| 6508 | | .add => .{ ._, .vaddps }, |
| 6509 | | .sub => .{ ._, .vsubps }, |
| 6510 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivps }, |
| 6511 | | .max => .{ ._, .vmaxps }, |
| 6512 | | .min => .{ ._, .vmaxps }, |
| 6508 | .add => .{ .v_ps, .add }, |
| 6509 | .sub => .{ .v_ps, .sub }, |
| 6510 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ps, .div }, |
| 6511 | .max => .{ .v_ps, .max }, |
| 6512 | .min => .{ .v_ps, .max }, |
| 6513 | 6513 | else => unreachable, |
| 6514 | 6514 | }, |
| 6515 | 6515 | dst_reg, |
| ... | ... | @@ -6517,7 +6517,7 @@ fn genBinOp( |
| 6517 | 6517 | tmp_reg, |
| 6518 | 6518 | ); |
| 6519 | 6519 | try self.asmRegisterRegisterImmediate( |
| 6520 | | .{ ._, .vcvtps2ph }, |
| 6520 | .{ .v_, .cvtps2ph }, |
| 6521 | 6521 | dst_reg, |
| 6522 | 6522 | dst_reg, |
| 6523 | 6523 | Immediate.u(0b1_00), |
| ... | ... | @@ -6529,13 +6529,13 @@ fn genBinOp( |
| 6529 | 6529 | const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); |
| 6530 | 6530 | defer self.register_manager.unlockReg(tmp_lock); |
| 6531 | 6531 | |
| 6532 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, dst_reg.to256(), dst_reg); |
| 6532 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, dst_reg.to256(), dst_reg); |
| 6533 | 6533 | if (src_mcv.isMemory()) try self.asmRegisterMemory( |
| 6534 | | .{ ._, .vcvtph2ps }, |
| 6534 | .{ .v_, .cvtph2ps }, |
| 6535 | 6535 | tmp_reg, |
| 6536 | 6536 | src_mcv.mem(.xword), |
| 6537 | 6537 | ) else try self.asmRegisterRegister( |
| 6538 | | .{ ._, .vcvtph2ps }, |
| 6538 | .{ .v_, .cvtph2ps }, |
| 6539 | 6539 | tmp_reg, |
| 6540 | 6540 | (if (src_mcv.isRegister()) |
| 6541 | 6541 | src_mcv.getReg().? |
| ... | ... | @@ -6544,11 +6544,11 @@ fn genBinOp( |
| 6544 | 6544 | ); |
| 6545 | 6545 | try self.asmRegisterRegisterRegister( |
| 6546 | 6546 | switch (air_tag) { |
| 6547 | | .add => .{ ._, .vaddps }, |
| 6548 | | .sub => .{ ._, .vsubps }, |
| 6549 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivps }, |
| 6550 | | .max => .{ ._, .vmaxps }, |
| 6551 | | .min => .{ ._, .vmaxps }, |
| 6547 | .add => .{ .v_ps, .add }, |
| 6548 | .sub => .{ .v_ps, .sub }, |
| 6549 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ps, .div }, |
| 6550 | .max => .{ .v_ps, .max }, |
| 6551 | .min => .{ .v_ps, .max }, |
| 6552 | 6552 | else => unreachable, |
| 6553 | 6553 | }, |
| 6554 | 6554 | dst_reg.to256(), |
| ... | ... | @@ -6556,7 +6556,7 @@ fn genBinOp( |
| 6556 | 6556 | tmp_reg, |
| 6557 | 6557 | ); |
| 6558 | 6558 | try self.asmRegisterRegisterImmediate( |
| 6559 | | .{ ._, .vcvtps2ph }, |
| 6559 | .{ .v_, .cvtps2ph }, |
| 6560 | 6560 | dst_reg, |
| 6561 | 6561 | dst_reg.to256(), |
| 6562 | 6562 | Immediate.u(0b1_00), |
| ... | ... | @@ -6567,76 +6567,76 @@ fn genBinOp( |
| 6567 | 6567 | } else null, |
| 6568 | 6568 | 32 => switch (lhs_ty.vectorLen()) { |
| 6569 | 6569 | 1 => switch (air_tag) { |
| 6570 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddss } else .{ ._, .addss }, |
| 6571 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubss } else .{ ._, .subss }, |
| 6572 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulss } else .{ ._, .mulss }, |
| 6570 | .add => if (self.hasFeature(.avx)) .{ .v_ss, .add } else .{ ._ss, .add }, |
| 6571 | .sub => if (self.hasFeature(.avx)) .{ .v_ss, .sub } else .{ ._ss, .sub }, |
| 6572 | .mul => if (self.hasFeature(.avx)) .{ .v_ss, .mul } else .{ ._ss, .mul }, |
| 6573 | 6573 | .div_float, |
| 6574 | 6574 | .div_trunc, |
| 6575 | 6575 | .div_floor, |
| 6576 | 6576 | .div_exact, |
| 6577 | | => if (self.hasFeature(.avx)) .{ ._, .vdivss } else .{ ._, .divss }, |
| 6578 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxss } else .{ ._, .maxss }, |
| 6579 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminss } else .{ ._, .minss }, |
| 6577 | => if (self.hasFeature(.avx)) .{ .v_ss, .div } else .{ ._ss, .div }, |
| 6578 | .max => if (self.hasFeature(.avx)) .{ .v_ss, .max } else .{ ._ss, .max }, |
| 6579 | .min => if (self.hasFeature(.avx)) .{ .v_ss, .min } else .{ ._ss, .min }, |
| 6580 | 6580 | else => unreachable, |
| 6581 | 6581 | }, |
| 6582 | 6582 | 2...4 => switch (air_tag) { |
| 6583 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddps } else .{ ._, .addps }, |
| 6584 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubps } else .{ ._, .subps }, |
| 6585 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulps } else .{ ._, .mulps }, |
| 6583 | .add => if (self.hasFeature(.avx)) .{ .v_ps, .add } else .{ ._ps, .add }, |
| 6584 | .sub => if (self.hasFeature(.avx)) .{ .v_ps, .sub } else .{ ._ps, .sub }, |
| 6585 | .mul => if (self.hasFeature(.avx)) .{ .v_ps, .mul } else .{ ._ps, .mul }, |
| 6586 | 6586 | .div_float, |
| 6587 | 6587 | .div_trunc, |
| 6588 | 6588 | .div_floor, |
| 6589 | 6589 | .div_exact, |
| 6590 | | => if (self.hasFeature(.avx)) .{ ._, .vdivps } else .{ ._, .divps }, |
| 6591 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxps } else .{ ._, .maxps }, |
| 6592 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminps } else .{ ._, .minps }, |
| 6590 | => if (self.hasFeature(.avx)) .{ .v_ps, .div } else .{ ._ps, .div }, |
| 6591 | .max => if (self.hasFeature(.avx)) .{ .v_ps, .max } else .{ ._ps, .max }, |
| 6592 | .min => if (self.hasFeature(.avx)) .{ .v_ps, .min } else .{ ._ps, .min }, |
| 6593 | 6593 | else => unreachable, |
| 6594 | 6594 | }, |
| 6595 | 6595 | 5...8 => if (self.hasFeature(.avx)) switch (air_tag) { |
| 6596 | | .add => .{ ._, .vaddps }, |
| 6597 | | .sub => .{ ._, .vsubps }, |
| 6598 | | .mul => .{ ._, .vmulps }, |
| 6599 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivps }, |
| 6600 | | .max => .{ ._, .vmaxps }, |
| 6601 | | .min => .{ ._, .vminps }, |
| 6596 | .add => .{ .v_ps, .add }, |
| 6597 | .sub => .{ .v_ps, .sub }, |
| 6598 | .mul => .{ .v_ps, .mul }, |
| 6599 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ps, .div }, |
| 6600 | .max => .{ .v_ps, .max }, |
| 6601 | .min => .{ .v_ps, .min }, |
| 6602 | 6602 | else => unreachable, |
| 6603 | 6603 | } else null, |
| 6604 | 6604 | else => null, |
| 6605 | 6605 | }, |
| 6606 | 6606 | 64 => switch (lhs_ty.vectorLen()) { |
| 6607 | 6607 | 1 => switch (air_tag) { |
| 6608 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddsd } else .{ ._, .addsd }, |
| 6609 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubsd } else .{ ._, .subsd }, |
| 6610 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulsd } else .{ ._, .mulsd }, |
| 6608 | .add => if (self.hasFeature(.avx)) .{ .v_sd, .add } else .{ ._sd, .add }, |
| 6609 | .sub => if (self.hasFeature(.avx)) .{ .v_sd, .sub } else .{ ._sd, .sub }, |
| 6610 | .mul => if (self.hasFeature(.avx)) .{ .v_sd, .mul } else .{ ._sd, .mul }, |
| 6611 | 6611 | .div_float, |
| 6612 | 6612 | .div_trunc, |
| 6613 | 6613 | .div_floor, |
| 6614 | 6614 | .div_exact, |
| 6615 | | => if (self.hasFeature(.avx)) .{ ._, .vdivsd } else .{ ._, .divsd }, |
| 6616 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxsd } else .{ ._, .maxsd }, |
| 6617 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminsd } else .{ ._, .minsd }, |
| 6615 | => if (self.hasFeature(.avx)) .{ .v_sd, .div } else .{ ._sd, .div }, |
| 6616 | .max => if (self.hasFeature(.avx)) .{ .v_sd, .max } else .{ ._sd, .max }, |
| 6617 | .min => if (self.hasFeature(.avx)) .{ .v_sd, .min } else .{ ._sd, .min }, |
| 6618 | 6618 | else => unreachable, |
| 6619 | 6619 | }, |
| 6620 | 6620 | 2 => switch (air_tag) { |
| 6621 | | .add => if (self.hasFeature(.avx)) .{ ._, .vaddpd } else .{ ._, .addpd }, |
| 6622 | | .sub => if (self.hasFeature(.avx)) .{ ._, .vsubpd } else .{ ._, .subpd }, |
| 6623 | | .mul => if (self.hasFeature(.avx)) .{ ._, .vmulpd } else .{ ._, .mulpd }, |
| 6621 | .add => if (self.hasFeature(.avx)) .{ .v_pd, .add } else .{ ._pd, .add }, |
| 6622 | .sub => if (self.hasFeature(.avx)) .{ .v_pd, .sub } else .{ ._pd, .sub }, |
| 6623 | .mul => if (self.hasFeature(.avx)) .{ .v_pd, .mul } else .{ ._pd, .mul }, |
| 6624 | 6624 | .div_float, |
| 6625 | 6625 | .div_trunc, |
| 6626 | 6626 | .div_floor, |
| 6627 | 6627 | .div_exact, |
| 6628 | | => if (self.hasFeature(.avx)) .{ ._, .vdivpd } else .{ ._, .divpd }, |
| 6629 | | .max => if (self.hasFeature(.avx)) .{ ._, .vmaxpd } else .{ ._, .maxpd }, |
| 6630 | | .min => if (self.hasFeature(.avx)) .{ ._, .vminpd } else .{ ._, .minpd }, |
| 6628 | => if (self.hasFeature(.avx)) .{ .v_pd, .div } else .{ ._pd, .div }, |
| 6629 | .max => if (self.hasFeature(.avx)) .{ .v_pd, .max } else .{ ._pd, .max }, |
| 6630 | .min => if (self.hasFeature(.avx)) .{ .v_pd, .min } else .{ ._pd, .min }, |
| 6631 | 6631 | else => unreachable, |
| 6632 | 6632 | }, |
| 6633 | 6633 | 3...4 => if (self.hasFeature(.avx)) switch (air_tag) { |
| 6634 | | .add => .{ ._, .vaddpd }, |
| 6635 | | .sub => .{ ._, .vsubpd }, |
| 6636 | | .mul => .{ ._, .vmulpd }, |
| 6637 | | .div_float, .div_trunc, .div_floor, .div_exact => .{ ._, .vdivpd }, |
| 6638 | | .max => .{ ._, .vmaxpd }, |
| 6639 | | .min => .{ ._, .vminpd }, |
| 6634 | .add => .{ .v_pd, .add }, |
| 6635 | .sub => .{ .v_pd, .sub }, |
| 6636 | .mul => .{ .v_pd, .mul }, |
| 6637 | .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_pd, .div }, |
| 6638 | .max => .{ .v_pd, .max }, |
| 6639 | .min => .{ .v_pd, .min }, |
| 6640 | 6640 | else => unreachable, |
| 6641 | 6641 | } else null, |
| 6642 | 6642 | else => null, |
| ... | ... | @@ -7563,13 +7563,13 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 7563 | 7563 | defer self.register_manager.unlockReg(tmp2_lock); |
| 7564 | 7564 | |
| 7565 | 7565 | if (src_mcv.isMemory()) try self.asmRegisterRegisterMemoryImmediate( |
| 7566 | | .{ ._, .vpinsrw }, |
| 7566 | .{ .vp_w, .insr }, |
| 7567 | 7567 | tmp1_reg, |
| 7568 | 7568 | dst_reg.to128(), |
| 7569 | 7569 | src_mcv.mem(.word), |
| 7570 | 7570 | Immediate.u(1), |
| 7571 | 7571 | ) else try self.asmRegisterRegisterRegister( |
| 7572 | | .{ ._, .vpunpcklwd }, |
| 7572 | .{ .vp_, .unpcklwd }, |
| 7573 | 7573 | tmp1_reg, |
| 7574 | 7574 | dst_reg.to128(), |
| 7575 | 7575 | (if (src_mcv.isRegister()) |
| ... | ... | @@ -7577,20 +7577,20 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 7577 | 7577 | else |
| 7578 | 7578 | try self.copyToTmpRegister(ty, src_mcv)).to128(), |
| 7579 | 7579 | ); |
| 7580 | | try self.asmRegisterRegister(.{ ._, .vcvtph2ps }, tmp1_reg, tmp1_reg); |
| 7581 | | try self.asmRegisterRegister(.{ ._, .vmovshdup }, tmp2_reg, tmp1_reg); |
| 7582 | | try self.genBinOpMir(.{ ._, .ucomiss }, ty, tmp1_mcv, tmp2_mcv); |
| 7580 | try self.asmRegisterRegister(.{ .v_, .cvtph2ps }, tmp1_reg, tmp1_reg); |
| 7581 | try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp2_reg, tmp1_reg); |
| 7582 | try self.genBinOpMir(.{ ._ss, .ucomi }, ty, tmp1_mcv, tmp2_mcv); |
| 7583 | 7583 | } else return self.fail("TODO implement airCmp for {}", .{ |
| 7584 | 7584 | ty.fmt(self.bin_file.options.module.?), |
| 7585 | 7585 | }), |
| 7586 | 7586 | 32 => try self.genBinOpMir( |
| 7587 | | .{ ._, .ucomiss }, |
| 7587 | .{ ._ss, .ucomi }, |
| 7588 | 7588 | ty, |
| 7589 | 7589 | .{ .register = dst_reg }, |
| 7590 | 7590 | src_mcv, |
| 7591 | 7591 | ), |
| 7592 | 7592 | 64 => try self.genBinOpMir( |
| 7593 | | .{ ._, .ucomisd }, |
| 7593 | .{ ._sd, .ucomi }, |
| 7594 | 7594 | ty, |
| 7595 | 7595 | .{ .register = dst_reg }, |
| 7596 | 7596 | src_mcv, |
| ... | ... | @@ -8573,42 +8573,42 @@ fn movMirTag(self: *Self, ty: Type, aligned: bool) !Mir.Inst.FixedTag { |
| 8573 | 8573 | else => return .{ ._, .mov }, |
| 8574 | 8574 | .Float => switch (ty.floatBits(self.target.*)) { |
| 8575 | 8575 | 16 => unreachable, // needs special handling |
| 8576 | | 32 => return if (self.hasFeature(.avx)) .{ ._, .vmovss } else .{ ._, .movss }, |
| 8577 | | 64 => return if (self.hasFeature(.avx)) .{ ._, .vmovsd } else .{ ._, .movsd }, |
| 8576 | 32 => return if (self.hasFeature(.avx)) .{ .v_ss, .mov } else .{ ._ss, .mov }, |
| 8577 | 64 => return if (self.hasFeature(.avx)) .{ .v_sd, .mov } else .{ ._sd, .mov }, |
| 8578 | 8578 | 128 => return if (self.hasFeature(.avx)) |
| 8579 | | if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups } |
| 8580 | | else if (aligned) .{ ._, .movaps } else .{ ._, .movups }, |
| 8579 | if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu } |
| 8580 | else if (aligned) .{ ._ps, .mova } else .{ ._ps, .movu }, |
| 8581 | 8581 | else => {}, |
| 8582 | 8582 | }, |
| 8583 | 8583 | .Vector => switch (ty.childType().zigTypeTag()) { |
| 8584 | 8584 | .Float => switch (ty.childType().floatBits(self.target.*)) { |
| 8585 | 8585 | 16 => switch (ty.vectorLen()) { |
| 8586 | 8586 | 1 => unreachable, // needs special handling |
| 8587 | | 2 => return if (self.hasFeature(.avx)) .{ ._, .vmovss } else .{ ._, .movss }, |
| 8588 | | 3...4 => return if (self.hasFeature(.avx)) .{ ._, .vmovsd } else .{ ._, .movsd }, |
| 8587 | 2 => return if (self.hasFeature(.avx)) .{ .v_ss, .mov } else .{ ._ss, .mov }, |
| 8588 | 3...4 => return if (self.hasFeature(.avx)) .{ .v_sd, .mov } else .{ ._sd, .mov }, |
| 8589 | 8589 | 5...8 => return if (self.hasFeature(.avx)) |
| 8590 | | if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups } |
| 8591 | | else if (aligned) .{ ._, .movaps } else .{ ._, .movups }, |
| 8590 | if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu } |
| 8591 | else if (aligned) .{ ._ps, .mova } else .{ ._ps, .movu }, |
| 8592 | 8592 | 9...16 => if (self.hasFeature(.avx)) |
| 8593 | | return if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups }, |
| 8593 | return if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu }, |
| 8594 | 8594 | else => {}, |
| 8595 | 8595 | }, |
| 8596 | 8596 | 32 => switch (ty.vectorLen()) { |
| 8597 | | 1 => return if (self.hasFeature(.avx)) .{ ._, .vmovss } else .{ ._, .movss }, |
| 8597 | 1 => return if (self.hasFeature(.avx)) .{ .v_ss, .mov } else .{ ._ss, .mov }, |
| 8598 | 8598 | 2...4 => return if (self.hasFeature(.avx)) |
| 8599 | | if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups } |
| 8600 | | else if (aligned) .{ ._, .movaps } else .{ ._, .movups }, |
| 8599 | if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu } |
| 8600 | else if (aligned) .{ ._ps, .mova } else .{ ._ps, .movu }, |
| 8601 | 8601 | 5...8 => if (self.hasFeature(.avx)) |
| 8602 | | return if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups }, |
| 8602 | return if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu }, |
| 8603 | 8603 | else => {}, |
| 8604 | 8604 | }, |
| 8605 | 8605 | 64 => switch (ty.vectorLen()) { |
| 8606 | | 1 => return if (self.hasFeature(.avx)) .{ ._, .vmovsd } else .{ ._, .movsd }, |
| 8606 | 1 => return if (self.hasFeature(.avx)) .{ .v_sd, .mov } else .{ ._sd, .mov }, |
| 8607 | 8607 | 2 => return if (self.hasFeature(.avx)) |
| 8608 | | if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups } |
| 8609 | | else if (aligned) .{ ._, .movaps } else .{ ._, .movups }, |
| 8608 | if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu } |
| 8609 | else if (aligned) .{ ._ps, .mova } else .{ ._ps, .movu }, |
| 8610 | 8610 | 3...4 => if (self.hasFeature(.avx)) |
| 8611 | | return if (aligned) .{ ._, .vmovaps } else .{ ._, .vmovups }, |
| 8611 | return if (aligned) .{ .v_ps, .mova } else .{ .v_ps, .movu }, |
| 8612 | 8612 | else => {}, |
| 8613 | 8613 | }, |
| 8614 | 8614 | else => {}, |
| ... | ... | @@ -8724,11 +8724,11 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 8724 | 8724 | if ((dst_reg.class() == .floating_point) == (src_reg.class() == .floating_point)) |
| 8725 | 8725 | switch (ty.zigTypeTag()) { |
| 8726 | 8726 | else => .{ ._, .mov }, |
| 8727 | | .Float, .Vector => .{ ._, .movaps }, |
| 8727 | .Float, .Vector => .{ ._ps, .mova }, |
| 8728 | 8728 | } |
| 8729 | 8729 | else switch (abi_size) { |
| 8730 | 8730 | 2 => return try self.asmRegisterRegisterImmediate( |
| 8731 | | if (dst_reg.class() == .floating_point) .{ ._, .pinsrw } else .{ ._, .pextrw }, |
| 8731 | if (dst_reg.class() == .floating_point) .{ .p_w, .insr } else .{ .p_w, .extr }, |
| 8732 | 8732 | registerAlias(dst_reg, 4), |
| 8733 | 8733 | registerAlias(src_reg, 4), |
| 8734 | 8734 | Immediate.u(0), |
| ... | ... | @@ -8761,7 +8761,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 8761 | 8761 | }); |
| 8762 | 8762 | if (ty.isRuntimeFloat() and ty.floatBits(self.target.*) == 16) |
| 8763 | 8763 | try self.asmRegisterMemoryImmediate( |
| 8764 | | .{ ._, .pinsrw }, |
| 8764 | .{ .p_w, .insr }, |
| 8765 | 8765 | registerAlias(dst_reg, abi_size), |
| 8766 | 8766 | src_mem, |
| 8767 | 8767 | Immediate.u(0), |
| ... | ... | @@ -8794,7 +8794,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 8794 | 8794 | }); |
| 8795 | 8795 | return if (ty.isRuntimeFloat() and ty.floatBits(self.target.*) == 16) |
| 8796 | 8796 | self.asmRegisterMemoryImmediate( |
| 8797 | | .{ ._, .pinsrw }, |
| 8797 | .{ .p_w, .insr }, |
| 8798 | 8798 | registerAlias(dst_reg, abi_size), |
| 8799 | 8799 | src_mem, |
| 8800 | 8800 | Immediate.u(0), |
| ... | ... | @@ -8838,7 +8838,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr |
| 8838 | 8838 | }); |
| 8839 | 8839 | if (ty.isRuntimeFloat() and ty.floatBits(self.target.*) == 16) |
| 8840 | 8840 | try self.asmRegisterMemoryImmediate( |
| 8841 | | .{ ._, .pinsrw }, |
| 8841 | .{ .p_w, .insr }, |
| 8842 | 8842 | registerAlias(dst_reg, abi_size), |
| 8843 | 8843 | src_mem, |
| 8844 | 8844 | Immediate.u(0), |
| ... | ... | @@ -8952,7 +8952,7 @@ fn genSetMem(self: *Self, base: Memory.Base, disp: i32, ty: Type, src_mcv: MCVal |
| 8952 | 8952 | ); |
| 8953 | 8953 | if (ty.isRuntimeFloat() and ty.floatBits(self.target.*) == 16) |
| 8954 | 8954 | try self.asmMemoryRegisterImmediate( |
| 8955 | | .{ ._, .pextrw }, |
| 8955 | .{ .p_w, .extr }, |
| 8956 | 8956 | dst_mem, |
| 8957 | 8957 | src_reg.to128(), |
| 8958 | 8958 | Immediate.u(0), |
| ... | ... | @@ -9069,7 +9069,7 @@ fn genInlineMemcpyRegisterRegister( |
| 9069 | 9069 | try self.asmMemoryRegister( |
| 9070 | 9070 | switch (src_reg.class()) { |
| 9071 | 9071 | .general_purpose, .segment => .{ ._, .mov }, |
| 9072 | | .floating_point => .{ ._, .movss }, |
| 9072 | .floating_point => .{ ._ss, .mov }, |
| 9073 | 9073 | }, |
| 9074 | 9074 | Memory.sib(Memory.PtrSize.fromSize(abi_size), .{ .base = dst_reg, .disp = -offset }), |
| 9075 | 9075 | registerAlias(src_reg, abi_size), |
| ... | ... | @@ -10197,21 +10197,21 @@ fn airMulAdd(self: *Self, inst: Air.Inst.Index) !void { |
| 10197 | 10197 | if (mem.eql(u2, &order, &.{ 1, 3, 2 }) or mem.eql(u2, &order, &.{ 3, 1, 2 })) |
| 10198 | 10198 | switch (ty.zigTypeTag()) { |
| 10199 | 10199 | .Float => switch (ty.floatBits(self.target.*)) { |
| 10200 | | 32 => .{ ._, .vfmadd132ss }, |
| 10201 | | 64 => .{ ._, .vfmadd132sd }, |
| 10200 | 32 => .{ .v_ss, .fmadd132 }, |
| 10201 | 64 => .{ .v_sd, .fmadd132 }, |
| 10202 | 10202 | 16, 80, 128 => null, |
| 10203 | 10203 | else => unreachable, |
| 10204 | 10204 | }, |
| 10205 | 10205 | .Vector => switch (ty.childType().zigTypeTag()) { |
| 10206 | 10206 | .Float => switch (ty.childType().floatBits(self.target.*)) { |
| 10207 | 10207 | 32 => switch (ty.vectorLen()) { |
| 10208 | | 1 => .{ ._, .vfmadd132ss }, |
| 10209 | | 2...8 => .{ ._, .vfmadd132ps }, |
| 10208 | 1 => .{ .v_ss, .fmadd132 }, |
| 10209 | 2...8 => .{ .v_ps, .fmadd132 }, |
| 10210 | 10210 | else => null, |
| 10211 | 10211 | }, |
| 10212 | 10212 | 64 => switch (ty.vectorLen()) { |
| 10213 | | 1 => .{ ._, .vfmadd132sd }, |
| 10214 | | 2...4 => .{ ._, .vfmadd132pd }, |
| 10213 | 1 => .{ .v_sd, .fmadd132 }, |
| 10214 | 2...4 => .{ .v_pd, .fmadd132 }, |
| 10215 | 10215 | else => null, |
| 10216 | 10216 | }, |
| 10217 | 10217 | 16, 80, 128 => null, |
| ... | ... | @@ -10224,21 +10224,21 @@ fn airMulAdd(self: *Self, inst: Air.Inst.Index) !void { |
| 10224 | 10224 | else if (mem.eql(u2, &order, &.{ 2, 1, 3 }) or mem.eql(u2, &order, &.{ 1, 2, 3 })) |
| 10225 | 10225 | switch (ty.zigTypeTag()) { |
| 10226 | 10226 | .Float => switch (ty.floatBits(self.target.*)) { |
| 10227 | | 32 => .{ ._, .vfmadd213ss }, |
| 10228 | | 64 => .{ ._, .vfmadd213sd }, |
| 10227 | 32 => .{ .v_ss, .fmadd213 }, |
| 10228 | 64 => .{ .v_sd, .fmadd213 }, |
| 10229 | 10229 | 16, 80, 128 => null, |
| 10230 | 10230 | else => unreachable, |
| 10231 | 10231 | }, |
| 10232 | 10232 | .Vector => switch (ty.childType().zigTypeTag()) { |
| 10233 | 10233 | .Float => switch (ty.childType().floatBits(self.target.*)) { |
| 10234 | 10234 | 32 => switch (ty.vectorLen()) { |
| 10235 | | 1 => .{ ._, .vfmadd213ss }, |
| 10236 | | 2...8 => .{ ._, .vfmadd213ps }, |
| 10235 | 1 => .{ .v_ss, .fmadd213 }, |
| 10236 | 2...8 => .{ .v_ps, .fmadd213 }, |
| 10237 | 10237 | else => null, |
| 10238 | 10238 | }, |
| 10239 | 10239 | 64 => switch (ty.vectorLen()) { |
| 10240 | | 1 => .{ ._, .vfmadd213sd }, |
| 10241 | | 2...4 => .{ ._, .vfmadd213pd }, |
| 10240 | 1 => .{ .v_sd, .fmadd213 }, |
| 10241 | 2...4 => .{ .v_pd, .fmadd213 }, |
| 10242 | 10242 | else => null, |
| 10243 | 10243 | }, |
| 10244 | 10244 | 16, 80, 128 => null, |
| ... | ... | @@ -10251,21 +10251,21 @@ fn airMulAdd(self: *Self, inst: Air.Inst.Index) !void { |
| 10251 | 10251 | else if (mem.eql(u2, &order, &.{ 2, 3, 1 }) or mem.eql(u2, &order, &.{ 3, 2, 1 })) |
| 10252 | 10252 | switch (ty.zigTypeTag()) { |
| 10253 | 10253 | .Float => switch (ty.floatBits(self.target.*)) { |
| 10254 | | 32 => .{ ._, .vfmadd231ss }, |
| 10255 | | 64 => .{ ._, .vfmadd231sd }, |
| 10254 | 32 => .{ .v_ss, .fmadd231 }, |
| 10255 | 64 => .{ .v_sd, .fmadd231 }, |
| 10256 | 10256 | 16, 80, 128 => null, |
| 10257 | 10257 | else => unreachable, |
| 10258 | 10258 | }, |
| 10259 | 10259 | .Vector => switch (ty.childType().zigTypeTag()) { |
| 10260 | 10260 | .Float => switch (ty.childType().floatBits(self.target.*)) { |
| 10261 | 10261 | 32 => switch (ty.vectorLen()) { |
| 10262 | | 1 => .{ ._, .vfmadd231ss }, |
| 10263 | | 2...8 => .{ ._, .vfmadd231ps }, |
| 10262 | 1 => .{ .v_ss, .fmadd231 }, |
| 10263 | 2...8 => .{ .v_ps, .fmadd231 }, |
| 10264 | 10264 | else => null, |
| 10265 | 10265 | }, |
| 10266 | 10266 | 64 => switch (ty.vectorLen()) { |
| 10267 | | 1 => .{ ._, .vfmadd231sd }, |
| 10268 | | 2...4 => .{ ._, .vfmadd231pd }, |
| 10267 | 1 => .{ .v_sd, .fmadd231 }, |
| 10268 | 2...4 => .{ .v_pd, .fmadd231 }, |
| 10269 | 10269 | else => null, |
| 10270 | 10270 | }, |
| 10271 | 10271 | 16, 80, 128 => null, |