1;; For various ops lift a splat outside of the op to try to open up 2;; optimization opportunities with scalars. 3 4;; NB: for int-to-float conversion op this simplification is also 5;; required for the x64 backend because it doesn't fully implement int-to-float 6;; conversions for 64x2 vectors, for more information see #6562 7(rule (simplify (fcvt_from_uint float_vector_ty (splat _ x))) 8 (splat float_vector_ty (fcvt_from_uint (lane_type float_vector_ty) x))) 9(rule (simplify (fcvt_from_sint float_vector_ty (splat _ x))) 10 (splat float_vector_ty (fcvt_from_sint (lane_type float_vector_ty) x))) 11 12;; Scalar bitwise ops are usually not implemented in the backends for floats, so 13;; disable this transform. 14 15(rule (simplify (band ty (splat ty x) (splat ty y))) 16 (if (ty_vector_not_float ty)) 17 (splat ty (band (lane_type ty) x y))) 18 19(rule (simplify (bor ty (splat ty x) (splat ty y))) 20 (if (ty_vector_not_float ty)) 21 (splat ty (bor (lane_type ty) x y))) 22 23(rule (simplify (bxor ty (splat ty x) (splat ty y))) 24 (if (ty_vector_not_float ty)) 25 (splat ty (bxor (lane_type ty) x y))) 26 27(rule (simplify (bnot ty (splat ty x))) 28 (if (ty_vector_not_float ty)) 29 (splat ty (bnot (lane_type ty) x))) 30 31(rule (simplify (iadd ty (splat ty x) (splat ty y))) 32 (splat ty (iadd (lane_type ty) x y))) 33 34(rule (simplify (isub ty (splat ty x) (splat ty y))) 35 (splat ty (isub (lane_type ty) x y))) 36 37(rule (simplify (imul ty (splat ty x) (splat ty y))) 38 (splat ty (imul (lane_type ty) x y))) 39 40(rule (simplify (smulhi ty (splat ty x) (splat ty y))) 41 (splat ty (smulhi (lane_type ty) x y))) 42 43(rule (simplify (umulhi ty (splat ty x) (splat ty y))) 44 (splat ty (umulhi (lane_type ty) x y))) 45 46(rule (simplify (ineg ty (splat ty x))) 47 (splat ty (ineg (lane_type ty) x))) 48 49(rule (simplify (iabs ty (splat ty x))) 50 (splat ty (iabs (lane_type ty) x))) 51 52(rule (simplify (popcnt ty (splat ty x))) 53 (splat ty (popcnt (lane_type ty) x))) 54 55(rule (simplify (smin ty (splat ty x) (splat ty y))) 56 (splat ty (smin (lane_type ty) x y))) 57 58(rule (simplify (umin ty (splat ty x) (splat ty y))) 59 (splat ty (umin (lane_type ty) x y))) 60 61(rule (simplify (smax ty (splat ty x) (splat ty y))) 62 (splat ty (smax (lane_type ty) x y))) 63 64(rule (simplify (umax ty (splat ty x) (splat ty y))) 65 (splat ty (umax (lane_type ty) x y))) 66 67;; The second operand of shift and rotate ops is 68;; scalar so splat opt applies only to the first 69(rule (simplify (rotl ty (splat ty x) y)) 70 (splat ty (rotl (lane_type ty) x y))) 71 72(rule (simplify (rotr ty (splat ty x) y)) 73 (splat ty (rotr (lane_type ty) x y))) 74 75(rule (simplify (ishl ty (splat ty x) y)) 76 (splat ty (ishl (lane_type ty) x y))) 77 78(rule (simplify (ushr ty (splat ty x) y)) 79 (splat ty (ushr (lane_type ty) x y))) 80 81(rule (simplify (sshr ty (splat ty x) y)) 82 (splat ty (sshr (lane_type ty) x y))) 83 84;; {u,s}widen_{low,high}+splat is the same as splat+{u,s}extend 85(rule (simplify (swiden_high wide (splat _ x))) (splat wide (sextend (lane_type wide) x))) 86(rule (simplify (swiden_low wide (splat _ x))) (splat wide (sextend (lane_type wide) x))) 87 88(rule (simplify (uwiden_high wide (splat _ x))) (splat wide (uextend (lane_type wide) x))) 89(rule (simplify (uwiden_low wide (splat _ x))) (splat wide (uextend (lane_type wide) x))) 90