diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index 96622a10a9..af32bfa91d 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -1470,13 +1470,21 @@ (rule (lower (icmp (IntCC.SignedLessThan) a @ (value_type (vec128 ty)) b)) (x64_pcmpgt ty b a)) (rule (lower (icmp (IntCC.UnsignedGreaterThan) a @ (value_type (vec128 ty)) b)) - (let ((max Xmm (x64_pmaxu ty a b)) - (eq Xmm (x64_pcmpeq ty max b)) + ;; N.B.: we must manually prevent load coalescing of these operands; the + ;; register allocator gets confused otherwise. TODO: + ;; https://github.com/bytecodealliance/wasmtime/issues/3953. + (let ((xmm_a Xmm (put_in_xmm a)) + (xmm_b Xmm (put_in_xmm b)) + (max Xmm (x64_pmaxu ty xmm_a xmm_b)) + (eq Xmm (x64_pcmpeq ty max xmm_b)) (all_ones Xmm (vector_all_ones ty))) (x64_pxor eq all_ones))) (rule (lower (icmp (IntCC.UnsignedLessThan) a @ (value_type (vec128 ty)) b)) - (let ((min Xmm (x64_pminu ty a b)) - (eq Xmm (x64_pcmpeq ty min b)) + ;; N.B.: see note above. + (let ((xmm_a Xmm (put_in_xmm a)) + (xmm_b Xmm (put_in_xmm b)) + (min Xmm (x64_pminu ty xmm_a xmm_b)) + (eq Xmm (x64_pcmpeq ty min xmm_b)) (all_ones Xmm (vector_all_ones ty))) (x64_pxor eq all_ones))) ;; To lower signed and unsigned *-or-equals comparisons, we find the minimum diff --git a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest index 6de21d1f72..86fd00f3ce 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest @@ -1,4 +1,4 @@ src/clif.isle 9ea75a6f790b5c03 src/prelude.isle b2bc986bcbbbb77 src/isa/x64/inst.isle bfb0fb7143d8dc34 -src/isa/x64/lower.isle ed84d285e0789fca +src/isa/x64/lower.isle ccaee2b83bdf73e1 diff --git a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs index 5d9da06d07..71cf730fe4 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs @@ -4590,7 +4590,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Debugtrap = pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2108. + // Rule at src/isa/x64/lower.isle line 2116. let expr0_0 = constructor_x64_hlt(ctx)?; let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; return Some(expr1_0); @@ -4796,7 +4796,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1515. + // Rule at src/isa/x64/lower.isle line 1523. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -4840,7 +4840,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1534. + // Rule at src/isa/x64/lower.isle line 1542. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -4889,7 +4889,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1500. + // Rule at src/isa/x64/lower.isle line 1508. let expr0_0: Type = I64X2; let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; @@ -4902,7 +4902,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1504. + // Rule at src/isa/x64/lower.isle line 1512. let expr0_0: Type = I64X2; let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; @@ -4962,7 +4962,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1485. + // Rule at src/isa/x64/lower.isle line 1493. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -4984,7 +4984,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1488. + // Rule at src/isa/x64/lower.isle line 1496. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -4999,20 +4999,21 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { // Rule at src/isa/x64/lower.isle line 1472. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; - let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; - let expr2_0 = - constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?; - let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; - let expr4_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?; - let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?; - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_pxor(ctx, expr4_0, &expr6_0)?; - let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; - return Some(expr8_0); + let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; + let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr3_0 = + constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr2_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr5_0 = + constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?; + let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); + let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?; + let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; + return Some(expr9_0); } &IntCC::UnsignedGreaterThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1491. + // Rule at src/isa/x64/lower.isle line 1499. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5025,22 +5026,23 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1477. + // Rule at src/isa/x64/lower.isle line 1482. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; - let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; - let expr2_0 = - constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?; - let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; - let expr4_0 = - constructor_x64_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?; - let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?; - let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); - let expr7_0 = constructor_x64_pxor(ctx, expr4_0, &expr6_0)?; - let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; - return Some(expr8_0); + let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; + let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr3_0 = + constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr2_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr5_0 = + constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?; + let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); + let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?; + let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; + return Some(expr9_0); } &IntCC::UnsignedLessThanOrEqual => { - // Rule at src/isa/x64/lower.isle line 1494. + // Rule at src/isa/x64/lower.isle line 1502. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5065,7 +5067,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern4_0 = C::value_type(ctx, pattern2_1); if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 1951. + // Rule at src/isa/x64/lower.isle line 1959. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 0; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -5080,7 +5082,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern4_0 = C::value_type(ctx, pattern2_1); if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 1959. + // Rule at src/isa/x64/lower.isle line 1967. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 4294967295; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -5211,7 +5213,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1882. + // Rule at src/isa/x64/lower.isle line 1890. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?; @@ -5285,7 +5287,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1998. + // Rule at src/isa/x64/lower.isle line 2006. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5293,7 +5295,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2004. + // Rule at src/isa/x64/lower.isle line 2012. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5301,7 +5303,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2007. + // Rule at src/isa/x64/lower.isle line 2015. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5309,7 +5311,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2001. + // Rule at src/isa/x64/lower.isle line 2009. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5317,7 +5319,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2010. + // Rule at src/isa/x64/lower.isle line 2018. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5325,7 +5327,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2013. + // Rule at src/isa/x64/lower.isle line 2021. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5333,7 +5335,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2016. + // Rule at src/isa/x64/lower.isle line 2024. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5341,7 +5343,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2019. + // Rule at src/isa/x64/lower.isle line 2027. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5349,7 +5351,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 2022. + // Rule at src/isa/x64/lower.isle line 2030. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5364,7 +5366,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Uload32 = pattern12_0 { - // Rule at src/isa/x64/lower.isle line 2025. + // Rule at src/isa/x64/lower.isle line 2033. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5377,7 +5379,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1885. + // Rule at src/isa/x64/lower.isle line 1893. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 1; @@ -5654,7 +5656,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1655. + // Rule at src/isa/x64/lower.isle line 1663. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -5692,7 +5694,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1697. + // Rule at src/isa/x64/lower.isle line 1705. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -5730,7 +5732,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1749. + // Rule at src/isa/x64/lower.isle line 1757. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 0; @@ -5753,7 +5755,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2100. + // Rule at src/isa/x64/lower.isle line 2108. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr2_0: u32 = 1; @@ -5771,7 +5773,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern7_0 = C::value_type(ctx, pattern5_1); if pattern7_0 == I64 { - // Rule at src/isa/x64/lower.isle line 1972. + // Rule at src/isa/x64/lower.isle line 1980. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0: Type = I64; let expr2_0: u64 = 0; @@ -5781,7 +5783,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2123. + // Rule at src/isa/x64/lower.isle line 2131. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_addss(ctx, expr0_0, &expr1_0)?; @@ -5851,7 +5853,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2134. + // Rule at src/isa/x64/lower.isle line 2142. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_subss(ctx, expr0_0, &expr1_0)?; @@ -5860,7 +5862,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2145. + // Rule at src/isa/x64/lower.isle line 2153. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_mulss(ctx, expr0_0, &expr1_0)?; @@ -5869,7 +5871,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2156. + // Rule at src/isa/x64/lower.isle line 2164. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_divss(ctx, expr0_0, &expr1_0)?; @@ -5878,7 +5880,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2167. + // Rule at src/isa/x64/lower.isle line 2175. let expr0_0: Type = F32; let expr1_0: bool = true; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5890,7 +5892,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2336. + // Rule at src/isa/x64/lower.isle line 2344. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0)?; @@ -5899,7 +5901,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2239. + // Rule at src/isa/x64/lower.isle line 2247. let expr0_0: Type = F32; let expr1_0: bool = false; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5911,7 +5913,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2347. + // Rule at src/isa/x64/lower.isle line 2355. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0)?; @@ -5932,7 +5934,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2125. + // Rule at src/isa/x64/lower.isle line 2133. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_addsd(ctx, expr0_0, &expr1_0)?; @@ -5941,7 +5943,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2136. + // Rule at src/isa/x64/lower.isle line 2144. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_subsd(ctx, expr0_0, &expr1_0)?; @@ -5950,7 +5952,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2147. + // Rule at src/isa/x64/lower.isle line 2155. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_mulsd(ctx, expr0_0, &expr1_0)?; @@ -5959,7 +5961,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2158. + // Rule at src/isa/x64/lower.isle line 2166. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_divsd(ctx, expr0_0, &expr1_0)?; @@ -5968,7 +5970,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2169. + // Rule at src/isa/x64/lower.isle line 2177. let expr0_0: Type = F64; let expr1_0: bool = true; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5980,7 +5982,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2338. + // Rule at src/isa/x64/lower.isle line 2346. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0)?; @@ -5989,7 +5991,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2241. + // Rule at src/isa/x64/lower.isle line 2249. let expr0_0: Type = F64; let expr1_0: bool = false; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -6001,7 +6003,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2349. + // Rule at src/isa/x64/lower.isle line 2357. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0)?; @@ -6140,7 +6142,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1856. + // Rule at src/isa/x64/lower.isle line 1864. let expr0_0 = C::popcount_4bit_table(ctx); let expr1_0: Type = I8X16; let expr2_0 = C::popcount_low_mask(ctx); @@ -6357,7 +6359,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2113. + // Rule at src/isa/x64/lower.isle line 2121. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_pmaddwd(ctx, expr0_0, &expr1_0)?; @@ -6497,7 +6499,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2127. + // Rule at src/isa/x64/lower.isle line 2135. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_addps(ctx, expr0_0, &expr1_0)?; @@ -6506,7 +6508,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2138. + // Rule at src/isa/x64/lower.isle line 2146. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_subps(ctx, expr0_0, &expr1_0)?; @@ -6515,7 +6517,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2149. + // Rule at src/isa/x64/lower.isle line 2157. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_mulps(ctx, expr0_0, &expr1_0)?; @@ -6524,7 +6526,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2160. + // Rule at src/isa/x64/lower.isle line 2168. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_divps(ctx, expr0_0, &expr1_0)?; @@ -6533,7 +6535,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2184. + // Rule at src/isa/x64/lower.isle line 2192. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; @@ -6558,7 +6560,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2340. + // Rule at src/isa/x64/lower.isle line 2348. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; @@ -6567,7 +6569,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2247. + // Rule at src/isa/x64/lower.isle line 2255. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; @@ -6595,7 +6597,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2351. + // Rule at src/isa/x64/lower.isle line 2359. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; @@ -6637,7 +6639,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2129. + // Rule at src/isa/x64/lower.isle line 2137. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_addpd(ctx, expr0_0, &expr1_0)?; @@ -6646,7 +6648,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2140. + // Rule at src/isa/x64/lower.isle line 2148. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_subpd(ctx, expr0_0, &expr1_0)?; @@ -6655,7 +6657,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2151. + // Rule at src/isa/x64/lower.isle line 2159. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_mulpd(ctx, expr0_0, &expr1_0)?; @@ -6664,7 +6666,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2162. + // Rule at src/isa/x64/lower.isle line 2170. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_x64_divpd(ctx, expr0_0, &expr1_0)?; @@ -6673,7 +6675,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2227. + // Rule at src/isa/x64/lower.isle line 2235. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; @@ -6698,7 +6700,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2342. + // Rule at src/isa/x64/lower.isle line 2350. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; @@ -6707,7 +6709,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2290. + // Rule at src/isa/x64/lower.isle line 2298. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; @@ -6735,7 +6737,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2353. + // Rule at src/isa/x64/lower.isle line 2361. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; @@ -6814,7 +6816,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1626. + // Rule at src/isa/x64/lower.isle line 1634. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -6829,7 +6831,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1578. + // Rule at src/isa/x64/lower.isle line 1586. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NBE; @@ -6842,7 +6844,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1581. + // Rule at src/isa/x64/lower.isle line 1589. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NB; @@ -6855,7 +6857,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1601. + // Rule at src/isa/x64/lower.isle line 1609. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NBE; @@ -6868,7 +6870,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1604. + // Rule at src/isa/x64/lower.isle line 1612. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NB; @@ -6881,7 +6883,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1629. + // Rule at src/isa/x64/lower.isle line 1637. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -6896,7 +6898,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1572. + // Rule at src/isa/x64/lower.isle line 1580. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NP; @@ -6909,7 +6911,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1575. + // Rule at src/isa/x64/lower.isle line 1583. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::P; @@ -6922,7 +6924,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1607. + // Rule at src/isa/x64/lower.isle line 1615. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::B; @@ -6935,7 +6937,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1610. + // Rule at src/isa/x64/lower.isle line 1618. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::BE; @@ -6948,7 +6950,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1584. + // Rule at src/isa/x64/lower.isle line 1592. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::B; @@ -6961,7 +6963,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1587. + // Rule at src/isa/x64/lower.isle line 1595. let expr0_0 = constructor_x64_ucomis(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::BE; @@ -6988,14 +6990,14 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2086. + // Rule at src/isa/x64/lower.isle line 2094. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } } &Opcode::Bextend => { let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 2067. + // Rule at src/isa/x64/lower.isle line 2075. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -7003,7 +7005,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2075. + // Rule at src/isa/x64/lower.isle line 2083. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } @@ -7011,14 +7013,14 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 1968. + // Rule at src/isa/x64/lower.isle line 1976. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } } &Opcode::Sextend => { let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 2061. + // Rule at src/isa/x64/lower.isle line 2069. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -8214,7 +8216,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2089. + // Rule at src/isa/x64/lower.isle line 2097. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -8670,7 +8672,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2097. + // Rule at src/isa/x64/lower.isle line 2105. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0: u32 = 1; let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; @@ -8680,7 +8682,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2081. + // Rule at src/isa/x64/lower.isle line 2089. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -8794,21 +8796,21 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1645. + // Rule at src/isa/x64/lower.isle line 1653. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; return Some(expr2_0); } &Opcode::Ctz => { - // Rule at src/isa/x64/lower.isle line 1687. + // Rule at src/isa/x64/lower.isle line 1695. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; return Some(expr2_0); } &Opcode::Popcnt => { - // Rule at src/isa/x64/lower.isle line 1739. + // Rule at src/isa/x64/lower.isle line 1747. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; @@ -8911,7 +8913,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1650. + // Rule at src/isa/x64/lower.isle line 1658. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -8922,7 +8924,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1692. + // Rule at src/isa/x64/lower.isle line 1700. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -8933,7 +8935,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1744. + // Rule at src/isa/x64/lower.isle line 1752. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -9565,7 +9567,7 @@ pub fn constructor_do_clz( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1670. + // Rule at src/isa/x64/lower.isle line 1678. let expr0_0: Type = I64; let expr1_0: i64 = -1; let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?; @@ -9592,7 +9594,7 @@ pub fn constructor_do_ctz( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1711. + // Rule at src/isa/x64/lower.isle line 1719. let expr0_0: Type = I64; let expr1_0 = C::ty_bits_u64(ctx, pattern1_0); let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -9606,7 +9608,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> let pattern0_0 = arg0; if pattern0_0 == I32 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1802. + // Rule at src/isa/x64/lower.isle line 1810. let expr0_0: Type = I32; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -9671,7 +9673,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> } if pattern0_0 == I64 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1759. + // Rule at src/isa/x64/lower.isle line 1767. let expr0_0: Type = I64; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -9745,7 +9747,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> pub fn constructor_do_bitrev8(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1891. + // Rule at src/isa/x64/lower.isle line 1899. let expr0_0 = C::ty_mask(ctx, pattern0_0); let expr1_0: u64 = 6148914691236517205; let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0); @@ -9808,7 +9810,7 @@ pub fn constructor_do_bitrev8(ctx: &mut C, arg0: Type, arg1: Gpr) -> pub fn constructor_do_bitrev16(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1914. + // Rule at src/isa/x64/lower.isle line 1922. let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?; let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr2_0: u64 = 71777214294589695; @@ -9836,7 +9838,7 @@ pub fn constructor_do_bitrev16(ctx: &mut C, arg0: Type, arg1: Gpr) - pub fn constructor_do_bitrev32(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1926. + // Rule at src/isa/x64/lower.isle line 1934. let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?; let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr2_0: u64 = 281470681808895; @@ -9865,7 +9867,7 @@ pub fn constructor_do_bitrev64(ctx: &mut C, arg0: Type, arg1: Gpr) - let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1938. + // Rule at src/isa/x64/lower.isle line 1946. let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?; let expr1_0: u64 = 4294967295; let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?; @@ -9899,7 +9901,7 @@ pub fn constructor_generic_sextend( if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { let pattern3_0 = arg2; if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 2058. + // Rule at src/isa/x64/lower.isle line 2066. let expr0_0: Type = I32; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9907,7 +9909,7 @@ pub fn constructor_generic_sextend( return Some(expr3_0); } if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 2054. + // Rule at src/isa/x64/lower.isle line 2062. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9915,7 +9917,7 @@ pub fn constructor_generic_sextend( return Some(expr3_0); } if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 2048. + // Rule at src/isa/x64/lower.isle line 2056. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9930,7 +9932,7 @@ pub fn constructor_generic_sextend( if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) { let pattern3_0 = arg2; if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 2044. + // Rule at src/isa/x64/lower.isle line 2052. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?; let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?; @@ -9942,7 +9944,7 @@ pub fn constructor_generic_sextend( } let pattern2_0 = arg2; if pattern2_0 == pattern1_0 { - // Rule at src/isa/x64/lower.isle line 2034. + // Rule at src/isa/x64/lower.isle line 2042. let expr0_0 = constructor_output_value(ctx, pattern0_0)?; return Some(expr0_0); } @@ -9952,7 +9954,7 @@ pub fn constructor_generic_sextend( // Generated as internal constructor for term spread_sign_bit. pub fn constructor_spread_sign_bit(ctx: &mut C, arg0: Gpr) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/lower.isle line 2040. + // Rule at src/isa/x64/lower.isle line 2048. let expr0_0: Type = I64; let expr1_0: u8 = 63; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; diff --git a/cranelift/filetests/filetests/isa/x64/simd-issue-3951.clif b/cranelift/filetests/filetests/isa/x64/simd-issue-3951.clif new file mode 100644 index 0000000000..e7076cedf5 --- /dev/null +++ b/cranelift/filetests/filetests/isa/x64/simd-issue-3951.clif @@ -0,0 +1,19 @@ +test compile +set enable_simd +target x86_64 skylake + +;; Compile a CLIF version of the register allocation issue identified in +;; https://github.com/bytecodealliance/wasmtime/issues/3951. +function %check_issue_3951(i64 vmctx) -> i8x16 fast { + gv0 = vmctx + block0(v0: i64): + v2 = global_value.i64 gv0 + v3 = load.i8x16 notrap aligned v2+8 + v4 = global_value.i64 gv0 + v5 = load.i8x16 notrap aligned v4+8 + v6 = icmp ugt v3, v5 + v7 = raw_bitcast.i8x16 v6 + jump block1(v7) + block1(v1: i8x16): + return v1 +}