[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / zeroing-forms-flogb.ll
blob23620a3419b99943f54e9675d21f979f380c004a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mattr=+sve2   < %s | FileCheck %s
3 ; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2
5 ; RUN: llc -mattr=+sme2   -force-streaming < %s | FileCheck %s
6 ; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2
8 target triple = "aarch64-linux"
10 define <vscale x 8 x i16> @test_svlogb_f16_x_1(<vscale x 8 x i1> %pg, <vscale x 8 x half> %x) {
11 ; CHECK-LABEL: test_svlogb_f16_x_1:
12 ; CHECK:       // %bb.0: // %entry
13 ; CHECK-NEXT:    flogb z0.h, p0/m, z0.h
14 ; CHECK-NEXT:    ret
16 ; CHECK-2p2-LABEL: test_svlogb_f16_x_1:
17 ; CHECK-2p2:       // %bb.0: // %entry
18 ; CHECK-2p2-NEXT:    flogb z0.h, p0/z, z0.h
19 ; CHECK-2p2-NEXT:    ret
20 entry:
21   %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.flogb.nxv8f16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x half> %x)
22   ret <vscale x 8 x i16> %0
25 define <vscale x 8 x i16> @test_svlogb_f16_x_2(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
26 ; CHECK-LABEL: test_svlogb_f16_x_2:
27 ; CHECK:       // %bb.0: // %entry
28 ; CHECK-NEXT:    flogb z0.h, p0/m, z1.h
29 ; CHECK-NEXT:    ret
31 ; CHECK-2p2-LABEL: test_svlogb_f16_x_2:
32 ; CHECK-2p2:       // %bb.0: // %entry
33 ; CHECK-2p2-NEXT:    flogb z0.h, p0/z, z1.h
34 ; CHECK-2p2-NEXT:    ret
35 entry:
36   %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.flogb.nxv8f16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x half> %x)
37   ret <vscale x 8 x i16> %0
40 define <vscale x 8 x i16> @test_svlogb_f16_z(<vscale x 8 x i1> %pg, double %z0, <vscale x 8 x half> %x) {
41 ; CHECK-LABEL: test_svlogb_f16_z:
42 ; CHECK:       // %bb.0: // %entry
43 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
44 ; CHECK-NEXT:    flogb z0.h, p0/m, z1.h
45 ; CHECK-NEXT:    ret
47 ; CHECK-2p2-LABEL: test_svlogb_f16_z:
48 ; CHECK-2p2:       // %bb.0: // %entry
49 ; CHECK-2p2-NEXT:    flogb z0.h, p0/z, z1.h
50 ; CHECK-2p2-NEXT:    ret
51 entry:
52   %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.flogb.nxv8f16(<vscale x 8 x i16> zeroinitializer, <vscale x 8 x i1> %pg, <vscale x 8 x half> %x)
53   ret <vscale x 8 x i16> %0
56 define <vscale x 4 x i32> @test_svlogb_f32_x_1(<vscale x 4 x i1> %pg, <vscale x 4 x float> %x) {
57 ; CHECK-LABEL: test_svlogb_f32_x_1:
58 ; CHECK:       // %bb.0: // %entry
59 ; CHECK-NEXT:    flogb z0.s, p0/m, z0.s
60 ; CHECK-NEXT:    ret
62 ; CHECK-2p2-LABEL: test_svlogb_f32_x_1:
63 ; CHECK-2p2:       // %bb.0: // %entry
64 ; CHECK-2p2-NEXT:    flogb z0.s, p0/z, z0.s
65 ; CHECK-2p2-NEXT:    ret
66 entry:
67   %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.flogb.nxv4f32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
68   ret <vscale x 4 x i32> %0
71 define <vscale x 4 x i32> @test_svlogb_f32_x_2(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
72 ; CHECK-LABEL: test_svlogb_f32_x_2:
73 ; CHECK:       // %bb.0: // %entry
74 ; CHECK-NEXT:    flogb z0.s, p0/m, z1.s
75 ; CHECK-NEXT:    ret
77 ; CHECK-2p2-LABEL: test_svlogb_f32_x_2:
78 ; CHECK-2p2:       // %bb.0: // %entry
79 ; CHECK-2p2-NEXT:    flogb z0.s, p0/z, z1.s
80 ; CHECK-2p2-NEXT:    ret
81 entry:
82   %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.flogb.nxv4f32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
83   ret <vscale x 4 x i32> %0
86 define <vscale x 4 x i32> @test_svlogb_f32_z(<vscale x 4 x i1> %pg, double %z0, <vscale x 4 x float> %x) {
87 ; CHECK-LABEL: test_svlogb_f32_z:
88 ; CHECK:       // %bb.0: // %entry
89 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
90 ; CHECK-NEXT:    flogb z0.s, p0/m, z1.s
91 ; CHECK-NEXT:    ret
93 ; CHECK-2p2-LABEL: test_svlogb_f32_z:
94 ; CHECK-2p2:       // %bb.0: // %entry
95 ; CHECK-2p2-NEXT:    flogb z0.s, p0/z, z1.s
96 ; CHECK-2p2-NEXT:    ret
97 entry:
98   %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.flogb.nxv4f32(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
99   ret <vscale x 4 x i32> %0
102 define <vscale x 2 x i64> @test_svlogb_f64_x_1(<vscale x 2 x i1> %pg, <vscale x 2 x double> %x) {
103 ; CHECK-LABEL: test_svlogb_f64_x_1:
104 ; CHECK:       // %bb.0: // %entry
105 ; CHECK-NEXT:    flogb z0.d, p0/m, z0.d
106 ; CHECK-NEXT:    ret
108 ; CHECK-2p2-LABEL: test_svlogb_f64_x_1:
109 ; CHECK-2p2:       // %bb.0: // %entry
110 ; CHECK-2p2-NEXT:    flogb z0.d, p0/z, z0.d
111 ; CHECK-2p2-NEXT:    ret
112 entry:
113   %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.flogb.nxv2f64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
114   ret <vscale x 2 x i64> %0
117 define <vscale x 2 x i64> @test_svlogb_f64_x_2(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
118 ; CHECK-LABEL: test_svlogb_f64_x_2:
119 ; CHECK:       // %bb.0: // %entry
120 ; CHECK-NEXT:    flogb z0.d, p0/m, z1.d
121 ; CHECK-NEXT:    ret
123 ; CHECK-2p2-LABEL: test_svlogb_f64_x_2:
124 ; CHECK-2p2:       // %bb.0: // %entry
125 ; CHECK-2p2-NEXT:    flogb z0.d, p0/z, z1.d
126 ; CHECK-2p2-NEXT:    ret
127 entry:
128   %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.flogb.nxv2f64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
129   ret <vscale x 2 x i64> %0
132 define <vscale x 2 x i64> @test_svlogb_f64_z(<vscale x 2 x i1> %pg, double %z0, <vscale x 2 x double> %x) {
133 ; CHECK-LABEL: test_svlogb_f64_z:
134 ; CHECK:       // %bb.0: // %entry
135 ; CHECK-NEXT:    mov z0.d, #0 // =0x0
136 ; CHECK-NEXT:    flogb z0.d, p0/m, z1.d
137 ; CHECK-NEXT:    ret
139 ; CHECK-2p2-LABEL: test_svlogb_f64_z:
140 ; CHECK-2p2:       // %bb.0: // %entry
141 ; CHECK-2p2-NEXT:    flogb z0.d, p0/z, z1.d
142 ; CHECK-2p2-NEXT:    ret
143 entry:
144   %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.flogb.nxv2f64(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
145   ret <vscale x 2 x i64> %0
148 define <vscale x 8 x i16> @test_svlogb_nxv8f16_ptrue_u(double %z0, <vscale x 8 x half> %x) {
149 ; CHECK-LABEL: test_svlogb_nxv8f16_ptrue_u:
150 ; CHECK:       // %bb.0: // %entry
151 ; CHECK-NEXT:    ptrue p0.h
152 ; CHECK-NEXT:    flogb z0.h, p0/m, z1.h
153 ; CHECK-NEXT:    ret
155 ; CHECK-2p2-LABEL: test_svlogb_nxv8f16_ptrue_u:
156 ; CHECK-2p2:       // %bb.0: // %entry
157 ; CHECK-2p2-NEXT:    ptrue p0.h
158 ; CHECK-2p2-NEXT:    flogb z0.h, p0/z, z1.h
159 ; CHECK-2p2-NEXT:    ret
160 entry:
161   %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
162   %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.flogb.nxv8f16(<vscale x 8 x i16> poison, <vscale x 8 x i1> %pg, <vscale x 8 x half> %x)
163   ret <vscale x 8 x i16> %0
166 define <vscale x 8 x i16> @test_svlogb_nxv8f16_ptrue(double %z0, <vscale x 8 x i16> %x, <vscale x 8 x half> %y) {
167 ; CHECK-LABEL: test_svlogb_nxv8f16_ptrue:
168 ; CHECK:       // %bb.0: // %entry
169 ; CHECK-NEXT:    mov z0.d, z1.d
170 ; CHECK-NEXT:    ptrue p0.h
171 ; CHECK-NEXT:    flogb z0.h, p0/m, z2.h
172 ; CHECK-NEXT:    ret
174 ; CHECK-2p2-LABEL: test_svlogb_nxv8f16_ptrue:
175 ; CHECK-2p2:       // %bb.0: // %entry
176 ; CHECK-2p2-NEXT:    ptrue p0.h
177 ; CHECK-2p2-NEXT:    flogb z0.h, p0/z, z2.h
178 ; CHECK-2p2-NEXT:    ret
179 entry:
180   %pg = call <vscale x 8 x i1> @llvm.aarch64.sve.ptrue.nxv8i1(i32 31)
181   %0 = tail call <vscale x 8 x i16> @llvm.aarch64.sve.flogb.nxv8f16(<vscale x 8 x i16> %x, <vscale x 8 x i1> %pg, <vscale x 8 x half> %y)
182   ret <vscale x 8 x i16> %0
185 define <vscale x 4 x i32> @test_svlogb_nxv4f32_ptrue_u(double %z0, <vscale x 4 x float> %x) {
186 ; CHECK-LABEL: test_svlogb_nxv4f32_ptrue_u:
187 ; CHECK:       // %bb.0: // %entry
188 ; CHECK-NEXT:    ptrue p0.s
189 ; CHECK-NEXT:    flogb z0.s, p0/m, z1.s
190 ; CHECK-NEXT:    ret
192 ; CHECK-2p2-LABEL: test_svlogb_nxv4f32_ptrue_u:
193 ; CHECK-2p2:       // %bb.0: // %entry
194 ; CHECK-2p2-NEXT:    ptrue p0.s
195 ; CHECK-2p2-NEXT:    flogb z0.s, p0/z, z1.s
196 ; CHECK-2p2-NEXT:    ret
197 entry:
198   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
199   %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.flogb.nxv4f32(<vscale x 4 x i32> poison, <vscale x 4 x i1> %pg, <vscale x 4 x float> %x)
200   ret <vscale x 4 x i32> %0
203 define <vscale x 4 x i32> @test_svlogb_nxv4f32_ptrue(double %z0, <vscale x 4 x i32> %x, <vscale x 4 x float> %y) {
204 ; CHECK-LABEL: test_svlogb_nxv4f32_ptrue:
205 ; CHECK:       // %bb.0: // %entry
206 ; CHECK-NEXT:    mov z0.d, z1.d
207 ; CHECK-NEXT:    ptrue p0.s
208 ; CHECK-NEXT:    flogb z0.s, p0/m, z2.s
209 ; CHECK-NEXT:    ret
211 ; CHECK-2p2-LABEL: test_svlogb_nxv4f32_ptrue:
212 ; CHECK-2p2:       // %bb.0: // %entry
213 ; CHECK-2p2-NEXT:    ptrue p0.s
214 ; CHECK-2p2-NEXT:    flogb z0.s, p0/z, z2.s
215 ; CHECK-2p2-NEXT:    ret
216 entry:
217   %pg = call <vscale x 4 x i1> @llvm.aarch64.sve.ptrue.nxv4i1(i32 31)
218   %0 = tail call <vscale x 4 x i32> @llvm.aarch64.sve.flogb.nxv4f32(<vscale x 4 x i32> %x, <vscale x 4 x i1> %pg, <vscale x 4 x float> %y)
219   ret <vscale x 4 x i32> %0
222 define <vscale x 2 x i64> @test_svlogb_nxv2f64_ptrue_u(double %z0, <vscale x 2 x double> %x) {
223 ; CHECK-LABEL: test_svlogb_nxv2f64_ptrue_u:
224 ; CHECK:       // %bb.0: // %entry
225 ; CHECK-NEXT:    ptrue p0.d
226 ; CHECK-NEXT:    flogb z0.d, p0/m, z1.d
227 ; CHECK-NEXT:    ret
229 ; CHECK-2p2-LABEL: test_svlogb_nxv2f64_ptrue_u:
230 ; CHECK-2p2:       // %bb.0: // %entry
231 ; CHECK-2p2-NEXT:    ptrue p0.d
232 ; CHECK-2p2-NEXT:    flogb z0.d, p0/z, z1.d
233 ; CHECK-2p2-NEXT:    ret
234 entry:
235   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
236   %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.flogb.nxv2f64(<vscale x 2 x i64> poison, <vscale x 2 x i1> %pg, <vscale x 2 x double> %x)
237   ret <vscale x 2 x i64> %0
240 define <vscale x 2 x i64> @test_svlogb_nxv2f64_ptrue(double %z0, <vscale x 2 x i64> %x, <vscale x 2 x double> %y) {
241 ; CHECK-LABEL: test_svlogb_nxv2f64_ptrue:
242 ; CHECK:       // %bb.0: // %entry
243 ; CHECK-NEXT:    mov z0.d, z1.d
244 ; CHECK-NEXT:    ptrue p0.d
245 ; CHECK-NEXT:    flogb z0.d, p0/m, z2.d
246 ; CHECK-NEXT:    ret
248 ; CHECK-2p2-LABEL: test_svlogb_nxv2f64_ptrue:
249 ; CHECK-2p2:       // %bb.0: // %entry
250 ; CHECK-2p2-NEXT:    ptrue p0.d
251 ; CHECK-2p2-NEXT:    flogb z0.d, p0/z, z2.d
252 ; CHECK-2p2-NEXT:    ret
253 entry:
254   %pg = call <vscale x 2 x i1> @llvm.aarch64.sve.ptrue.nxv2i1(i32 31)
255   %0 = tail call <vscale x 2 x i64> @llvm.aarch64.sve.flogb.nxv2f64(<vscale x 2 x i64> %x, <vscale x 2 x i1> %pg, <vscale x 2 x double> %y)
256   ret <vscale x 2 x i64> %0