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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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