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))))
;; 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
;; unchanged so we must compare against 1; this instruction combines
;; `cmp_lo` and `cmp_hi` for that final comparison.
;; unchanged so we must compare against 1 below; this instruction
;; combines `cmp_lo` and `cmp_hi` for that final comparison.
(cmp Reg (x64_and $I64 cmp_lo cmp_hi)))
;; We can use the flag-setting behavior of `AND` to set the final
;; bits. If the result of `AND` is zero, then the `ZF` will be set;
;; if either of the halves `AND`s to 0, they were not equal,
;; therefore we `SETcc` with `NZ`.
(with_flags (x64_and_with_flags_paired $I64 cmp (RegMemImm.Imm 1)) (setcc (CC.NZ)))))
;; We must compare one more time against the immediate value 1 to
;; check if both `cmp_lo` and `cmp_hi` are true. If `cmp AND 1 == 0`
;; then the `ZF` will be set (see `TEST` definition); if either of
;; the halves `AND`s to 0, they were not equal, therefore we `SETcc`
;; with `NZ`.
(with_flags (test (OperandSize.Size64) (RegMemImm.Imm 1) cmp) (setcc (CC.NZ)))))
(rule (lower (icmp (IntCC.NotEqual) a @ (value_type $I128) b))
(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))))
;; See comments for `IntCC.Equal`.
(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` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -1,4 +1,4 @@
src/clif.isle 9ea75a6f790b5c03
src/prelude.isle b2bc986bcbbbb77
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
{
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 expr1_0 = C::put_in_regs(ctx, pattern6_1);
let expr2_0: usize = 0;
@@ -4612,7 +4612,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} = &pattern6_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 expr1_0 = constructor_vpopcntb(ctx, &expr0_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
{
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 expr1_0 = constructor_lzcnt(ctx, pattern3_0, expr0_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
{
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 expr1_0 = constructor_tzcnt(ctx, pattern3_0, expr0_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
{
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 expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_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
{
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 expr1_0: Type = I32;
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,
} => {
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 expr1_0 = constructor_side_effect(ctx, &expr0_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 expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?;
let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
let expr29_0: Type = I64;
let expr30_0 = C::gpr_new(ctx, expr28_0);
let expr31_0: u32 = 1;
let expr32_0 = RegMemImm::Imm { simm32: expr31_0 };
let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0);
let expr34_0 = constructor_x64_and_with_flags_paired(
ctx, expr29_0, expr30_0, &expr33_0,
)?;
let expr29_0 = OperandSize::Size64;
let expr30_0: u32 = 1;
let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
let expr33_0 = C::gpr_new(ctx, expr28_0);
let expr34_0 = constructor_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
let expr35_0 = CC::NZ;
let expr36_0 = constructor_setcc(ctx, &expr35_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);
}
&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 expr1_0: usize = 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 expr27_0 = constructor_or(ctx, expr24_0, expr25_0, &expr26_0)?;
let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
let expr29_0: Type = I64;
let expr30_0 = C::gpr_new(ctx, expr28_0);
let expr31_0: u32 = 1;
let expr32_0 = RegMemImm::Imm { simm32: expr31_0 };
let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0);
let expr34_0 = constructor_x64_and_with_flags_paired(
ctx, expr29_0, expr30_0, &expr33_0,
)?;
let expr29_0 = OperandSize::Size64;
let expr30_0: u32 = 1;
let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
let expr33_0 = C::gpr_new(ctx, expr28_0);
let expr34_0 = constructor_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
let expr35_0 = CC::NZ;
let expr36_0 = constructor_setcc(ctx, &expr35_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 => {
let pattern4_0 = C::value_type(ctx, pattern2_1);
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 expr1_0: u32 = 0;
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 => {
let pattern4_0 = C::value_type(ctx, pattern2_1);
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 expr1_0: u32 = 4294967295;
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
{
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 expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
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
{
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 expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
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
{
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 expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
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 {
&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 expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
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 => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5266,7 +5262,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Isub => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5274,7 +5270,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Imul => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5282,7 +5278,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::IaddIfcout => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5290,7 +5286,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Band => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5298,7 +5294,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Bor => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5306,7 +5302,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Bxor => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5314,7 +5310,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ishl => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5322,7 +5318,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ushr => {
let (pattern14_0, pattern14_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 =
constructor_output_value(ctx, pattern5_1)?;
return Some(expr0_0);
@@ -5337,7 +5333,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
offset: pattern12_3,
} => {
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 =
constructor_output_value(ctx, pattern5_1)?;
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);
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 expr1_0 = ExtendKind::Zero;
let expr2_0 =
@@ -5609,7 +5605,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr1_0);
}
&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 expr1_0 = C::put_in_regs(ctx, pattern5_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);
}
&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 expr1_0: Type = I64;
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);
}
&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 expr1_0: Type = I64;
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);
}
&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 expr1_0 = C::put_in_regs(ctx, pattern5_1);
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);
}
&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 expr1_0 = constructor_put_in_gpr(ctx, pattern5_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 => {
let pattern7_0 = C::value_type(ctx, pattern5_1);
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 expr1_0: Type = I64;
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);
}
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 expr1_0 = ExtendKind::Zero;
let expr2_0 =
@@ -5812,7 +5808,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
match pattern5_0 {
&Opcode::Fadd => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0: bool = true;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 => {
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 expr1_0: bool = false;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 {
&Opcode::Fadd => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0: bool = true;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 => {
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 expr1_0: bool = false;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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);
}
&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 expr1_0: Type = I8X16;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 {
&Opcode::Fadd => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 {
&Opcode::Fadd => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
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 => {
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 expr1_0 = constructor_put_in_xmm(ctx, pattern7_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);
match pattern9_2 {
&FloatCC::Equal => {
// Rule at src/isa/x64/lower.isle line 1625.
// Rule at src/isa/x64/lower.isle line 1626.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::GreaterThan => {
// Rule at src/isa/x64/lower.isle line 1577.
// Rule at src/isa/x64/lower.isle line 1578.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
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);
}
&FloatCC::GreaterThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1580.
// Rule at src/isa/x64/lower.isle line 1581.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
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);
}
&FloatCC::LessThan => {
// Rule at src/isa/x64/lower.isle line 1600.
// Rule at src/isa/x64/lower.isle line 1601.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::LessThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1603.
// Rule at src/isa/x64/lower.isle line 1604.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::NotEqual => {
// Rule at src/isa/x64/lower.isle line 1628.
// Rule at src/isa/x64/lower.isle line 1629.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::Ordered => {
// Rule at src/isa/x64/lower.isle line 1571.
// Rule at src/isa/x64/lower.isle line 1572.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
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);
}
&FloatCC::Unordered => {
// Rule at src/isa/x64/lower.isle line 1574.
// Rule at src/isa/x64/lower.isle line 1575.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
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);
}
&FloatCC::UnorderedOrGreaterThan => {
// Rule at src/isa/x64/lower.isle line 1606.
// Rule at src/isa/x64/lower.isle line 1607.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::UnorderedOrGreaterThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1609.
// Rule at src/isa/x64/lower.isle line 1610.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
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);
}
&FloatCC::UnorderedOrLessThan => {
// Rule at src/isa/x64/lower.isle line 1583.
// Rule at src/isa/x64/lower.isle line 1584.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
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);
}
&FloatCC::UnorderedOrLessThanOrEqual => {
// Rule at src/isa/x64/lower.isle line 1586.
// Rule at src/isa/x64/lower.isle line 1587.
let expr0_0 =
constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
let expr1_0 = CC::BE;
@@ -6955,14 +6951,14 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Breduce => {
let pattern6_0 = C::value_type(ctx, pattern4_1);
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)?;
return Some(expr0_0);
}
}
&Opcode::Bextend => {
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 =
constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
return Some(expr0_0);
@@ -6970,7 +6966,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Ireduce => {
let pattern6_0 = C::value_type(ctx, pattern4_1);
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)?;
return Some(expr0_0);
}
@@ -6978,14 +6974,14 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
&Opcode::Uextend => {
let pattern6_0 = C::value_type(ctx, pattern4_1);
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)?;
return Some(expr0_0);
}
}
&Opcode::Sextend => {
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 =
constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_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 {
let pattern7_0 = C::value_type(ctx, pattern5_1);
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 expr1_0 = ExtendKind::Zero;
let expr2_0 =
@@ -8618,7 +8614,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
return Some(expr2_0);
}
&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 expr1_0: usize = 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);
}
&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 expr1_0: u32 = 1;
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);
}
&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 expr1_0: usize = 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 {
&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 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 1686.
// Rule at src/isa/x64/lower.isle line 1687.
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 1738.
// Rule at src/isa/x64/lower.isle line 1739.
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)?;
@@ -8867,7 +8863,7 @@ pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutp
} => {
match pattern5_0 {
&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 expr1_0: Type = I32;
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);
}
&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 expr1_0: Type = I32;
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);
}
&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 expr1_0: Type = I32;
let expr2_0 = ExtendKind::Zero;
@@ -9521,7 +9517,7 @@ pub fn constructor_do_clz<C: Context>(
let pattern0_0 = arg0;
let pattern1_0 = arg1;
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 expr1_0: i64 = -1;
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 pattern1_0 = arg1;
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 expr1_0 = C::ty_bits_u64(ctx, pattern1_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;
if pattern0_0 == I32 {
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 expr1_0: u8 = 1;
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 {
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 expr1_0: u8 = 1;
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> {
let pattern0_0 = arg0;
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 expr1_0: u64 = 6148914691236517205;
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> {
let pattern0_0 = arg0;
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 expr1_0 = C::ty_mask(ctx, pattern0_0);
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> {
let pattern0_0 = arg0;
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 expr1_0 = C::ty_mask(ctx, pattern0_0);
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;
if pattern0_0 == I64 {
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 expr1_0: u64 = 4294967295;
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) {
let pattern3_0 = arg2;
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 expr1_0 = ExtendKind::Sign;
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);
}
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 expr1_0 = ExtendKind::Sign;
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);
}
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 expr1_0 = ExtendKind::Sign;
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) {
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 2043.
// Rule at src/isa/x64/lower.isle line 2044.
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)?;
@@ -9898,7 +9894,7 @@ pub fn constructor_generic_sextend<C: Context>(
}
let pattern2_0 = arg2;
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)?;
return Some(expr0_0);
}
@@ -9908,7 +9904,7 @@ pub fn constructor_generic_sextend<C: Context>(
// Generated as internal constructor for term spread_sign_bit.
pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> {
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 expr1_0: u8 = 63;
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 11: setz %r8b
; Inst 12: andq %r8, %rax
; Inst 13: andq $1, %rax
; Inst 13: testq $1, %rax
; Inst 14: setnz %al
; Inst 15: movq %rax, rsp(0 + virtual offset)
; Inst 16: cmpq %rdx, %rdi
@@ -254,7 +254,7 @@ block0(v0: i128, v1: i128):
; Inst 18: cmpq %rcx, %rsi
; Inst 19: setnz %r8b
; Inst 20: orq %r8, %rax
; Inst 21: andq $1, %rax
; Inst 21: testq $1, %rax
; Inst 22: setnz %r8b
; Inst 23: cmpq %rcx, %rsi
; Inst 24: setl %r9b