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