xref: /llvm-project/llvm/test/CodeGen/WebAssembly/vector-reduce.ll (revision a3de21cac1fb8f1dd98cfe1d1443e2d3f0a97351)
1d28ed29dSSam Parker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2d28ed29dSSam Parker; RUN: llc < %s -mtriple=wasm32 -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s --check-prefix=SIMD128
3d28ed29dSSam Parker
4d28ed29dSSam Parkerdefine i64 @pairwise_add_v2i64(<2 x i64> %arg) {
5d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v2i64:
6d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v2i64 (v128) -> (i64)
7d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
8d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
9d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.add $push1=, $0, $pop0
10d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
11d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
12d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.add.i64.v4i64(<2 x i64> %arg)
13d28ed29dSSam Parker  ret i64 %res
14d28ed29dSSam Parker}
15d28ed29dSSam Parker
16d28ed29dSSam Parkerdefine i32 @pairwise_add_v4i32(<4 x i32> %arg) {
17d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v4i32:
18d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v4i32 (v128) -> (i32)
19d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
20d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
21d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.add $push5=, $0, $pop0
22d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
23d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
24d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.add $push2=, $pop4, $pop1
25d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
26d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
27d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %arg)
28d28ed29dSSam Parker  ret i32 %res
29d28ed29dSSam Parker}
30d28ed29dSSam Parker
31d28ed29dSSam Parkerdefine i16 @pairwise_add_v8i16(<8 x i16> %arg) {
32d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v8i16:
33d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v8i16 (v128) -> (i32)
34d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
35d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
36d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.add $push8=, $0, $pop0
37d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
38d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
39d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.add $push6=, $pop7, $pop1
40d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
41d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
42d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.add $push3=, $pop5, $pop2
43d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
44d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
45d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %arg)
46d28ed29dSSam Parker  ret i16 %res
47d28ed29dSSam Parker}
48d28ed29dSSam Parker
49d28ed29dSSam Parkerdefine i8 @pairwise_add_v16i8(<16 x i8> %arg) {
50d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v16i8:
51d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v16i8 (v128) -> (i32)
52d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
53d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
54d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.add $push11=, $0, $pop0
55d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
56d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
57d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.add $push9=, $pop10, $pop1
58d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
59d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
60d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.add $push7=, $pop8, $pop2
61d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
62d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
63d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.add $push4=, $pop6, $pop3
64d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
65d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
66d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %arg)
67d28ed29dSSam Parker  ret i8 %res
68d28ed29dSSam Parker}
69d28ed29dSSam Parker
70d28ed29dSSam Parkerdefine i64 @pairwise_mul_v2i64(<2 x i64> %arg) {
71d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v2i64:
72d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v2i64 (v128) -> (i64)
73d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
74d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
75d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.mul $push1=, $0, $pop0
76d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
77d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
78d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.mul.v2i64(<2 x i64> %arg)
79d28ed29dSSam Parker  ret i64 %res
80d28ed29dSSam Parker}
81d28ed29dSSam Parker
82d28ed29dSSam Parkerdefine i32 @pairwise_mul_v4i32(<4 x i32> %arg) {
83d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v4i32:
84d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v4i32 (v128) -> (i32)
85d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
86d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
87d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.mul $push5=, $0, $pop0
88d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
89d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
90d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.mul $push2=, $pop4, $pop1
91d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
92d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
93d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %arg)
94d28ed29dSSam Parker  ret i32 %res
95d28ed29dSSam Parker}
96d28ed29dSSam Parker
97d28ed29dSSam Parkerdefine i16 @pairwise_mul_v8i16(<8 x i16> %arg) {
98d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v8i16:
99d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v8i16 (v128) -> (i32)
100d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
101d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
102d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.mul $push8=, $0, $pop0
103d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
104d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
105d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.mul $push6=, $pop7, $pop1
106d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
107d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
108d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.mul $push3=, $pop5, $pop2
109d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
110d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
111d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.mul.v8i16(<8 x i16> %arg)
112d28ed29dSSam Parker  ret i16 %res
113d28ed29dSSam Parker}
114d28ed29dSSam Parker
115d28ed29dSSam Parkerdefine i8 @pairwise_mul_v16i8(<16 x i8> %arg) {
116d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v16i8:
117d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v16i8 (v128) -> (i32)
118d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
119d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push26=, $0, 0
120d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push32=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
121d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push31=, $1=, $pop32
122d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push25=, $pop31, 0
123d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push27=, $pop26, $pop25
124d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push23=, $0, 4
125d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push22=, $1, 4
126d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push24=, $pop23, $pop22
127d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push28=, $pop27, $pop24
128d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push19=, $0, 2
129d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push18=, $1, 2
130d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push20=, $pop19, $pop18
131d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push16=, $0, 6
132d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push15=, $1, 6
133d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push17=, $pop16, $pop15
134d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push21=, $pop20, $pop17
135d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push29=, $pop28, $pop21
136d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push11=, $0, 1
137d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push10=, $1, 1
138d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push12=, $pop11, $pop10
139d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push8=, $0, 5
140d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push7=, $1, 5
141d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push9=, $pop8, $pop7
142d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push13=, $pop12, $pop9
143d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push4=, $0, 3
144d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push3=, $1, 3
145d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push5=, $pop4, $pop3
146d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push1=, $0, 7
147d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push0=, $1, 7
148d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push2=, $pop1, $pop0
149d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push6=, $pop5, $pop2
150d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push14=, $pop13, $pop6
151d28ed29dSSam Parker; SIMD128-NEXT:    i32.mul $push30=, $pop29, $pop14
152d28ed29dSSam Parker; SIMD128-NEXT:    return $pop30
153d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.mul.v16i8(<16 x i8> %arg)
154d28ed29dSSam Parker  ret i8 %res
155d28ed29dSSam Parker}
156d28ed29dSSam Parker
157d28ed29dSSam Parkerdefine i64 @pairwise_and_v2i64(<2 x i64> %arg) {
158d28ed29dSSam Parker; SIMD128-LABEL: pairwise_and_v2i64:
159d28ed29dSSam Parker; SIMD128:         .functype pairwise_and_v2i64 (v128) -> (i64)
160d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
161d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
162d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push1=, $0, $pop0
163d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
164d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
165d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %arg)
166d28ed29dSSam Parker  ret i64 %res
167d28ed29dSSam Parker}
168d28ed29dSSam Parker
169d28ed29dSSam Parkerdefine i32 @pairwise_and_v4i32(<4 x i32> %arg) {
170d28ed29dSSam Parker; SIMD128-LABEL: pairwise_and_v4i32:
171d28ed29dSSam Parker; SIMD128:         .functype pairwise_and_v4i32 (v128) -> (i32)
172d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
173d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
174d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push5=, $0, $pop0
175d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
176d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
177d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push2=, $pop4, $pop1
178d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
179d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
180d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %arg)
181d28ed29dSSam Parker  ret i32 %res
182d28ed29dSSam Parker}
183d28ed29dSSam Parker
184d28ed29dSSam Parkerdefine i16 @pairwise_and_v8i16(<8 x i16> %arg) {
185d28ed29dSSam Parker; SIMD128-LABEL: pairwise_and_v8i16:
186d28ed29dSSam Parker; SIMD128:         .functype pairwise_and_v8i16 (v128) -> (i32)
187d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
188d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
189d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push8=, $0, $pop0
190d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
191d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
192d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push6=, $pop7, $pop1
193d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
194d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
195d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push3=, $pop5, $pop2
196d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
197d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
198d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %arg)
199d28ed29dSSam Parker  ret i16 %res
200d28ed29dSSam Parker}
201d28ed29dSSam Parker
202d28ed29dSSam Parkerdefine i8 @pairwise_and_v16i8(<16 x i8> %arg) {
203d28ed29dSSam Parker; SIMD128-LABEL: pairwise_and_v16i8:
204d28ed29dSSam Parker; SIMD128:         .functype pairwise_and_v16i8 (v128) -> (i32)
205d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
206d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
207d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push11=, $0, $pop0
208d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
209d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
210d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push9=, $pop10, $pop1
211d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
212d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
213d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push7=, $pop8, $pop2
214d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
215d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
216d28ed29dSSam Parker; SIMD128-NEXT:    v128.and $push4=, $pop6, $pop3
217d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
218d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
219d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %arg)
220d28ed29dSSam Parker  ret i8 %res
221d28ed29dSSam Parker}
222d28ed29dSSam Parker
223d28ed29dSSam Parkerdefine i64 @pairwise_or_v2i64(<2 x i64> %arg) {
224d28ed29dSSam Parker; SIMD128-LABEL: pairwise_or_v2i64:
225d28ed29dSSam Parker; SIMD128:         .functype pairwise_or_v2i64 (v128) -> (i64)
226d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
227d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
228d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push1=, $0, $pop0
229d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
230d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
231d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %arg)
232d28ed29dSSam Parker  ret i64 %res
233d28ed29dSSam Parker}
234d28ed29dSSam Parker
235d28ed29dSSam Parkerdefine i32 @pairwise_or_v4i32(<4 x i32> %arg) {
236d28ed29dSSam Parker; SIMD128-LABEL: pairwise_or_v4i32:
237d28ed29dSSam Parker; SIMD128:         .functype pairwise_or_v4i32 (v128) -> (i32)
238d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
239d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
240d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push5=, $0, $pop0
241d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
242d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
243d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push2=, $pop4, $pop1
244d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
245d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
246d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %arg)
247d28ed29dSSam Parker  ret i32 %res
248d28ed29dSSam Parker}
249d28ed29dSSam Parker
250d28ed29dSSam Parkerdefine i16 @pairwise_or_v8i16(<8 x i16> %arg) {
251d28ed29dSSam Parker; SIMD128-LABEL: pairwise_or_v8i16:
252d28ed29dSSam Parker; SIMD128:         .functype pairwise_or_v8i16 (v128) -> (i32)
253d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
254d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
255d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push8=, $0, $pop0
256d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
257d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
258d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push6=, $pop7, $pop1
259d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
260d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
261d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push3=, $pop5, $pop2
262d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
263d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
264d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %arg)
265d28ed29dSSam Parker  ret i16 %res
266d28ed29dSSam Parker}
267d28ed29dSSam Parker
268d28ed29dSSam Parkerdefine i8 @pairwise_or_v16i8(<16 x i8> %arg) {
269d28ed29dSSam Parker; SIMD128-LABEL: pairwise_or_v16i8:
270d28ed29dSSam Parker; SIMD128:         .functype pairwise_or_v16i8 (v128) -> (i32)
271d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
272d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
273d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push11=, $0, $pop0
274d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
275d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
276d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push9=, $pop10, $pop1
277d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
278d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
279d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push7=, $pop8, $pop2
280d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
281d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
282d28ed29dSSam Parker; SIMD128-NEXT:    v128.or $push4=, $pop6, $pop3
283d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
284d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
285d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %arg)
286d28ed29dSSam Parker  ret i8 %res
287d28ed29dSSam Parker}
288d28ed29dSSam Parker
289d28ed29dSSam Parkerdefine i64 @pairwise_xor_v2i64(<2 x i64> %arg) {
290d28ed29dSSam Parker; SIMD128-LABEL: pairwise_xor_v2i64:
291d28ed29dSSam Parker; SIMD128:         .functype pairwise_xor_v2i64 (v128) -> (i64)
292d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
293d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
294d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push1=, $0, $pop0
295d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
296d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
297d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %arg)
298d28ed29dSSam Parker  ret i64 %res
299d28ed29dSSam Parker}
300d28ed29dSSam Parker
301d28ed29dSSam Parkerdefine i32 @pairwise_xor_v4i32(<4 x i32> %arg) {
302d28ed29dSSam Parker; SIMD128-LABEL: pairwise_xor_v4i32:
303d28ed29dSSam Parker; SIMD128:         .functype pairwise_xor_v4i32 (v128) -> (i32)
304d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
305d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
306d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push5=, $0, $pop0
307d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
308d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
309d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push2=, $pop4, $pop1
310d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
311d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
312d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %arg)
313d28ed29dSSam Parker  ret i32 %res
314d28ed29dSSam Parker}
315d28ed29dSSam Parker
316d28ed29dSSam Parkerdefine i16 @pairwise_xor_v8i16(<8 x i16> %arg) {
317d28ed29dSSam Parker; SIMD128-LABEL: pairwise_xor_v8i16:
318d28ed29dSSam Parker; SIMD128:         .functype pairwise_xor_v8i16 (v128) -> (i32)
319d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
320d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
321d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push8=, $0, $pop0
322d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
323d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
324d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push6=, $pop7, $pop1
325d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
326d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
327d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push3=, $pop5, $pop2
328d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
329d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
330d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %arg)
331d28ed29dSSam Parker  ret i16 %res
332d28ed29dSSam Parker}
333d28ed29dSSam Parker
334d28ed29dSSam Parkerdefine i8 @pairwise_xor_v16i8(<16 x i8> %arg) {
335d28ed29dSSam Parker; SIMD128-LABEL: pairwise_xor_v16i8:
336d28ed29dSSam Parker; SIMD128:         .functype pairwise_xor_v16i8 (v128) -> (i32)
337d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
338d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
339d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push11=, $0, $pop0
340d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
341d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
342d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push9=, $pop10, $pop1
343d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
344d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
345d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push7=, $pop8, $pop2
346d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
347d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
348d28ed29dSSam Parker; SIMD128-NEXT:    v128.xor $push4=, $pop6, $pop3
349d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
350d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
351d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %arg)
352d28ed29dSSam Parker  ret i8 %res
353d28ed29dSSam Parker}
354d28ed29dSSam Parker
355d28ed29dSSam Parkerdefine i64 @pairwise_smax_v2i64(<2 x i64> %arg) {
356d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smax_v2i64:
357d28ed29dSSam Parker; SIMD128:         .functype pairwise_smax_v2i64 (v128) -> (i64)
358d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
359d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push4=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
360d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push3=, $1=, $pop4
361d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.gt_s $push0=, $0, $1
362d28ed29dSSam Parker; SIMD128-NEXT:    v128.bitselect $push1=, $0, $pop3, $pop0
363d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
364d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
365d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.smax.v2i64(<2 x i64> %arg)
366d28ed29dSSam Parker  ret i64 %res
367d28ed29dSSam Parker}
368d28ed29dSSam Parker
369d28ed29dSSam Parkerdefine i32 @pairwise_smax_v4i32(<4 x i32> %arg) {
370d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smax_v4i32:
371d28ed29dSSam Parker; SIMD128:         .functype pairwise_smax_v4i32 (v128) -> (i32)
372d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
373d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
374d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.max_s $push5=, $0, $pop0
375d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
376d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
377d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.max_s $push2=, $pop4, $pop1
378d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
379d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
380d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %arg)
381d28ed29dSSam Parker  ret i32 %res
382d28ed29dSSam Parker}
383d28ed29dSSam Parker
384d28ed29dSSam Parkerdefine i16 @pairwise_smax_v8i16(<8 x i16> %arg) {
385d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smax_v8i16:
386d28ed29dSSam Parker; SIMD128:         .functype pairwise_smax_v8i16 (v128) -> (i32)
387d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
388d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
389d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_s $push8=, $0, $pop0
390d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
391d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
392d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_s $push6=, $pop7, $pop1
393d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
394d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
395d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_s $push3=, $pop5, $pop2
396d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
397d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
398d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %arg)
399d28ed29dSSam Parker  ret i16 %res
400d28ed29dSSam Parker}
401d28ed29dSSam Parker
402d28ed29dSSam Parkerdefine i8 @pairwise_smax_v16i8(<16 x i8> %arg) {
403d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smax_v16i8:
404d28ed29dSSam Parker; SIMD128:         .functype pairwise_smax_v16i8 (v128) -> (i32)
405d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
406d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
407d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_s $push11=, $0, $pop0
408d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
409d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
410d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_s $push9=, $pop10, $pop1
411d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
412d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
413d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_s $push7=, $pop8, $pop2
414d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
415d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
416d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_s $push4=, $pop6, $pop3
417d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
418d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
419d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.smax.v16i8(<16 x i8> %arg)
420d28ed29dSSam Parker  ret i8 %res
421d28ed29dSSam Parker}
422d28ed29dSSam Parker
423d28ed29dSSam Parkerdefine i64 @pairwise_smin_v2i64(<2 x i64> %arg) {
424d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smin_v2i64:
425d28ed29dSSam Parker; SIMD128:         .functype pairwise_smin_v2i64 (v128) -> (i64)
426d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
427d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push4=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
428d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push3=, $1=, $pop4
429d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.lt_s $push0=, $0, $1
430d28ed29dSSam Parker; SIMD128-NEXT:    v128.bitselect $push1=, $0, $pop3, $pop0
431d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push2=, $pop1, 0
432d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
433d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.smin.v2i64(<2 x i64> %arg)
434d28ed29dSSam Parker  ret i64 %res
435d28ed29dSSam Parker}
436d28ed29dSSam Parker
437d28ed29dSSam Parkerdefine i32 @pairwise_smin_v4i32(<4 x i32> %arg) {
438d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smin_v4i32:
439d28ed29dSSam Parker; SIMD128:         .functype pairwise_smin_v4i32 (v128) -> (i32)
440d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
441d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
442d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.min_s $push5=, $0, $pop0
443d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
444d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
445d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.min_s $push2=, $pop4, $pop1
446d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
447d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
448d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %arg)
449d28ed29dSSam Parker  ret i32 %res
450d28ed29dSSam Parker}
451d28ed29dSSam Parker
452d28ed29dSSam Parkerdefine i16 @pairwise_smin_v8i16(<8 x i16> %arg) {
453d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smin_v8i16:
454d28ed29dSSam Parker; SIMD128:         .functype pairwise_smin_v8i16 (v128) -> (i32)
455d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
456d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
457d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_s $push8=, $0, $pop0
458d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
459d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
460d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_s $push6=, $pop7, $pop1
461d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
462d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
463d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_s $push3=, $pop5, $pop2
464d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
465d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
466d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> %arg)
467d28ed29dSSam Parker  ret i16 %res
468d28ed29dSSam Parker}
469d28ed29dSSam Parker
470d28ed29dSSam Parkerdefine i8 @pairwise_smin_v16i8(<16 x i8> %arg) {
471d28ed29dSSam Parker; SIMD128-LABEL: pairwise_smin_v16i8:
472d28ed29dSSam Parker; SIMD128:         .functype pairwise_smin_v16i8 (v128) -> (i32)
473d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
474d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
475d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_s $push11=, $0, $pop0
476d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
477d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
478d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_s $push9=, $pop10, $pop1
479d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
480d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
481d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_s $push7=, $pop8, $pop2
482d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
483d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
484d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_s $push4=, $pop6, $pop3
485d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
486d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
487d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.smin.v16i8(<16 x i8> %arg)
488d28ed29dSSam Parker  ret i8 %res
489d28ed29dSSam Parker}
490d28ed29dSSam Parker
491d28ed29dSSam Parkerdefine i64 @pairwise_umax_v2i64(<2 x i64> %arg) {
492d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umax_v2i64:
493d28ed29dSSam Parker; SIMD128:         .functype pairwise_umax_v2i64 (v128) -> (i64)
494d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
495d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push10=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
496d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push9=, $1=, $pop10
497d28ed29dSSam Parker; SIMD128-NEXT:    i64.const $push4=, -1
498d28ed29dSSam Parker; SIMD128-NEXT:    i64.const $push3=, 0
499d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push1=, $0, 0
500d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push0=, $1, 0
501d28ed29dSSam Parker; SIMD128-NEXT:    i64.gt_u $push2=, $pop1, $pop0
502d28ed29dSSam Parker; SIMD128-NEXT:    i64.select $push5=, $pop4, $pop3, $pop2
503d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.replace_lane $push6=, $0, 0, $pop5
504d28ed29dSSam Parker; SIMD128-NEXT:    v128.bitselect $push7=, $0, $pop9, $pop6
505d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push8=, $pop7, 0
506d28ed29dSSam Parker; SIMD128-NEXT:    return $pop8
507d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %arg)
508d28ed29dSSam Parker  ret i64 %res
509d28ed29dSSam Parker}
510d28ed29dSSam Parker
511d28ed29dSSam Parkerdefine i32 @pairwise_umax_v4i32(<4 x i32> %arg) {
512d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umax_v4i32:
513d28ed29dSSam Parker; SIMD128:         .functype pairwise_umax_v4i32 (v128) -> (i32)
514d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
515d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
516d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.max_u $push5=, $0, $pop0
517d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
518d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
519d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.max_u $push2=, $pop4, $pop1
520d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
521d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
522d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %arg)
523d28ed29dSSam Parker  ret i32 %res
524d28ed29dSSam Parker}
525d28ed29dSSam Parker
526d28ed29dSSam Parkerdefine i16 @pairwise_umax_v8i16(<8 x i16> %arg) {
527d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umax_v8i16:
528d28ed29dSSam Parker; SIMD128:         .functype pairwise_umax_v8i16 (v128) -> (i32)
529d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
530d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
531d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_u $push8=, $0, $pop0
532d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
533d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
534d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_u $push6=, $pop7, $pop1
535d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
536d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
537d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.max_u $push3=, $pop5, $pop2
538d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
539d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
540d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> %arg)
541d28ed29dSSam Parker  ret i16 %res
542d28ed29dSSam Parker}
543d28ed29dSSam Parker
544d28ed29dSSam Parkerdefine i8 @pairwise_umax_v16i8(<16 x i8> %arg) {
545d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umax_v16i8:
546d28ed29dSSam Parker; SIMD128:         .functype pairwise_umax_v16i8 (v128) -> (i32)
547d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
548d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
549d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_u $push11=, $0, $pop0
550d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
551d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
552d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_u $push9=, $pop10, $pop1
553d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
554d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
555d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_u $push7=, $pop8, $pop2
556d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
557d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
558d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.max_u $push4=, $pop6, $pop3
559d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
560d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
561d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %arg)
562d28ed29dSSam Parker  ret i8 %res
563d28ed29dSSam Parker}
564d28ed29dSSam Parker
565d28ed29dSSam Parkerdefine i64 @pairwise_umin_v2i64(<2 x i64> %arg) {
566d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umin_v2i64:
567d28ed29dSSam Parker; SIMD128:         .functype pairwise_umin_v2i64 (v128) -> (i64)
568d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
569d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push10=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
570d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push9=, $1=, $pop10
571d28ed29dSSam Parker; SIMD128-NEXT:    i64.const $push4=, -1
572d28ed29dSSam Parker; SIMD128-NEXT:    i64.const $push3=, 0
573d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push1=, $0, 0
574d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push0=, $1, 0
575d28ed29dSSam Parker; SIMD128-NEXT:    i64.lt_u $push2=, $pop1, $pop0
576d28ed29dSSam Parker; SIMD128-NEXT:    i64.select $push5=, $pop4, $pop3, $pop2
577d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.replace_lane $push6=, $0, 0, $pop5
578d28ed29dSSam Parker; SIMD128-NEXT:    v128.bitselect $push7=, $0, $pop9, $pop6
579d28ed29dSSam Parker; SIMD128-NEXT:    i64x2.extract_lane $push8=, $pop7, 0
580d28ed29dSSam Parker; SIMD128-NEXT:    return $pop8
581d28ed29dSSam Parker  %res = tail call i64 @llvm.vector.reduce.umin.v2i64(<2 x i64> %arg)
582d28ed29dSSam Parker  ret i64 %res
583d28ed29dSSam Parker}
584d28ed29dSSam Parker
585d28ed29dSSam Parkerdefine i32 @pairwise_umin_v4i32(<4 x i32> %arg) {
586d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umin_v4i32:
587d28ed29dSSam Parker; SIMD128:         .functype pairwise_umin_v4i32 (v128) -> (i32)
588d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
589d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
590d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.min_u $push5=, $0, $pop0
591d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
592d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
593d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.min_u $push2=, $pop4, $pop1
594d28ed29dSSam Parker; SIMD128-NEXT:    i32x4.extract_lane $push3=, $pop2, 0
595d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
596d28ed29dSSam Parker  %res = tail call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %arg)
597d28ed29dSSam Parker  ret i32 %res
598d28ed29dSSam Parker}
599d28ed29dSSam Parker
600d28ed29dSSam Parkerdefine i16 @pairwise_umin_v8i16(<8 x i16> %arg) {
601d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umin_v8i16:
602d28ed29dSSam Parker; SIMD128:         .functype pairwise_umin_v8i16 (v128) -> (i32)
603d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
604d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 0, 1, 0, 1, 0, 1
605d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_u $push8=, $0, $pop0
606d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push7=, $0=, $pop8
607d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
608d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_u $push6=, $pop7, $pop1
609d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push5=, $0=, $pop6
610d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
611d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.min_u $push3=, $pop5, $pop2
612d28ed29dSSam Parker; SIMD128-NEXT:    i16x8.extract_lane_u $push4=, $pop3, 0
613d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
614d28ed29dSSam Parker  %res = tail call i16 @llvm.vector.reduce.umin.v8i16(<8 x i16> %arg)
615d28ed29dSSam Parker  ret i16 %res
616d28ed29dSSam Parker}
617d28ed29dSSam Parker
618d28ed29dSSam Parkerdefine i8 @pairwise_umin_v16i8(<16 x i8> %arg) {
619d28ed29dSSam Parker; SIMD128-LABEL: pairwise_umin_v16i8:
620d28ed29dSSam Parker; SIMD128:         .functype pairwise_umin_v16i8 (v128) -> (i32)
621d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
622d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0
623d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_u $push11=, $0, $pop0
624d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push10=, $0=, $pop11
625d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
626d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_u $push9=, $pop10, $pop1
627d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push8=, $0=, $pop9
628d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push2=, $0, $0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
629d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_u $push7=, $pop8, $pop2
630d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
631d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push3=, $0, $0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
632d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.min_u $push4=, $pop6, $pop3
633d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.extract_lane_u $push5=, $pop4, 0
634d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
635d28ed29dSSam Parker  %res = tail call i8 @llvm.vector.reduce.umin.v16i8(<16 x i8> %arg)
636d28ed29dSSam Parker  ret i8 %res
637d28ed29dSSam Parker}
638d28ed29dSSam Parker
639d28ed29dSSam Parkerdefine double @pairwise_add_v2f64(<2 x double> %arg) {
640d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v2f64:
641d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v2f64 (v128) -> (f64)
642d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
643d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
644d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
645d28ed29dSSam Parker; SIMD128-NEXT:    f64.add $push2=, $pop1, $pop0
646d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
647d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fadd.v2f64(double -0.0, <2 x double> %arg)
648d28ed29dSSam Parker  ret double%res
649d28ed29dSSam Parker}
650d28ed29dSSam Parker
651d28ed29dSSam Parkerdefine double @pairwise_add_v2f64_fast(<2 x double> %arg) {
652d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v2f64_fast:
653d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v2f64_fast (v128) -> (f64)
654d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
655d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
656d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.add $push1=, $0, $pop0
657d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push2=, $pop1, 0
658d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
659d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fadd.v2f64(double -0.0, <2 x double> %arg)
660d28ed29dSSam Parker  ret double%res
661d28ed29dSSam Parker}
662d28ed29dSSam Parker
663d28ed29dSSam Parkerdefine float @pairwise_add_v4f32(<4 x float> %arg) {
664d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v4f32:
665d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v4f32 (v128) -> (f32)
666d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
667d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
668d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
669d28ed29dSSam Parker; SIMD128-NEXT:    f32.add $push2=, $pop1, $pop0
670d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
671d28ed29dSSam Parker; SIMD128-NEXT:    f32.add $push4=, $pop2, $pop3
672d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
673d28ed29dSSam Parker; SIMD128-NEXT:    f32.add $push6=, $pop4, $pop5
674d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
675d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fadd.v4f32(float -0.0, <4 x float> %arg)
676d28ed29dSSam Parker  ret float %res
677d28ed29dSSam Parker}
678d28ed29dSSam Parker
679d28ed29dSSam Parkerdefine float @pairwise_add_v4f32_fast(<4 x float> %arg) {
680d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v4f32_fast:
681d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v4f32_fast (v128) -> (f32)
682d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
683d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 0, 1, 2, 3
684d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.add $push5=, $0, $pop0
685d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
686d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
687d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.add $push2=, $pop4, $pop1
688d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $pop2, 0
689d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
690d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fadd.v4f32(float -0.0, <4 x float> %arg)
691d28ed29dSSam Parker  ret float %res
692d28ed29dSSam Parker}
693d28ed29dSSam Parker
694d28ed29dSSam Parkerdefine float @pairwise_add_v4f32_reassoc(<4 x float> %arg) {
695d28ed29dSSam Parker; SIMD128-LABEL: pairwise_add_v4f32_reassoc:
696d28ed29dSSam Parker; SIMD128:         .functype pairwise_add_v4f32_reassoc (v128) -> (f32)
697d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
698d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 0, 1, 2, 3
699d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.add $push5=, $0, $pop0
700d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
701d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
702d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.add $push2=, $pop4, $pop1
703d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $pop2, 0
704d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
705d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fadd.v4f32(float -0.0, <4 x float> %arg)
706d28ed29dSSam Parker  ret float %res
707d28ed29dSSam Parker}
708d28ed29dSSam Parker
709d28ed29dSSam Parkerdefine double @pairwise_mul_v2f64(<2 x double> %arg) {
710d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v2f64:
711d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v2f64 (v128) -> (f64)
712d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
713d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 0
714d28ed29dSSam Parker; SIMD128-NEXT:    f64.const $push1=, -0x0p0
715d28ed29dSSam Parker; SIMD128-NEXT:    f64.mul $push2=, $pop0, $pop1
716d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push3=, $0, 1
717d28ed29dSSam Parker; SIMD128-NEXT:    f64.mul $push4=, $pop2, $pop3
718d28ed29dSSam Parker; SIMD128-NEXT:    return $pop4
719d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fmul.v2f64(double -0.0, <2 x double> %arg)
720d28ed29dSSam Parker  ret double%res
721d28ed29dSSam Parker}
722d28ed29dSSam Parker
723d28ed29dSSam Parkerdefine double @pairwise_mul_v2f64_fast(<2 x double> %arg) {
724d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v2f64_fast:
725d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v2f64_fast (v128) -> (f64)
726d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
727d28ed29dSSam Parker; SIMD128-NEXT:    f64.const $push0=, 0x0p0
728d28ed29dSSam Parker; SIMD128-NEXT:    return $pop0
729d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fmul.v2f64(double -0.0, <2 x double> %arg)
730d28ed29dSSam Parker  ret double%res
731d28ed29dSSam Parker}
732d28ed29dSSam Parker
733d28ed29dSSam Parkerdefine float @pairwise_mul_v4f32(<4 x float> %arg) {
734d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v4f32:
735d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v4f32 (v128) -> (f32)
736d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
737d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 0
738d28ed29dSSam Parker; SIMD128-NEXT:    f32.const $push1=, -0x0p0
739d28ed29dSSam Parker; SIMD128-NEXT:    f32.mul $push2=, $pop0, $pop1
740d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 1
741d28ed29dSSam Parker; SIMD128-NEXT:    f32.mul $push4=, $pop2, $pop3
742d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 2
743d28ed29dSSam Parker; SIMD128-NEXT:    f32.mul $push6=, $pop4, $pop5
744d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push7=, $0, 3
745d28ed29dSSam Parker; SIMD128-NEXT:    f32.mul $push8=, $pop6, $pop7
746d28ed29dSSam Parker; SIMD128-NEXT:    return $pop8
747d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fmul.v4f32(float -0.0, <4 x float> %arg)
748d28ed29dSSam Parker  ret float %res
749d28ed29dSSam Parker}
750d28ed29dSSam Parker
751d28ed29dSSam Parkerdefine float @pairwise_mul_v4f32_fast(<4 x float> %arg) {
752d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v4f32_fast:
753d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v4f32_fast (v128) -> (f32)
754d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
755d28ed29dSSam Parker; SIMD128-NEXT:    f32.const $push0=, 0x0p0
756d28ed29dSSam Parker; SIMD128-NEXT:    return $pop0
757d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fmul.v4f32(float -0.0, <4 x float> %arg)
758d28ed29dSSam Parker  ret float %res
759d28ed29dSSam Parker}
760d28ed29dSSam Parker
761d28ed29dSSam Parkerdefine float @pairwise_mul_v4f32_reassoc(<4 x float> %arg) {
762d28ed29dSSam Parker; SIMD128-LABEL: pairwise_mul_v4f32_reassoc:
763d28ed29dSSam Parker; SIMD128:         .functype pairwise_mul_v4f32_reassoc (v128) -> (f32)
764d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
765d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
766d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.mul $push7=, $0, $pop0
767d28ed29dSSam Parker; SIMD128-NEXT:    local.tee $push6=, $0=, $pop7
768d28ed29dSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
769d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.mul $push2=, $pop6, $pop1
770d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $pop2, 0
771d28ed29dSSam Parker; SIMD128-NEXT:    f32.const $push4=, -0x0p0
772d28ed29dSSam Parker; SIMD128-NEXT:    f32.mul $push5=, $pop3, $pop4
773d28ed29dSSam Parker; SIMD128-NEXT:    return $pop5
774d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fmul.v4f32(float -0.0, <4 x float> %arg)
775d28ed29dSSam Parker  ret float %res
776d28ed29dSSam Parker}
777d28ed29dSSam Parker
778d28ed29dSSam Parkerdefine double @pairwise_max_v2f64(<2 x double> %arg) {
779d28ed29dSSam Parker; SIMD128-LABEL: pairwise_max_v2f64:
780d28ed29dSSam Parker; SIMD128:         .functype pairwise_max_v2f64 (v128) -> (f64)
781d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
782d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
783d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
784d28ed29dSSam Parker; SIMD128-NEXT:    call $push2=, fmax, $pop1, $pop0
785d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
786d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %arg)
787d28ed29dSSam Parker  ret double%res
788d28ed29dSSam Parker}
789d28ed29dSSam Parker
790d28ed29dSSam Parkerdefine double @pairwise_max_v2f64_fast(<2 x double> %arg) {
791d28ed29dSSam Parker; SIMD128-LABEL: pairwise_max_v2f64_fast:
792d28ed29dSSam Parker; SIMD128:         .functype pairwise_max_v2f64_fast (v128) -> (f64)
793d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
794*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
795*a3de21caSSam Parker; SIMD128-NEXT:    f64x2.pmax $push1=, $0, $pop0
796d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push2=, $pop1, 0
797d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
798d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fmax.v2f64(<2 x double> %arg)
799d28ed29dSSam Parker  ret double%res
800d28ed29dSSam Parker}
801d28ed29dSSam Parker
802d28ed29dSSam Parkerdefine float @pairwise_max_v4f32(<4 x float> %arg) {
803d28ed29dSSam Parker; SIMD128-LABEL: pairwise_max_v4f32:
804d28ed29dSSam Parker; SIMD128:         .functype pairwise_max_v4f32 (v128) -> (f32)
805d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
806d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 0
807d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push2=, $0, 1
808d28ed29dSSam Parker; SIMD128-NEXT:    call $push4=, fmaxf, $pop3, $pop2
809d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 2
810d28ed29dSSam Parker; SIMD128-NEXT:    call $push5=, fmaxf, $pop4, $pop1
811d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 3
812d28ed29dSSam Parker; SIMD128-NEXT:    call $push6=, fmaxf, $pop5, $pop0
813d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
814d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %arg)
815d28ed29dSSam Parker  ret float %res
816d28ed29dSSam Parker}
817d28ed29dSSam Parker
818d28ed29dSSam Parkerdefine float @pairwise_max_v4f32_fast(<4 x float> %arg) {
819d28ed29dSSam Parker; SIMD128-LABEL: pairwise_max_v4f32_fast:
820d28ed29dSSam Parker; SIMD128:         .functype pairwise_max_v4f32_fast (v128) -> (f32)
821d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
822*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
823*a3de21caSSam Parker; SIMD128-NEXT:    f32x4.pmax $push5=, $0, $pop0
824*a3de21caSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
825*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
826*a3de21caSSam Parker; SIMD128-NEXT:    f32x4.pmax $push2=, $pop4, $pop1
827d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $pop2, 0
828d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
829d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fmax.v4f32(<4 x float> %arg)
830d28ed29dSSam Parker  ret float %res
831d28ed29dSSam Parker}
832d28ed29dSSam Parker
833d28ed29dSSam Parkerdefine float @pairwise_max_v4f32_reassoc(<4 x float> %arg) {
834d28ed29dSSam Parker; SIMD128-LABEL: pairwise_max_v4f32_reassoc:
835d28ed29dSSam Parker; SIMD128:         .functype pairwise_max_v4f32_reassoc (v128) -> (f32)
836d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
837d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 0
838d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push2=, $0, 1
839d28ed29dSSam Parker; SIMD128-NEXT:    call $push4=, fmaxf, $pop3, $pop2
840d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 2
841d28ed29dSSam Parker; SIMD128-NEXT:    call $push5=, fmaxf, $pop4, $pop1
842d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 3
843d28ed29dSSam Parker; SIMD128-NEXT:    call $push6=, fmaxf, $pop5, $pop0
844d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
845d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fmax.v4f32(<4 x float> %arg)
846d28ed29dSSam Parker  ret float %res
847d28ed29dSSam Parker}
848d28ed29dSSam Parker
849d28ed29dSSam Parkerdefine double @pairwise_min_v2f64(<2 x double> %arg) {
850d28ed29dSSam Parker; SIMD128-LABEL: pairwise_min_v2f64:
851d28ed29dSSam Parker; SIMD128:         .functype pairwise_min_v2f64 (v128) -> (f64)
852d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
853d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
854d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
855d28ed29dSSam Parker; SIMD128-NEXT:    call $push2=, fmin, $pop1, $pop0
856d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
857d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fmin.v2f64(<2 x double> %arg)
858d28ed29dSSam Parker  ret double%res
859d28ed29dSSam Parker}
860d28ed29dSSam Parker
861d28ed29dSSam Parkerdefine double @pairwise_min_v2f64_fast(<2 x double> %arg) {
862d28ed29dSSam Parker; SIMD128-LABEL: pairwise_min_v2f64_fast:
863d28ed29dSSam Parker; SIMD128:         .functype pairwise_min_v2f64_fast (v128) -> (f64)
864d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
865*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7
866*a3de21caSSam Parker; SIMD128-NEXT:    f64x2.pmin $push1=, $0, $pop0
867d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push2=, $pop1, 0
868d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
869d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fmin.v2f64(<2 x double> %arg)
870d28ed29dSSam Parker  ret double%res
871d28ed29dSSam Parker}
872d28ed29dSSam Parker
873d28ed29dSSam Parkerdefine float @pairwise_min_v4f32(<4 x float> %arg) {
874d28ed29dSSam Parker; SIMD128-LABEL: pairwise_min_v4f32:
875d28ed29dSSam Parker; SIMD128:         .functype pairwise_min_v4f32 (v128) -> (f32)
876d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
877d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 0
878d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push2=, $0, 1
879d28ed29dSSam Parker; SIMD128-NEXT:    call $push4=, fminf, $pop3, $pop2
880d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 2
881d28ed29dSSam Parker; SIMD128-NEXT:    call $push5=, fminf, $pop4, $pop1
882d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 3
883d28ed29dSSam Parker; SIMD128-NEXT:    call $push6=, fminf, $pop5, $pop0
884d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
885d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %arg)
886d28ed29dSSam Parker  ret float %res
887d28ed29dSSam Parker}
888d28ed29dSSam Parker
889d28ed29dSSam Parkerdefine float @pairwise_min_v4f32_fast(<4 x float> %arg) {
890d28ed29dSSam Parker; SIMD128-LABEL: pairwise_min_v4f32_fast:
891d28ed29dSSam Parker; SIMD128:         .functype pairwise_min_v4f32_fast (v128) -> (f32)
892d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
893*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push0=, $0, $0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 0, 1, 2, 3
894*a3de21caSSam Parker; SIMD128-NEXT:    f32x4.pmin $push5=, $0, $pop0
895*a3de21caSSam Parker; SIMD128-NEXT:    local.tee $push4=, $0=, $pop5
896*a3de21caSSam Parker; SIMD128-NEXT:    i8x16.shuffle $push1=, $0, $0, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3
897*a3de21caSSam Parker; SIMD128-NEXT:    f32x4.pmin $push2=, $pop4, $pop1
898d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $pop2, 0
899d28ed29dSSam Parker; SIMD128-NEXT:    return $pop3
900d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fmin.v4f32(<4 x float> %arg)
901d28ed29dSSam Parker  ret float %res
902d28ed29dSSam Parker}
903d28ed29dSSam Parker
904d28ed29dSSam Parkerdefine float @pairwise_min_v4f32_reassoc(<4 x float> %arg) {
905d28ed29dSSam Parker; SIMD128-LABEL: pairwise_min_v4f32_reassoc:
906d28ed29dSSam Parker; SIMD128:         .functype pairwise_min_v4f32_reassoc (v128) -> (f32)
907d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
908d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 0
909d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push2=, $0, 1
910d28ed29dSSam Parker; SIMD128-NEXT:    call $push4=, fminf, $pop3, $pop2
911d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 2
912d28ed29dSSam Parker; SIMD128-NEXT:    call $push5=, fminf, $pop4, $pop1
913d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 3
914d28ed29dSSam Parker; SIMD128-NEXT:    call $push6=, fminf, $pop5, $pop0
915d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
916d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fmin.v4f32(<4 x float> %arg)
917d28ed29dSSam Parker  ret float %res
918d28ed29dSSam Parker}
919d28ed29dSSam Parker
920d28ed29dSSam Parkerdefine double @pairwise_maximum_v2f64(<2 x double> %arg) {
921d28ed29dSSam Parker; SIMD128-LABEL: pairwise_maximum_v2f64:
922d28ed29dSSam Parker; SIMD128:         .functype pairwise_maximum_v2f64 (v128) -> (f64)
923d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
924d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
925d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
926d28ed29dSSam Parker; SIMD128-NEXT:    f64.max $push2=, $pop1, $pop0
927d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
928d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %arg)
929d28ed29dSSam Parker  ret double%res
930d28ed29dSSam Parker}
931d28ed29dSSam Parker
932d28ed29dSSam Parkerdefine double @pairwise_maximum_v2f64_fast(<2 x double> %arg) {
933d28ed29dSSam Parker; SIMD128-LABEL: pairwise_maximum_v2f64_fast:
934d28ed29dSSam Parker; SIMD128:         .functype pairwise_maximum_v2f64_fast (v128) -> (f64)
935d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
936d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
937d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
938d28ed29dSSam Parker; SIMD128-NEXT:    f64.max $push2=, $pop1, $pop0
939d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
940d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %arg)
941d28ed29dSSam Parker  ret double%res
942d28ed29dSSam Parker}
943d28ed29dSSam Parker
944d28ed29dSSam Parkerdefine float @pairwise_maximum_v4f32(<4 x float> %arg) {
945d28ed29dSSam Parker; SIMD128-LABEL: pairwise_maximum_v4f32:
946d28ed29dSSam Parker; SIMD128:         .functype pairwise_maximum_v4f32 (v128) -> (f32)
947d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
948d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
949d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
950d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push2=, $pop1, $pop0
951d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
952d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push4=, $pop2, $pop3
953d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
954d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push6=, $pop4, $pop5
955d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
956d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %arg)
957d28ed29dSSam Parker  ret float %res
958d28ed29dSSam Parker}
959d28ed29dSSam Parker
960d28ed29dSSam Parkerdefine float @pairwise_maximum_v4f32_fast(<4 x float> %arg) {
961d28ed29dSSam Parker; SIMD128-LABEL: pairwise_maximum_v4f32_fast:
962d28ed29dSSam Parker; SIMD128:         .functype pairwise_maximum_v4f32_fast (v128) -> (f32)
963d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
964d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
965d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
966d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push2=, $pop1, $pop0
967d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
968d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push4=, $pop2, $pop3
969d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
970d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push6=, $pop4, $pop5
971d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
972d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %arg)
973d28ed29dSSam Parker  ret float %res
974d28ed29dSSam Parker}
975d28ed29dSSam Parker
976d28ed29dSSam Parkerdefine float @pairwise_maximum_v4f32_reassoc(<4 x float> %arg) {
977d28ed29dSSam Parker; SIMD128-LABEL: pairwise_maximum_v4f32_reassoc:
978d28ed29dSSam Parker; SIMD128:         .functype pairwise_maximum_v4f32_reassoc (v128) -> (f32)
979d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
980d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
981d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
982d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push2=, $pop1, $pop0
983d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
984d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push4=, $pop2, $pop3
985d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
986d28ed29dSSam Parker; SIMD128-NEXT:    f32.max $push6=, $pop4, $pop5
987d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
988d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %arg)
989d28ed29dSSam Parker  ret float %res
990d28ed29dSSam Parker}
991d28ed29dSSam Parker
992d28ed29dSSam Parkerdefine double @pairwise_minimum_v2f64(<2 x double> %arg) {
993d28ed29dSSam Parker; SIMD128-LABEL: pairwise_minimum_v2f64:
994d28ed29dSSam Parker; SIMD128:         .functype pairwise_minimum_v2f64 (v128) -> (f64)
995d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
996d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
997d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
998d28ed29dSSam Parker; SIMD128-NEXT:    f64.min $push2=, $pop1, $pop0
999d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
1000d28ed29dSSam Parker  %res = tail call double @llvm.vector.reduce.fminimum.v2f64(<2 x double> %arg)
1001d28ed29dSSam Parker  ret double%res
1002d28ed29dSSam Parker}
1003d28ed29dSSam Parker
1004d28ed29dSSam Parkerdefine double @pairwise_minimum_v2f64_fast(<2 x double> %arg) {
1005d28ed29dSSam Parker; SIMD128-LABEL: pairwise_minimum_v2f64_fast:
1006d28ed29dSSam Parker; SIMD128:         .functype pairwise_minimum_v2f64_fast (v128) -> (f64)
1007d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
1008d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push1=, $0, 0
1009d28ed29dSSam Parker; SIMD128-NEXT:    f64x2.extract_lane $push0=, $0, 1
1010d28ed29dSSam Parker; SIMD128-NEXT:    f64.min $push2=, $pop1, $pop0
1011d28ed29dSSam Parker; SIMD128-NEXT:    return $pop2
1012d28ed29dSSam Parker  %res = tail call fast double @llvm.vector.reduce.fminimum.v2f64(<2 x double> %arg)
1013d28ed29dSSam Parker  ret double%res
1014d28ed29dSSam Parker}
1015d28ed29dSSam Parker
1016d28ed29dSSam Parkerdefine float @pairwise_minimum_v4f32(<4 x float> %arg) {
1017d28ed29dSSam Parker; SIMD128-LABEL: pairwise_minimum_v4f32:
1018d28ed29dSSam Parker; SIMD128:         .functype pairwise_minimum_v4f32 (v128) -> (f32)
1019d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
1020d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
1021d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
1022d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push2=, $pop1, $pop0
1023d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
1024d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push4=, $pop2, $pop3
1025d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
1026d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push6=, $pop4, $pop5
1027d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
1028d28ed29dSSam Parker  %res = tail call float @llvm.vector.reduce.fminimum.v4f32(<4 x float> %arg)
1029d28ed29dSSam Parker  ret float %res
1030d28ed29dSSam Parker}
1031d28ed29dSSam Parker
1032d28ed29dSSam Parkerdefine float @pairwise_minimum_v4f32_fast(<4 x float> %arg) {
1033d28ed29dSSam Parker; SIMD128-LABEL: pairwise_minimum_v4f32_fast:
1034d28ed29dSSam Parker; SIMD128:         .functype pairwise_minimum_v4f32_fast (v128) -> (f32)
1035d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
1036d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
1037d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
1038d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push2=, $pop1, $pop0
1039d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
1040d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push4=, $pop2, $pop3
1041d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
1042d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push6=, $pop4, $pop5
1043d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
1044d28ed29dSSam Parker  %res = tail call fast float @llvm.vector.reduce.fminimum.v4f32(<4 x float> %arg)
1045d28ed29dSSam Parker  ret float %res
1046d28ed29dSSam Parker}
1047d28ed29dSSam Parker
1048d28ed29dSSam Parkerdefine float @pairwise_minimum_v4f32_reassoc(<4 x float> %arg) {
1049d28ed29dSSam Parker; SIMD128-LABEL: pairwise_minimum_v4f32_reassoc:
1050d28ed29dSSam Parker; SIMD128:         .functype pairwise_minimum_v4f32_reassoc (v128) -> (f32)
1051d28ed29dSSam Parker; SIMD128-NEXT:  # %bb.0:
1052d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push1=, $0, 0
1053d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push0=, $0, 1
1054d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push2=, $pop1, $pop0
1055d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push3=, $0, 2
1056d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push4=, $pop2, $pop3
1057d28ed29dSSam Parker; SIMD128-NEXT:    f32x4.extract_lane $push5=, $0, 3
1058d28ed29dSSam Parker; SIMD128-NEXT:    f32.min $push6=, $pop4, $pop5
1059d28ed29dSSam Parker; SIMD128-NEXT:    return $pop6
1060d28ed29dSSam Parker  %res = tail call reassoc float @llvm.vector.reduce.fminimum.v4f32(<4 x float> %arg)
1061d28ed29dSSam Parker  ret float %res
1062d28ed29dSSam Parker}
1063