diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index af11e659de8d..e0d17fe627a4 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -2082,8 +2082,7 @@ ;; than one instruction for certain types (e.g., XMM-held, I128). (rule (lower (has_type ty (select (maybe_uextend (icmp cc a @ (value_type (fits_in_64 a_ty)) b)) x y))) - (let ((size OperandSize (raw_operand_size_of_type a_ty))) - (with_flags (x64_cmp size b a) (cmove_from_values ty cc x y)))) + (lower_select_icmp ty (emit_cmp cc a b) x y)) ;; Finally, we lower `select` from a condition value `c`. These rules are meant ;; to be the final, default lowerings if no other patterns matched above. @@ -2099,6 +2098,10 @@ (let ((cond_result IcmpCondResult (cmp_zero_i128 (CC.Z) c))) (select_icmp cond_result x y))) +(decl lower_select_icmp (Type IcmpCondResult Value Value) InstOutput) +(rule (lower_select_icmp ty (IcmpCondResult.Condition flags cc) x y) + (with_flags flags (cmove_from_values ty cc x y))) + ;; Specializations for floating-point compares to generate a `mins*` or a ;; `maxs*` instruction. These are equivalent to the "pseudo-m{in,ax}" ;; specializations for vectors.