x64: improve generation of i128 icmp (#3946)

Previously, we used the flags of `AND` for `SETcc`. This change uses
`TEST` instead, which discards the AND result but sets the flags needed
for `SETcc`. This reduces register pressure slightly for this sequence.
This commit is contained in:
Andrew Brown
2022-03-18 16:36:31 -07:00
committed by GitHub
parent 41594dc5d9
commit 5fa104205d
4 changed files with 131 additions and 134 deletions

View File

@@ -1521,14 +1521,15 @@
(cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.Z)))) (cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.Z))))
;; At this point, `cmp_lo` and `cmp_hi` contain either 0 or 1 in the ;; At this point, `cmp_lo` and `cmp_hi` contain either 0 or 1 in the
;; lowest 8 bits--`SETcc` guarantees this. The upper bits may be ;; lowest 8 bits--`SETcc` guarantees this. The upper bits may be
;; unchanged so we must compare against 1; this instruction combines ;; unchanged so we must compare against 1 below; this instruction
;; `cmp_lo` and `cmp_hi` for that final comparison. ;; combines `cmp_lo` and `cmp_hi` for that final comparison.
(cmp Reg (x64_and $I64 cmp_lo cmp_hi))) (cmp Reg (x64_and $I64 cmp_lo cmp_hi)))
;; We can use the flag-setting behavior of `AND` to set the final ;; We must compare one more time against the immediate value 1 to
;; bits. If the result of `AND` is zero, then the `ZF` will be set; ;; check if both `cmp_lo` and `cmp_hi` are true. If `cmp AND 1 == 0`
;; if either of the halves `AND`s to 0, they were not equal, ;; then the `ZF` will be set (see `TEST` definition); if either of
;; therefore we `SETcc` with `NZ`. ;; the halves `AND`s to 0, they were not equal, therefore we `SETcc`
(with_flags (x64_and_with_flags_paired $I64 cmp (RegMemImm.Imm 1)) (setcc (CC.NZ))))) ;; with `NZ`.
(with_flags (test (OperandSize.Size64) (RegMemImm.Imm 1) cmp) (setcc (CC.NZ)))))
(rule (lower (icmp (IntCC.NotEqual) a @ (value_type $I128) b)) (rule (lower (icmp (IntCC.NotEqual) a @ (value_type $I128) b))
(let ((a_lo Gpr (value_regs_get_gpr a 0)) (let ((a_lo Gpr (value_regs_get_gpr a 0))
@@ -1539,7 +1540,7 @@
(cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.NZ)))) (cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.NZ))))
;; See comments for `IntCC.Equal`. ;; See comments for `IntCC.Equal`.
(cmp Reg (or $I64 cmp_lo cmp_hi))) (cmp Reg (or $I64 cmp_lo cmp_hi)))
(with_flags (x64_and_with_flags_paired $I64 cmp (RegMemImm.Imm 1)) (setcc (CC.NZ))))) (with_flags (test (OperandSize.Size64) (RegMemImm.Imm 1) cmp) (setcc (CC.NZ)))))
;;;; Rules for `select` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Rules for `select` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -1,4 +1,4 @@
src/clif.isle 9ea75a6f790b5c03 src/clif.isle 9ea75a6f790b5c03
src/prelude.isle b2bc986bcbbbb77 src/prelude.isle b2bc986bcbbbb77
src/isa/x64/inst.isle 5644ccb29bff0b51 src/isa/x64/inst.isle 5644ccb29bff0b51
src/isa/x64/lower.isle 51d6ce13a3e47bc4 src/isa/x64/lower.isle 4c4b772e7f9e958a

View File

