[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-luti.ll
blob54366627537626e2687ca13354b25a15d109fbdc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon,+lut,+bf16 | FileCheck %s
4 define <16 x i8> @test_luti2_lane_i8(<8 x i8> %vn, <8 x i8> %vm){
5 ; CHECK-LABEL: test_luti2_lane_i8:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
8 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
9 ; CHECK-NEXT:    luti2 v0.16b, { v0.16b }, v1[0]
10 ; CHECK-NEXT:    ret
11    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti2.lane.v16i8.v8i8(<8 x i8> %vn, <8 x i8> %vm, i32 0)
12    ret <16 x i8>  %res
15 define <16 x i8> @test_luti2_laneq_i8(<8 x i8> %vn, <16 x i8> %vm){
16 ; CHECK-LABEL: test_luti2_laneq_i8:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
19 ; CHECK-NEXT:    luti2 v0.16b, { v0.16b }, v1[0]
20 ; CHECK-NEXT:    ret
21    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti2.laneq.v16i8.v8i8(<8 x i8> %vn, <16 x i8> %vm, i32 0)
22    ret <16 x i8>  %res
25 define <16 x i8> @test_luti2q_lane_i8(<16 x i8> %vn, <8 x i8> %vm){
26 ; CHECK-LABEL: test_luti2q_lane_i8:
27 ; CHECK:       // %bb.0:
28 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
29 ; CHECK-NEXT:    luti2 v0.16b, { v0.16b }, v1[0]
30 ; CHECK-NEXT:    ret
31    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti2.lane.v16i8.v16i8(<16 x i8> %vn, <8 x i8> %vm, i32 0)
32    ret <16 x i8>  %res
35 define <16 x i8> @test_luti2q_laneq_i8(<16 x i8> %vn, <16 x i8> %vm){
36 ; CHECK-LABEL: test_luti2q_laneq_i8:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    luti2 v0.16b, { v0.16b }, v1[0]
39 ; CHECK-NEXT:    ret
40    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti2.laneq.v16i8.v16i8(<16 x i8> %vn, <16 x i8> %vm, i32 0)
41    ret <16 x i8>  %res
44 define <8 x i16> @test_luti2_lane_i16(<4 x i16> %vn, <8 x i8> %vm){
45 ; CHECK-LABEL: test_luti2_lane_i16:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
48 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
49 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
50 ; CHECK-NEXT:    ret
51    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti2.lane.v8i16.v4i16(<4 x i16> %vn, <8 x i8> %vm, i32 0)
52    ret <8 x i16>  %res
55 define <8 x i16> @test_luti2_laneq_i16(<4 x i16> %vn, <16 x i8> %vm){
56 ; CHECK-LABEL: test_luti2_laneq_i16:
57 ; CHECK:       // %bb.0:
58 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
59 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
60 ; CHECK-NEXT:    ret
61    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti2.laneq.v8i16.v4i16(<4 x i16> %vn, <16 x i8> %vm, i32 0)
62    ret <8 x i16>  %res
65 define <8 x i16> @test_luti2q_lane_i16(<4 x i16> %vn, <8 x i8> %vm){
66 ; CHECK-LABEL: test_luti2q_lane_i16:
67 ; CHECK:       // %bb.0:
68 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
69 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
70 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
71 ; CHECK-NEXT:    ret
72    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti2.lane.v8i16.v8i16(<4 x i16> %vn, <8 x i8> %vm, i32 0)
73    ret <8 x i16>  %res
76 define <8 x i16> @test_luti2q_laneq_i16(<8 x i16> %vn, <16 x i8> %vm){
77 ; CHECK-LABEL: test_luti2q_laneq_i16:
78 ; CHECK:       // %bb.0:
79 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
80 ; CHECK-NEXT:    ret
81    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti2.laneq.v8i16.v8i16(<8 x i16> %vn, <16 x i8> %vm, i32 0)
82    ret <8 x i16>  %res
85 define <8 x half> @test_luti2_lane_f16(<4 x half> %vn, <8 x i8> %vm){
86 ; CHECK-LABEL: test_luti2_lane_f16:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
89 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
90 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
91 ; CHECK-NEXT:    ret
92    %res= tail call <8 x half> @llvm.aarch64.neon.vluti2.lane.v8f16.v4f16(<4 x half> %vn, <8 x i8> %vm, i32 0)
93    ret <8 x half>  %res
96 define <8 x half> @test_luti2_laneq_f16(<4 x half> %vn, <16 x i8> %vm){
97 ; CHECK-LABEL: test_luti2_laneq_f16:
98 ; CHECK:       // %bb.0:
99 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
100 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
101 ; CHECK-NEXT:    ret
102    %res= tail call <8 x half> @llvm.aarch64.neon.vluti2.laneq.v8f16.v4i16(<4 x half> %vn, <16 x i8> %vm, i32 0)
103    ret <8 x half>  %res
106 define <8 x half> @test_luti2q_lane_f16(<8 x half> %vn, <8 x i8> %vm){
107 ; CHECK-LABEL: test_luti2q_lane_f16:
108 ; CHECK:       // %bb.0:
109 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
110 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
111 ; CHECK-NEXT:    ret
112    %res= tail call <8 x half> @llvm.aarch64.neon.vluti2.lane.v8f16.v8f16(<8 x half> %vn, <8 x i8> %vm, i32 0)
113    ret <8 x half>  %res
116 define <8 x half> @test_luti2q_laneq_f16(<8 x half> %vn, <16 x i8> %vm){
117 ; CHECK-LABEL: test_luti2q_laneq_f16:
118 ; CHECK:       // %bb.0:
119 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
120 ; CHECK-NEXT:    ret
121    %res= tail call <8 x half> @llvm.aarch64.neon.vluti2.laneq.v8f16.v8f16(<8 x half> %vn, <16 x i8> %vm, i32 0)
122    ret <8 x half>  %res
125 define <8 x bfloat> @test_luti2_lane_bf16(<4 x bfloat> %vn, <8 x i8> %vm){
126 ; CHECK-LABEL: test_luti2_lane_bf16:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
129 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
130 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
131 ; CHECK-NEXT:    ret
132    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti2.lane.v8bf16.v4bf16(<4 x bfloat> %vn, <8 x i8> %vm, i32 0)
133    ret <8 x bfloat>  %res
136 define <8 x bfloat> @test_luti2_laneq_bf16(<4 x bfloat> %vn, <16 x i8> %vm){
137 ; CHECK-LABEL: test_luti2_laneq_bf16:
138 ; CHECK:       // %bb.0:
139 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
140 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
141 ; CHECK-NEXT:    ret
142    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti2.laneq.v8bf16.v4bf16(<4 x bfloat> %vn, <16 x i8> %vm, i32 0)
143    ret <8 x bfloat>  %res
146 define <8 x bfloat> @test_luti2q_lane_bf16(<4 x bfloat> %vn, <8 x i8> %vm){
147 ; CHECK-LABEL: test_luti2q_lane_bf16:
148 ; CHECK:       // %bb.0:
149 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
150 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
151 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
152 ; CHECK-NEXT:    ret
153    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti2.lane.v8bf16.v8bf16(<4 x bfloat> %vn, <8 x i8> %vm, i32 0)
154    ret <8 x bfloat>  %res
157 define <8 x bfloat> @test_luti2q_laneq_bf16(<8 x bfloat> %vn, <16 x i8> %vm){
158 ; CHECK-LABEL: test_luti2q_laneq_bf16:
159 ; CHECK:       // %bb.0:
160 ; CHECK-NEXT:    luti2 v0.8h, { v0.8h }, v1[0]
161 ; CHECK-NEXT:    ret
162    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti2.laneq.v8bf16.v8bf16(<8 x bfloat> %vn, <16 x i8> %vm, i32 0)
163    ret <8 x bfloat>  %res
166 define <16 x i8> @test_luti4q_lane_i8(<16 x i8> %vn, <8 x i8> %vm){
167 ; CHECK-LABEL: test_luti4q_lane_i8:
168 ; CHECK:       // %bb.0:
169 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
170 ; CHECK-NEXT:    luti4 v0.16b, { v0.16b }, v1[0]
171 ; CHECK-NEXT:    ret
172    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti4q.lane.v16i8(<16 x i8> %vn, <8 x i8> %vm, i32 0)
173    ret <16 x i8>  %res
176 define <16 x i8> @test_luti4q_laneq_i8(<16 x i8> %vn, <16 x i8> %vm){
177 ; CHECK-LABEL: test_luti4q_laneq_i8:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    luti4 v0.16b, { v0.16b }, v1[0]
180 ; CHECK-NEXT:    ret
181    %res= tail call <16 x i8> @llvm.aarch64.neon.vluti4q.laneq.v16i8(<16 x i8> %vn, <16 x i8> %vm, i32 0)
182    ret <16 x i8>  %res
185 define <8 x i16> @test_luti4q_lane_x2_i16(<8 x i16> %vn1, <8 x i16> %vn2, <8 x i8> %vm){
186 ; CHECK-LABEL: test_luti4q_lane_x2_i16:
187 ; CHECK:       // %bb.0:
188 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
189 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $q2
190 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
191 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
192 ; CHECK-NEXT:    ret
193    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti4q.lane.x2.v8i16(<8 x i16> %vn1, <8 x i16> %vn2, <8 x i8> %vm, i32 1)
194    ret <8 x i16> %res
197 define <8 x i16> @test_luti4q_laneq_x2_i16(<8 x i16> %vn1, <8 x i16> %vn2, <16 x i8> %vm){
198 ; CHECK-LABEL: test_luti4q_laneq_x2_i16:
199 ; CHECK:       // %bb.0:
200 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
201 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
202 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
203 ; CHECK-NEXT:    ret
204    %res= tail call <8 x i16> @llvm.aarch64.neon.vluti4q.laneq.x2.v8i16(<8 x i16> %vn1, <8 x i16> %vn2, <16 x i8> %vm, i32 1)
205    ret <8 x i16> %res
208 define <8 x half> @test_luti4q_lane_x2_f16(<8 x half>%vn1, <8 x half> %vn2, <8 x i8> %vm){
209 ; CHECK-LABEL: test_luti4q_lane_x2_f16:
210 ; CHECK:       // %bb.0:
211 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
212 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $q2
213 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
214 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
215 ; CHECK-NEXT:    ret
216    %res= tail call <8 x half> @llvm.aarch64.neon.vluti4q.lane.x2.v8f16(<8 x half> %vn1, <8 x half> %vn2, <8 x i8> %vm, i32 1)
217    ret <8 x half> %res
221 define <8 x half> @test_luti4q_laneq_x2_f16(<8 x half>%vn1, <8 x half> %vn2, <16 x i8> %vm){
222 ; CHECK-LABEL: test_luti4q_laneq_x2_f16:
223 ; CHECK:       // %bb.0:
224 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
225 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
226 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
227 ; CHECK-NEXT:    ret
228    %res= tail call <8 x half> @llvm.aarch64.neon.vluti4q.laneq.x2.v8f16(<8 x half> %vn1, <8 x half> %vn2, <16 x i8> %vm, i32 1)
229    ret <8 x half> %res
232 define <8 x bfloat> @test_luti4q_laneq_x2_bf16(<8 x bfloat>%vn1, <8 x bfloat> %vn2, <16 x i8> %vm){
233 ; CHECK-LABEL: test_luti4q_laneq_x2_bf16:
234 ; CHECK:       // %bb.0:
235 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
236 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
237 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
238 ; CHECK-NEXT:    ret
239    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti4q.laneq.x2.v8bf16(<8 x bfloat> %vn1, <8 x bfloat> %vn2, <16 x i8> %vm, i32 1)
240    ret <8 x bfloat> %res
243 define <8 x bfloat> @test_luti4q_lane_x2_bf16(<8 x bfloat>%vn1, <8 x bfloat> %vn2, <8 x i8> %vm){
244 ; CHECK-LABEL: test_luti4q_lane_x2_bf16:
245 ; CHECK:       // %bb.0:
246 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
247 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $q2
248 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
249 ; CHECK-NEXT:    luti4 v0.8h, { v0.8h, v1.8h }, v2[1]
250 ; CHECK-NEXT:    ret
251    %res= tail call <8 x bfloat> @llvm.aarch64.neon.vluti4q.lane.x2.v8bf16(<8 x bfloat> %vn1, <8 x bfloat> %vn2, <8 x i8> %vm, i32 1)
252    ret <8 x bfloat> %res