[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-intrinsics-fp-reduce.ll
blob95de90078d3416f675264fb6a277ad58b948800d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s
5 ; FADDA
8 define half @fadda_f16(<vscale x 8 x i1> %pg, half %init, <vscale x 8 x half> %a) {
9 ; CHECK-LABEL: fadda_f16:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0
12 ; CHECK-NEXT:    fadda h0, p0, h0, z1.h
13 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
14 ; CHECK-NEXT:    ret
15   %res = call half @llvm.aarch64.sve.fadda.nxv8f16(<vscale x 8 x i1> %pg,
16                                                    half %init,
17                                                    <vscale x 8 x half> %a)
18   ret half %res
21 define float @fadda_f32(<vscale x 4 x i1> %pg, float %init, <vscale x 4 x float> %a) {
22 ; CHECK-LABEL: fadda_f32:
23 ; CHECK:       // %bb.0:
24 ; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0
25 ; CHECK-NEXT:    fadda s0, p0, s0, z1.s
26 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
27 ; CHECK-NEXT:    ret
28   %res = call float @llvm.aarch64.sve.fadda.nxv4f32(<vscale x 4 x i1> %pg,
29                                                     float %init,
30                                                     <vscale x 4 x float> %a)
31   ret float %res
34 define double @fadda_f64(<vscale x 2 x i1> %pg, double %init, <vscale x 2 x double> %a) {
35 ; CHECK-LABEL: fadda_f64:
36 ; CHECK:       // %bb.0:
37 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
38 ; CHECK-NEXT:    fadda d0, p0, d0, z1.d
39 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
40 ; CHECK-NEXT:    ret
41   %res = call double @llvm.aarch64.sve.fadda.nxv2f64(<vscale x 2 x i1> %pg,
42                                                      double %init,
43                                                      <vscale x 2 x double> %a)
44   ret double %res
48 ; FADDV
51 define half @faddv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) {
52 ; CHECK-LABEL: faddv_f16:
53 ; CHECK:       // %bb.0:
54 ; CHECK-NEXT:    faddv h0, p0, z0.h
55 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
56 ; CHECK-NEXT:    ret
57   %res = call half @llvm.aarch64.sve.faddv.nxv8f16(<vscale x 8 x i1> %pg,
58                                                    <vscale x 8 x half> %a)
59   ret half %res
62 define float @faddv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) {
63 ; CHECK-LABEL: faddv_f32:
64 ; CHECK:       // %bb.0:
65 ; CHECK-NEXT:    faddv s0, p0, z0.s
66 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
67 ; CHECK-NEXT:    ret
68   %res = call float @llvm.aarch64.sve.faddv.nxv4f32(<vscale x 4 x i1> %pg,
69                                                     <vscale x 4 x float> %a)
70   ret float %res
73 define double @faddv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) {
74 ; CHECK-LABEL: faddv_f64:
75 ; CHECK:       // %bb.0:
76 ; CHECK-NEXT:    faddv d0, p0, z0.d
77 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
78 ; CHECK-NEXT:    ret
79   %res = call double @llvm.aarch64.sve.faddv.nxv2f64(<vscale x 2 x i1> %pg,
80                                                      <vscale x 2 x double> %a)
81   ret double %res
85 ; FMAXNMV
88 define half @fmaxnmv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) {
89 ; CHECK-LABEL: fmaxnmv_f16:
90 ; CHECK:       // %bb.0:
91 ; CHECK-NEXT:    fmaxnmv h0, p0, z0.h
92 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
93 ; CHECK-NEXT:    ret
94   %res = call half @llvm.aarch64.sve.fmaxnmv.nxv8f16(<vscale x 8 x i1> %pg,
95                                                      <vscale x 8 x half> %a)
96   ret half %res
99 define float @fmaxnmv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) {
100 ; CHECK-LABEL: fmaxnmv_f32:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    fmaxnmv s0, p0, z0.s
103 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
104 ; CHECK-NEXT:    ret
105   %res = call float @llvm.aarch64.sve.fmaxnmv.nxv4f32(<vscale x 4 x i1> %pg,
106                                                       <vscale x 4 x float> %a)
107   ret float %res
110 define double @fmaxnmv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) {
111 ; CHECK-LABEL: fmaxnmv_f64:
112 ; CHECK:       // %bb.0:
113 ; CHECK-NEXT:    fmaxnmv d0, p0, z0.d
114 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
115 ; CHECK-NEXT:    ret
116   %res = call double @llvm.aarch64.sve.fmaxnmv.nxv2f64(<vscale x 2 x i1> %pg,
117                                                        <vscale x 2 x double> %a)
118   ret double %res
122 ; FMAXV
125 define half @fmaxv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) {
126 ; CHECK-LABEL: fmaxv_f16:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    fmaxv h0, p0, z0.h
129 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
130 ; CHECK-NEXT:    ret
131   %res = call half @llvm.aarch64.sve.fmaxv.nxv8f16(<vscale x 8 x i1> %pg,
132                                                    <vscale x 8 x half> %a)
133   ret half %res
136 define float @fmaxv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) {
137 ; CHECK-LABEL: fmaxv_f32:
138 ; CHECK:       // %bb.0:
139 ; CHECK-NEXT:    fmaxv s0, p0, z0.s
140 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
141 ; CHECK-NEXT:    ret
142   %res = call float @llvm.aarch64.sve.fmaxv.nxv4f32(<vscale x 4 x i1> %pg,
143                                                     <vscale x 4 x float> %a)
144   ret float %res
147 define double @fmaxv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) {
148 ; CHECK-LABEL: fmaxv_f64:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    fmaxv d0, p0, z0.d
151 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
152 ; CHECK-NEXT:    ret
153   %res = call double @llvm.aarch64.sve.fmaxv.nxv2f64(<vscale x 2 x i1> %pg,
154                                                      <vscale x 2 x double> %a)
155   ret double %res
159 ; FMINNMV
162 define half @fminnmv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) {
163 ; CHECK-LABEL: fminnmv_f16:
164 ; CHECK:       // %bb.0:
165 ; CHECK-NEXT:    fminnmv h0, p0, z0.h
166 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
167 ; CHECK-NEXT:    ret
168   %res = call half @llvm.aarch64.sve.fminnmv.nxv8f16(<vscale x 8 x i1> %pg,
169                                                      <vscale x 8 x half> %a)
170   ret half %res
173 define float @fminnmv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) {
174 ; CHECK-LABEL: fminnmv_f32:
175 ; CHECK:       // %bb.0:
176 ; CHECK-NEXT:    fminnmv s0, p0, z0.s
177 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
178 ; CHECK-NEXT:    ret
179   %res = call float @llvm.aarch64.sve.fminnmv.nxv4f32(<vscale x 4 x i1> %pg,
180                                                       <vscale x 4 x float> %a)
181   ret float %res
184 define double @fminnmv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) {
185 ; CHECK-LABEL: fminnmv_f64:
186 ; CHECK:       // %bb.0:
187 ; CHECK-NEXT:    fminnmv d0, p0, z0.d
188 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
189 ; CHECK-NEXT:    ret
190   %res = call double @llvm.aarch64.sve.fminnmv.nxv2f64(<vscale x 2 x i1> %pg,
191                                                        <vscale x 2 x double> %a)
192   ret double %res
196 ; FMINV
199 define half @fminv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) {
200 ; CHECK-LABEL: fminv_f16:
201 ; CHECK:       // %bb.0:
202 ; CHECK-NEXT:    fminv h0, p0, z0.h
203 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
204 ; CHECK-NEXT:    ret
205   %res = call half @llvm.aarch64.sve.fminv.nxv8f16(<vscale x 8 x i1> %pg,
206                                                    <vscale x 8 x half> %a)
207   ret half %res
210 define float @fminv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) {
211 ; CHECK-LABEL: fminv_f32:
212 ; CHECK:       // %bb.0:
213 ; CHECK-NEXT:    fminv s0, p0, z0.s
214 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
215 ; CHECK-NEXT:    ret
216   %res = call float @llvm.aarch64.sve.fminv.nxv4f32(<vscale x 4 x i1> %pg,
217                                                     <vscale x 4 x float> %a)
218   ret float %res
221 define double @fminv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) {
222 ; CHECK-LABEL: fminv_f64:
223 ; CHECK:       // %bb.0:
224 ; CHECK-NEXT:    fminv d0, p0, z0.d
225 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
226 ; CHECK-NEXT:    ret
227   %res = call double @llvm.aarch64.sve.fminv.nxv2f64(<vscale x 2 x i1> %pg,
228                                                      <vscale x 2 x double> %a)
229   ret double %res
232 declare half @llvm.aarch64.sve.fadda.nxv8f16(<vscale x 8 x i1>, half, <vscale x 8 x half>)
233 declare float @llvm.aarch64.sve.fadda.nxv4f32(<vscale x 4 x i1>, float, <vscale x 4 x float>)
234 declare double @llvm.aarch64.sve.fadda.nxv2f64(<vscale x 2 x i1>, double, <vscale x 2 x double>)
236 declare half @llvm.aarch64.sve.faddv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>)
237 declare float @llvm.aarch64.sve.faddv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>)
238 declare double @llvm.aarch64.sve.faddv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>)
240 declare half @llvm.aarch64.sve.fmaxnmv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>)
241 declare float @llvm.aarch64.sve.fmaxnmv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>)
242 declare double @llvm.aarch64.sve.fmaxnmv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>)
244 declare half @llvm.aarch64.sve.fmaxv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>)
245 declare float @llvm.aarch64.sve.fmaxv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>)
246 declare double @llvm.aarch64.sve.fmaxv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>)
248 declare half @llvm.aarch64.sve.fminnmv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>)
249 declare float @llvm.aarch64.sve.fminnmv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>)
250 declare double @llvm.aarch64.sve.fminnmv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>)
252 declare half @llvm.aarch64.sve.fminv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>)
253 declare float @llvm.aarch64.sve.fminv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>)
254 declare double @llvm.aarch64.sve.fminv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>)