@@ -4577,7 +4577,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern5_0 } = &pattern5_0
{ {
if let &Opcode::Popcnt = pattern6_0 { if let &Opcode::Popcnt = pattern6_0 {
// Rule at src/isa/x64/lower.isle line 1729. // Rule at src/isa/x64/lower.isle line 1730.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = C::put_in_regs(ctx, pattern6_1); let expr1_0 = C::put_in_regs(ctx, pattern6_1);
let expr2_0: usize = 0; let expr2_0: usize = 0;
@@ -4612,7 +4612,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern6_0 } = &pattern6_0
{ {
if let &Opcode::Popcnt = pattern7_0 { if let &Opcode::Popcnt = pattern7_0 {
// Rule at src/isa/x64/lower.isle line 1821. // Rule at src/isa/x64/lower.isle line 1822.
let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr1_0 = constructor_vpopcntb(ctx, &expr0_0)?; let expr1_0 = constructor_vpopcntb(ctx, &expr0_0)?;
let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
@@ -4631,7 +4631,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern5_0 } = &pattern5_0
{ {
if let &Opcode::Clz = pattern6_0 { if let &Opcode::Clz = pattern6_0 {
// Rule at src/isa/x64/lower.isle line 1637. // Rule at src/isa/x64/lower.isle line 1638.
let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
let expr1_0 = constructor_lzcnt(ctx, pattern3_0, expr0_0)?; let expr1_0 = constructor_lzcnt(ctx, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
@@ -4647,7 +4647,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern5_0 } = &pattern5_0
{ {
if let &Opcode::Ctz = pattern6_0 { if let &Opcode::Ctz = pattern6_0 {
// Rule at src/isa/x64/lower.isle line 1679. // Rule at src/isa/x64/lower.isle line 1680.
let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
let expr1_0 = constructor_tzcnt(ctx, pattern3_0, expr0_0)?; let expr1_0 = constructor_tzcnt(ctx, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
@@ -4663,7 +4663,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern5_0 } = &pattern5_0
{ {
if let &Opcode::Popcnt = pattern6_0 { if let &Opcode::Popcnt = pattern6_0 {
// Rule at src/isa/x64/lower.isle line 1715. // Rule at src/isa/x64/lower.isle line 1716.
let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?; let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
@@ -4681,7 +4681,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern5_0 } = &pattern5_0
{ {
if let &Opcode::Popcnt = pattern6_0 { if let &Opcode::Popcnt = pattern6_0 {
// Rule at src/isa/x64/lower.isle line 1722. // Rule at src/isa/x64/lower.isle line 1723.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0: Type = I32; let expr1_0: Type = I32;
let expr2_0 = ExtendKind::Zero; let expr2_0 = ExtendKind::Zero;
@@ -4702,7 +4702,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
opcode: ref pattern2_0, opcode: ref pattern2_0,
} => { } => {
if let &Opcode::Debugtrap = pattern2_0 { if let &Opcode::Debugtrap = pattern2_0 {
// Rule at src/isa/x64/lower.isle line 2107. // Rule at src/isa/x64/lower.isle line 2108.
let expr0_0 = constructor_hlt(ctx)?; let expr0_0 = constructor_hlt(ctx)?;
let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
return Some(expr1_0); return Some(expr1_0);
@@ -4813,14 +4813,12 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?; let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?;
let expr28_0 = C::gpr_to_reg(ctx, expr27_0); let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
let expr29_0: Type = I64; let expr29_0 = OperandSize::Size64;
let expr30_0 = C::gpr_new(ctx, expr28_0); let expr30_0: u32 = 1;
let expr31_0: u32 = 1; let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
let expr32_0 = RegMemImm::Imm { simm32: expr31_0 }; let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0); let expr33_0 = C::gpr_new(ctx, expr28_0);
let expr34_0 = constructor_x64_and_with_flags_paired( let expr34_0 = constructor_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
ctx, expr29_0, expr30_0, &expr33_0,
)?;
let expr35_0 = CC::NZ; let expr35_0 = CC::NZ;
let expr36_0 = constructor_setcc(ctx, &expr35_0)?; let expr36_0 = constructor_setcc(ctx, &expr35_0)?;
let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
@@ -4828,7 +4826,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr38_0); return Some(expr38_0);
} }
&IntCC::NotEqual => { &IntCC::NotEqual => {
// Rule at src/isa/x64/lower.isle line 1533. // Rule at src/isa/x64/lower.isle line 1534.
let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr0_0 = C::put_in_regs(ctx, pattern4_0);
let expr1_0: usize = 0; let expr1_0: usize = 0;
let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
@@ -4858,14 +4856,12 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
let expr27_0 = constructor_or(ctx, expr24_0, expr25_0, &expr26_0)?; let expr27_0 = constructor_or(ctx, expr24_0, expr25_0, &expr26_0)?;
let expr28_0 = C::gpr_to_reg(ctx, expr27_0); let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
let expr29_0: Type = I64; let expr29_0 = OperandSize::Size64;
let expr30_0 = C::gpr_new(ctx, expr28_0); let expr30_0: u32 = 1;
let expr31_0: u32 = 1; let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
let expr32_0 = RegMemImm::Imm { simm32: expr31_0 }; let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0); let expr33_0 = C::gpr_new(ctx, expr28_0);
let expr34_0 = constructor_x64_and_with_flags_paired( let expr34_0 = constructor_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
ctx, expr29_0, expr30_0, &expr33_0,
)?;
let expr35_0 = CC::NZ; let expr35_0 = CC::NZ;
let expr36_0 = constructor_setcc(ctx, &expr35_0)?; let expr36_0 = constructor_setcc(ctx, &expr35_0)?;
let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
@@ -5038,7 +5034,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::IsNull => { &Opcode::IsNull => {
let pattern4_0 = C::value_type(ctx, pattern2_1); let pattern4_0 = C::value_type(ctx, pattern2_1);
if pattern4_0 == R64 { if pattern4_0 == R64 {
// Rule at src/isa/x64/lower.isle line 1950. // Rule at src/isa/x64/lower.isle line 1951.
let expr0_0 = OperandSize::Size64; let expr0_0 = OperandSize::Size64;
let expr1_0: u32 = 0; let expr1_0: u32 = 0;
let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
@@ -5053,7 +5049,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::IsInvalid => { &Opcode::IsInvalid => {
let pattern4_0 = C::value_type(ctx, pattern2_1); let pattern4_0 = C::value_type(ctx, pattern2_1);
if pattern4_0 == R64 { if pattern4_0 == R64 {
// Rule at src/isa/x64/lower.isle line 1958. // Rule at src/isa/x64/lower.isle line 1959.
let expr0_0 = OperandSize::Size64; let expr0_0 = OperandSize::Size64;
let expr1_0: u32 = 4294967295; let expr1_0: u32 = 4294967295;
let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
@@ -5184,7 +5180,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern4_0 } = &pattern4_0
{ {
if let &Opcode::Bitrev = pattern5_0 { if let &Opcode::Bitrev = pattern5_0 {
// Rule at src/isa/x64/lower.isle line 1872. // Rule at src/isa/x64/lower.isle line 1873.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?;
@@ -5201,7 +5197,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern4_0 } = &pattern4_0
{ {
if let &Opcode::Bitrev = pattern5_0 { if let &Opcode::Bitrev = pattern5_0 {
// Rule at src/isa/x64/lower.isle line 1875. // Rule at src/isa/x64/lower.isle line 1876.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?;
@@ -5218,7 +5214,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern4_0 } = &pattern4_0
{ {
if let &Opcode::Bitrev = pattern5_0 { if let &Opcode::Bitrev = pattern5_0 {
// Rule at src/isa/x64/lower.isle line 1878. // Rule at src/isa/x64/lower.isle line 1879.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?;
@@ -5236,7 +5232,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
{ {
match pattern5_0 { match pattern5_0 {
&Opcode::Bitrev => { &Opcode::Bitrev => {
// Rule at src/isa/x64/lower.isle line 1881. // Rule at src/isa/x64/lower.isle line 1882.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?;
@@ -5258,7 +5254,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Iadd => { &Opcode::Iadd => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 1997. // Rule at src/isa/x64/lower.isle line 1998.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5266,7 +5262,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Isub => { &Opcode::Isub => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2003. // Rule at src/isa/x64/lower.isle line 2004.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5274,7 +5270,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Imul => { &Opcode::Imul => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2006. // Rule at src/isa/x64/lower.isle line 2007.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5282,7 +5278,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::IaddIfcout => { &Opcode::IaddIfcout => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2000. // Rule at src/isa/x64/lower.isle line 2001.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5290,7 +5286,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Band => { &Opcode::Band => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2009. // Rule at src/isa/x64/lower.isle line 2010.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5298,7 +5294,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Bor => { &Opcode::Bor => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2012. // Rule at src/isa/x64/lower.isle line 2013.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5306,7 +5302,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Bxor => { &Opcode::Bxor => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2015. // Rule at src/isa/x64/lower.isle line 2016.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5314,7 +5310,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ishl => { &Opcode::Ishl => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2018. // Rule at src/isa/x64/lower.isle line 2019.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5322,7 +5318,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ushr => { &Opcode::Ushr => {
let (pattern14_0, pattern14_1) = let (pattern14_0, pattern14_1) =
C::unpack_value_array_2(ctx, pattern12_1); C::unpack_value_array_2(ctx, pattern12_1);
// Rule at src/isa/x64/lower.isle line 2021. // Rule at src/isa/x64/lower.isle line 2022.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5337,7 +5333,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
offset: pattern12_3, offset: pattern12_3,
} => { } => {
if let &Opcode::Uload32 = pattern12_0 { if let &Opcode::Uload32 = pattern12_0 {
// Rule at src/isa/x64/lower.isle line 2024. // Rule at src/isa/x64/lower.isle line 2025.
let expr0_0 = let expr0_0 =
constructor_output_value(ctx, pattern5_1)?; constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0); return Some(expr0_0);
@@ -5350,7 +5346,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
let pattern7_0 = C::value_type(ctx, pattern5_1); let pattern7_0 = C::value_type(ctx, pattern5_1);
if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
// Rule at src/isa/x64/lower.isle line 1979. // Rule at src/isa/x64/lower.isle line 1980.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = ExtendKind::Zero; let expr1_0 = ExtendKind::Zero;
let expr2_0 = let expr2_0 =
@@ -5609,7 +5605,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr1_0); return Some(expr1_0);
} }
&Opcode::Bitrev => { &Opcode::Bitrev => {
// Rule at src/isa/x64/lower.isle line 1884. // Rule at src/isa/x64/lower.isle line 1885.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0 = C::put_in_regs(ctx, pattern5_1);
let expr2_0: usize = 1; let expr2_0: usize = 1;
@@ -5627,7 +5623,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr13_0); return Some(expr13_0);
} }
&Opcode::Clz => { &Opcode::Clz => {
// Rule at src/isa/x64/lower.isle line 1654. // Rule at src/isa/x64/lower.isle line 1655.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0: Type = I64; let expr1_0: Type = I64;
let expr2_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0 = C::put_in_regs(ctx, pattern5_1);
@@ -5664,7 +5660,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr31_0); return Some(expr31_0);
} }
&Opcode::Ctz => { &Opcode::Ctz => {
// Rule at src/isa/x64/lower.isle line 1696. // Rule at src/isa/x64/lower.isle line 1697.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0: Type = I64; let expr1_0: Type = I64;
let expr2_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0 = C::put_in_regs(ctx, pattern5_1);
@@ -5701,7 +5697,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr31_0); return Some(expr31_0);
} }
&Opcode::Popcnt => { &Opcode::Popcnt => {
// Rule at src/isa/x64/lower.isle line 1748. // Rule at src/isa/x64/lower.isle line 1749.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0 = C::put_in_regs(ctx, pattern5_1);
let expr2_0: usize = 0; let expr2_0: usize = 0;
@@ -5724,7 +5720,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr18_0); return Some(expr18_0);
} }
&Opcode::Bint => { &Opcode::Bint => {
// Rule at src/isa/x64/lower.isle line 2099. // Rule at src/isa/x64/lower.isle line 2100.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr2_0: u32 = 1; let expr2_0: u32 = 1;
@@ -5742,7 +5738,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Uextend => { &Opcode::Uextend => {
let pattern7_0 = C::value_type(ctx, pattern5_1); let pattern7_0 = C::value_type(ctx, pattern5_1);
if pattern7_0 == I64 { if pattern7_0 == I64 {
// Rule at src/isa/x64/lower.isle line 1971. // Rule at src/isa/x64/lower.isle line 1972.
let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr0_0 = C::put_in_reg(ctx, pattern5_1);
let expr1_0: Type = I64; let expr1_0: Type = I64;
let expr2_0: u64 = 0; let expr2_0: u64 = 0;
@@ -5752,7 +5748,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
// Rule at src/isa/x64/lower.isle line 1975. // Rule at src/isa/x64/lower.isle line 1976.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = ExtendKind::Zero; let expr1_0 = ExtendKind::Zero;
let expr2_0 = let expr2_0 =
@@ -5812,7 +5808,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
match pattern5_0 { match pattern5_0 {
&Opcode::Fadd => { &Opcode::Fadd => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2122. // Rule at src/isa/x64/lower.isle line 2123.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_addss(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_addss(ctx, expr0_0, &expr1_0)?;
@@ -5821,7 +5817,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fsub => { &Opcode::Fsub => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2133. // Rule at src/isa/x64/lower.isle line 2134.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_subss(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_subss(ctx, expr0_0, &expr1_0)?;
@@ -5830,7 +5826,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmul => { &Opcode::Fmul => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2144. // Rule at src/isa/x64/lower.isle line 2145.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_mulss(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_mulss(ctx, expr0_0, &expr1_0)?;
@@ -5839,7 +5835,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fdiv => { &Opcode::Fdiv => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2155. // Rule at src/isa/x64/lower.isle line 2156.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_divss(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_divss(ctx, expr0_0, &expr1_0)?;
@@ -5848,7 +5844,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmin => { &Opcode::Fmin => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2166. // Rule at src/isa/x64/lower.isle line 2167.
let expr0_0: Type = F32; let expr0_0: Type = F32;
let expr1_0: bool = true; let expr1_0: bool = true;
let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
@@ -5860,7 +5856,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FminPseudo => { &Opcode::FminPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2335. // Rule at src/isa/x64/lower.isle line 2336.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_minss(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minss(ctx, expr0_0, expr1_0)?;
@@ -5869,7 +5865,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmax => { &Opcode::Fmax => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2238. // Rule at src/isa/x64/lower.isle line 2239.
let expr0_0: Type = F32; let expr0_0: Type = F32;
let expr1_0: bool = false; let expr1_0: bool = false;
let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
@@ -5881,7 +5877,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FmaxPseudo => { &Opcode::FmaxPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2346. // Rule at src/isa/x64/lower.isle line 2347.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_maxss(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxss(ctx, expr0_0, expr1_0)?;
@@ -5902,7 +5898,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
match pattern5_0 { match pattern5_0 {
&Opcode::Fadd => { &Opcode::Fadd => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2124. // Rule at src/isa/x64/lower.isle line 2125.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_addsd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_addsd(ctx, expr0_0, &expr1_0)?;
@@ -5911,7 +5907,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fsub => { &Opcode::Fsub => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2135. // Rule at src/isa/x64/lower.isle line 2136.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_subsd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_subsd(ctx, expr0_0, &expr1_0)?;
@@ -5920,7 +5916,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmul => { &Opcode::Fmul => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2146. // Rule at src/isa/x64/lower.isle line 2147.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_mulsd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_mulsd(ctx, expr0_0, &expr1_0)?;
@@ -5929,7 +5925,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fdiv => { &Opcode::Fdiv => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2157. // Rule at src/isa/x64/lower.isle line 2158.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_divsd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_divsd(ctx, expr0_0, &expr1_0)?;
@@ -5938,7 +5934,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmin => { &Opcode::Fmin => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2168. // Rule at src/isa/x64/lower.isle line 2169.
let expr0_0: Type = F64; let expr0_0: Type = F64;
let expr1_0: bool = true; let expr1_0: bool = true;
let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
@@ -5950,7 +5946,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FminPseudo => { &Opcode::FminPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2337. // Rule at src/isa/x64/lower.isle line 2338.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_minsd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minsd(ctx, expr0_0, expr1_0)?;
@@ -5959,7 +5955,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmax => { &Opcode::Fmax => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2240. // Rule at src/isa/x64/lower.isle line 2241.
let expr0_0: Type = F64; let expr0_0: Type = F64;
let expr1_0: bool = false; let expr1_0: bool = false;
let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
@@ -5971,7 +5967,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FmaxPseudo => { &Opcode::FmaxPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2348. // Rule at src/isa/x64/lower.isle line 2349.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_maxsd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxsd(ctx, expr0_0, expr1_0)?;
@@ -6110,7 +6106,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr2_0); return Some(expr2_0);
} }
&Opcode::Popcnt => { &Opcode::Popcnt => {
// Rule at src/isa/x64/lower.isle line 1855. // Rule at src/isa/x64/lower.isle line 1856.
let expr0_0 = C::popcount_4bit_table(ctx); let expr0_0 = C::popcount_4bit_table(ctx);
let expr1_0: Type = I8X16; let expr1_0: Type = I8X16;
let expr2_0 = C::popcount_low_mask(ctx); let expr2_0 = C::popcount_low_mask(ctx);
@@ -6327,7 +6323,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::WideningPairwiseDotProductS => { &Opcode::WideningPairwiseDotProductS => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2112. // Rule at src/isa/x64/lower.isle line 2113.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_pmaddwd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_pmaddwd(ctx, expr0_0, &expr1_0)?;
@@ -6466,7 +6462,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
match pattern5_0 { match pattern5_0 {
&Opcode::Fadd => { &Opcode::Fadd => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2126. // Rule at src/isa/x64/lower.isle line 2127.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_addps(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_addps(ctx, expr0_0, &expr1_0)?;
@@ -6475,7 +6471,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fsub => { &Opcode::Fsub => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2137. // Rule at src/isa/x64/lower.isle line 2138.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_subps(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_subps(ctx, expr0_0, &expr1_0)?;
@@ -6484,7 +6480,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmul => { &Opcode::Fmul => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2148. // Rule at src/isa/x64/lower.isle line 2149.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_mulps(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_mulps(ctx, expr0_0, &expr1_0)?;
@@ -6493,7 +6489,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fdiv => { &Opcode::Fdiv => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2159. // Rule at src/isa/x64/lower.isle line 2160.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_divps(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_divps(ctx, expr0_0, &expr1_0)?;
@@ -6502,7 +6498,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmin => { &Opcode::Fmin => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2183. // Rule at src/isa/x64/lower.isle line 2184.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
@@ -6527,7 +6523,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FminPseudo => { &Opcode::FminPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2339. // Rule at src/isa/x64/lower.isle line 2340.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
@@ -6536,7 +6532,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmax => { &Opcode::Fmax => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2246. // Rule at src/isa/x64/lower.isle line 2247.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
@@ -6563,7 +6559,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FmaxPseudo => { &Opcode::FmaxPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2350. // Rule at src/isa/x64/lower.isle line 2351.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
@@ -6605,7 +6601,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
match pattern5_0 { match pattern5_0 {
&Opcode::Fadd => { &Opcode::Fadd => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2128. // Rule at src/isa/x64/lower.isle line 2129.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_addpd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_addpd(ctx, expr0_0, &expr1_0)?;
@@ -6614,7 +6610,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fsub => { &Opcode::Fsub => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2139. // Rule at src/isa/x64/lower.isle line 2140.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_subpd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_subpd(ctx, expr0_0, &expr1_0)?;
@@ -6623,7 +6619,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmul => { &Opcode::Fmul => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2150. // Rule at src/isa/x64/lower.isle line 2151.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_mulpd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_mulpd(ctx, expr0_0, &expr1_0)?;
@@ -6632,7 +6628,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fdiv => { &Opcode::Fdiv => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2161. // Rule at src/isa/x64/lower.isle line 2162.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
let expr2_0 = constructor_divpd(ctx, expr0_0, &expr1_0)?; let expr2_0 = constructor_divpd(ctx, expr0_0, &expr1_0)?;
@@ -6641,7 +6637,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmin => { &Opcode::Fmin => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2226. // Rule at src/isa/x64/lower.isle line 2227.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
@@ -6666,7 +6662,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FminPseudo => { &Opcode::FminPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2341. // Rule at src/isa/x64/lower.isle line 2342.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
@@ -6675,7 +6671,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::Fmax => { &Opcode::Fmax => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2289. // Rule at src/isa/x64/lower.isle line 2290.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
@@ -6702,7 +6698,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} }
&Opcode::FmaxPseudo => { &Opcode::FmaxPseudo => {
let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
// Rule at src/isa/x64/lower.isle line 2352. // Rule at src/isa/x64/lower.isle line 2353.
let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
@@ -6781,7 +6777,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
C::unpack_value_array_2(ctx, pattern9_1); C::unpack_value_array_2(ctx, pattern9_1);
match pattern9_2 { match pattern9_2 {
&FloatCC::Equal => { &FloatCC::Equal => {
// Rule at src/isa/x64/lower.isle line 1625. // Rule at src/isa/x64/lower.isle line 1626.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::NZ; let expr1_0 = CC::NZ;
@@ -6796,7 +6792,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
&FloatCC::GreaterThan => { &FloatCC::GreaterThan => {
// Rule at src/isa/x64/lower.isle line 1577. // Rule at src/isa/x64/lower.isle line 1578.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::NBE; let expr1_0 = CC::NBE;
@@ -6809,7 +6805,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::GreaterThanOrEqual => { &FloatCC::GreaterThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1580. // Rule at src/isa/x64/lower.isle line 1581.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::NB; let expr1_0 = CC::NB;
@@ -6822,7 +6818,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::LessThan => { &FloatCC::LessThan => {
// Rule at src/isa/x64/lower.isle line 1600. // Rule at src/isa/x64/lower.isle line 1601.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::NBE; let expr1_0 = CC::NBE;
@@ -6835,7 +6831,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::LessThanOrEqual => { &FloatCC::LessThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1603. // Rule at src/isa/x64/lower.isle line 1604.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::NB; let expr1_0 = CC::NB;
@@ -6848,7 +6844,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::NotEqual => { &FloatCC::NotEqual => {
// Rule at src/isa/x64/lower.isle line 1628. // Rule at src/isa/x64/lower.isle line 1629.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::NZ; let expr1_0 = CC::NZ;
@@ -6863,7 +6859,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
&FloatCC::Ordered => { &FloatCC::Ordered => {
// Rule at src/isa/x64/lower.isle line 1571. // Rule at src/isa/x64/lower.isle line 1572.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::NP; let expr1_0 = CC::NP;
@@ -6876,7 +6872,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::Unordered => { &FloatCC::Unordered => {
// Rule at src/isa/x64/lower.isle line 1574. // Rule at src/isa/x64/lower.isle line 1575.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::P; let expr1_0 = CC::P;
@@ -6889,7 +6885,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::UnorderedOrGreaterThan => { &FloatCC::UnorderedOrGreaterThan => {
// Rule at src/isa/x64/lower.isle line 1606. // Rule at src/isa/x64/lower.isle line 1607.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::B; let expr1_0 = CC::B;
@@ -6902,7 +6898,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::UnorderedOrGreaterThanOrEqual => { &FloatCC::UnorderedOrGreaterThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1609. // Rule at src/isa/x64/lower.isle line 1610.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
let expr1_0 = CC::BE; let expr1_0 = CC::BE;
@@ -6915,7 +6911,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::UnorderedOrLessThan => { &FloatCC::UnorderedOrLessThan => {
// Rule at src/isa/x64/lower.isle line 1583. // Rule at src/isa/x64/lower.isle line 1584.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::B; let expr1_0 = CC::B;
@@ -6928,7 +6924,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr4_0); return Some(expr4_0);
} }
&FloatCC::UnorderedOrLessThanOrEqual => { &FloatCC::UnorderedOrLessThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1586. // Rule at src/isa/x64/lower.isle line 1587.
let expr0_0 = let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::BE; let expr1_0 = CC::BE;
@@ -6955,14 +6951,14 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Breduce => { &Opcode::Breduce => {
let pattern6_0 = C::value_type(ctx, pattern4_1); let pattern6_0 = C::value_type(ctx, pattern4_1);
if pattern6_0 == pattern2_0 { if pattern6_0 == pattern2_0 {
// Rule at src/isa/x64/lower.isle line 2085. // Rule at src/isa/x64/lower.isle line 2086.
let expr0_0 = constructor_output_value(ctx, pattern4_1)?; let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
return Some(expr0_0); return Some(expr0_0);
} }
} }
&Opcode::Bextend => { &Opcode::Bextend => {
let pattern6_0 = C::value_type(ctx, pattern4_1); let pattern6_0 = C::value_type(ctx, pattern4_1);
// Rule at src/isa/x64/lower.isle line 2066. // Rule at src/isa/x64/lower.isle line 2067.
let expr0_0 = let expr0_0 =
constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
return Some(expr0_0); return Some(expr0_0);
@@ -6970,7 +6966,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ireduce => { &Opcode::Ireduce => {
let pattern6_0 = C::value_type(ctx, pattern4_1); let pattern6_0 = C::value_type(ctx, pattern4_1);
if pattern6_0 == pattern2_0 { if pattern6_0 == pattern2_0 {
// Rule at src/isa/x64/lower.isle line 2074. // Rule at src/isa/x64/lower.isle line 2075.
let expr0_0 = constructor_output_value(ctx, pattern4_1)?; let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
return Some(expr0_0); return Some(expr0_0);
} }
@@ -6978,14 +6974,14 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Uextend => { &Opcode::Uextend => {
let pattern6_0 = C::value_type(ctx, pattern4_1); let pattern6_0 = C::value_type(ctx, pattern4_1);
if pattern6_0 == pattern2_0 { if pattern6_0 == pattern2_0 {
// Rule at src/isa/x64/lower.isle line 1967. // Rule at src/isa/x64/lower.isle line 1968.
let expr0_0 = constructor_output_value(ctx, pattern4_1)?; let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
return Some(expr0_0); return Some(expr0_0);
} }
} }
&Opcode::Sextend => { &Opcode::Sextend => {
let pattern6_0 = C::value_type(ctx, pattern4_1); let pattern6_0 = C::value_type(ctx, pattern4_1);
// Rule at src/isa/x64/lower.isle line 2060. // Rule at src/isa/x64/lower.isle line 2061.
let expr0_0 = let expr0_0 =
constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
return Some(expr0_0); return Some(expr0_0);
@@ -8181,7 +8177,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
if let &Opcode::Uextend = pattern5_0 { if let &Opcode::Uextend = pattern5_0 {
let pattern7_0 = C::value_type(ctx, pattern5_1); let pattern7_0 = C::value_type(ctx, pattern5_1);
if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
// Rule at src/isa/x64/lower.isle line 1983. // Rule at src/isa/x64/lower.isle line 1984.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0 = ExtendKind::Zero; let expr1_0 = ExtendKind::Zero;
let expr2_0 = let expr2_0 =
@@ -8618,7 +8614,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr2_0); return Some(expr2_0);
} }
&Opcode::Breduce => { &Opcode::Breduce => {
// Rule at src/isa/x64/lower.isle line 2088. // Rule at src/isa/x64/lower.isle line 2089.
let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr0_0 = C::put_in_regs(ctx, pattern5_1);
let expr1_0: usize = 0; let expr1_0: usize = 0;
let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
@@ -8626,7 +8622,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr3_0); return Some(expr3_0);
} }
&Opcode::Bint => { &Opcode::Bint => {
// Rule at src/isa/x64/lower.isle line 2096. // Rule at src/isa/x64/lower.isle line 2097.
let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr1_0: u32 = 1; let expr1_0: u32 = 1;
let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
@@ -8636,7 +8632,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
&Opcode::Ireduce => { &Opcode::Ireduce => {
// Rule at src/isa/x64/lower.isle line 2080. // Rule at src/isa/x64/lower.isle line 2081.
let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr0_0 = C::put_in_regs(ctx, pattern5_1);
let expr1_0: usize = 0; let expr1_0: usize = 0;
let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
@@ -8750,21 +8746,21 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} => { } => {
match pattern5_0 { match pattern5_0 {
&Opcode::Clz => { &Opcode::Clz => {
// Rule at src/isa/x64/lower.isle line 1644. // Rule at src/isa/x64/lower.isle line 1645.
let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
return Some(expr2_0); return Some(expr2_0);
} }
&Opcode::Ctz => { &Opcode::Ctz => {
// Rule at src/isa/x64/lower.isle line 1686. // Rule at src/isa/x64/lower.isle line 1687.
let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
return Some(expr2_0); return Some(expr2_0);
} }
&Opcode::Popcnt => { &Opcode::Popcnt => {
// Rule at src/isa/x64/lower.isle line 1738. // Rule at src/isa/x64/lower.isle line 1739.
let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?; let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?;
let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
@@ -8867,7 +8863,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} => { } => {
match pattern5_0 { match pattern5_0 {
&Opcode::Clz => { &Opcode::Clz => {
// Rule at src/isa/x64/lower.isle line 1649. // Rule at src/isa/x64/lower.isle line 1650.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0: Type = I32; let expr1_0: Type = I32;
let expr2_0 = ExtendKind::Zero; let expr2_0 = ExtendKind::Zero;
@@ -8878,7 +8874,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
&Opcode::Ctz => { &Opcode::Ctz => {
// Rule at src/isa/x64/lower.isle line 1691. // Rule at src/isa/x64/lower.isle line 1692.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0: Type = I32; let expr1_0: Type = I32;
let expr2_0 = ExtendKind::Zero; let expr2_0 = ExtendKind::Zero;
@@ -8889,7 +8885,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr5_0); return Some(expr5_0);
} }
&Opcode::Popcnt => { &Opcode::Popcnt => {
// Rule at src/isa/x64/lower.isle line 1743. // Rule at src/isa/x64/lower.isle line 1744.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0: Type = I32; let expr1_0: Type = I32;
let expr2_0 = ExtendKind::Zero; let expr2_0 = ExtendKind::Zero;
@@ -9521,7 +9517,7 @@ pub fn constructor_do_clz<C: Context>(
let pattern0_0 = arg0; let pattern0_0 = arg0;
let pattern1_0 = arg1; let pattern1_0 = arg1;
let pattern2_0 = arg2; let pattern2_0 = arg2;
// Rule at src/isa/x64/lower.isle line 1669. // Rule at src/isa/x64/lower.isle line 1670.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0: i64 = -1; let expr1_0: i64 = -1;
let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?;
@@ -9548,7 +9544,7 @@ pub fn constructor_do_ctz<C: Context>(
let pattern0_0 = arg0; let pattern0_0 = arg0;
let pattern1_0 = arg1; let pattern1_0 = arg1;
let pattern2_0 = arg2; let pattern2_0 = arg2;
// Rule at src/isa/x64/lower.isle line 1710. // Rule at src/isa/x64/lower.isle line 1711.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = C::ty_bits_u64(ctx, pattern1_0); let expr1_0 = C::ty_bits_u64(ctx, pattern1_0);
let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
@@ -9562,7 +9558,7 @@ pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) ->
let pattern0_0 = arg0; let pattern0_0 = arg0;
if pattern0_0 == I32 { if pattern0_0 == I32 {
let pattern2_0 = arg1; let pattern2_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1801. // Rule at src/isa/x64/lower.isle line 1802.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0: u8 = 1; let expr1_0: u8 = 1;
let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
@@ -9627,7 +9623,7 @@ pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) ->
} }
if pattern0_0 == I64 { if pattern0_0 == I64 {
let pattern2_0 = arg1; let pattern2_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1758. // Rule at src/isa/x64/lower.isle line 1759.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0: u8 = 1; let expr1_0: u8 = 1;
let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
@@ -9701,7 +9697,7 @@ pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) ->
pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
let pattern0_0 = arg0; let pattern0_0 = arg0;
let pattern1_0 = arg1; let pattern1_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1890. // Rule at src/isa/x64/lower.isle line 1891.
let expr0_0 = C::ty_mask(ctx, pattern0_0); let expr0_0 = C::ty_mask(ctx, pattern0_0);
let expr1_0: u64 = 6148914691236517205; let expr1_0: u64 = 6148914691236517205;
let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0); let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0);
@@ -9764,7 +9760,7 @@ pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) ->
pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
let pattern0_0 = arg0; let pattern0_0 = arg0;
let pattern1_0 = arg1; let pattern1_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1913. // Rule at src/isa/x64/lower.isle line 1914.
let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?; let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?;
let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr1_0 = C::ty_mask(ctx, pattern0_0);
let expr2_0: u64 = 71777214294589695; let expr2_0: u64 = 71777214294589695;
@@ -9792,7 +9788,7 @@ pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -
pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
let pattern0_0 = arg0; let pattern0_0 = arg0;
let pattern1_0 = arg1; let pattern1_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1925. // Rule at src/isa/x64/lower.isle line 1926.
let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?; let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?;
let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr1_0 = C::ty_mask(ctx, pattern0_0);
let expr2_0: u64 = 281470681808895; let expr2_0: u64 = 281470681808895;
@@ -9821,7 +9817,7 @@ pub fn constructor_do_bitrev64<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -
let pattern0_0 = arg0; let pattern0_0 = arg0;
if pattern0_0 == I64 { if pattern0_0 == I64 {
let pattern2_0 = arg1; let pattern2_0 = arg1;
// Rule at src/isa/x64/lower.isle line 1937. // Rule at src/isa/x64/lower.isle line 1938.
let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?; let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?;
let expr1_0: u64 = 4294967295; let expr1_0: u64 = 4294967295;
let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?; let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?;
@@ -9855,7 +9851,7 @@ pub fn constructor_generic_sextend<C: Context>(
if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) {
let pattern3_0 = arg2; let pattern3_0 = arg2;
if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) { if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) {
// Rule at src/isa/x64/lower.isle line 2057. // Rule at src/isa/x64/lower.isle line 2058.
let expr0_0: Type = I32; let expr0_0: Type = I32;
let expr1_0 = ExtendKind::Sign; let expr1_0 = ExtendKind::Sign;
let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
@@ -9863,7 +9859,7 @@ pub fn constructor_generic_sextend<C: Context>(
return Some(expr3_0); return Some(expr3_0);
} }
if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) { if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) {
// Rule at src/isa/x64/lower.isle line 2053. // Rule at src/isa/x64/lower.isle line 2054.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = ExtendKind::Sign; let expr1_0 = ExtendKind::Sign;
let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
@@ -9871,7 +9867,7 @@ pub fn constructor_generic_sextend<C: Context>(
return Some(expr3_0); return Some(expr3_0);
} }
if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
// Rule at src/isa/x64/lower.isle line 2047. // Rule at src/isa/x64/lower.isle line 2048.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0 = ExtendKind::Sign; let expr1_0 = ExtendKind::Sign;
let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
@@ -9886,7 +9882,7 @@ pub fn constructor_generic_sextend<C: Context>(
if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) { if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) {
let pattern3_0 = arg2; let pattern3_0 = arg2;
if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
// Rule at src/isa/x64/lower.isle line 2043. // Rule at src/isa/x64/lower.isle line 2044.
let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr0_0 = C::put_in_reg(ctx, pattern0_0);
let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?; let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?;
@@ -9898,7 +9894,7 @@ pub fn constructor_generic_sextend<C: Context>(
} }
let pattern2_0 = arg2; let pattern2_0 = arg2;
if pattern2_0 == pattern1_0 { if pattern2_0 == pattern1_0 {
// Rule at src/isa/x64/lower.isle line 2033. // Rule at src/isa/x64/lower.isle line 2034.
let expr0_0 = constructor_output_value(ctx, pattern0_0)?; let expr0_0 = constructor_output_value(ctx, pattern0_0)?;
return Some(expr0_0); return Some(expr0_0);
} }
@@ -9908,7 +9904,7 @@ pub fn constructor_generic_sextend<C: Context>(
// Generated as internal constructor for term spread_sign_bit. // Generated as internal constructor for term spread_sign_bit.
pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> { pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> {
let pattern0_0 = arg0; let pattern0_0 = arg0;
// Rule at src/isa/x64/lower.isle line 2039. // Rule at src/isa/x64/lower.isle line 2040.
let expr0_0: Type = I64; let expr0_0: Type = I64;
let expr1_0: u8 = 63; let expr1_0: u8 = 63;
let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };

View File

@@ -246,7 +246,7 @@ block0(v0: i128, v1: i128):
; Inst 10: cmpq %rcx, %rsi ; Inst 10: cmpq %rcx, %rsi
; Inst 11: setz %r8b ; Inst 11: setz %r8b
; Inst 12: andq %r8, %rax ; Inst 12: andq %r8, %rax
; Inst 13: andq $1, %rax ; Inst 13: testq $1, %rax
; Inst 14: setnz %al ; Inst 14: setnz %al
; Inst 15: movq %rax, rsp(0 + virtual offset) ; Inst 15: movq %rax, rsp(0 + virtual offset)
; Inst 16: cmpq %rdx, %rdi ; Inst 16: cmpq %rdx, %rdi
@@ -254,7 +254,7 @@ block0(v0: i128, v1: i128):
; Inst 18: cmpq %rcx, %rsi ; Inst 18: cmpq %rcx, %rsi
; Inst 19: setnz %r8b ; Inst 19: setnz %r8b
; Inst 20: orq %r8, %rax ; Inst 20: orq %r8, %rax
; Inst 21: andq $1, %rax ; Inst 21: testq $1, %rax
; Inst 22: setnz %r8b ; Inst 22: setnz %r8b
; Inst 23: cmpq %rcx, %rsi ; Inst 23: cmpq %rcx, %rsi
; Inst 24: setl %r9b ; Inst 24: setl %r9b