[AArch64] Regenerate fp16 tests.
[llvm-project.git] / llvm / test / CodeGen / PowerPC / aix-vec_extract_p9_2.ll
blobeac2330d92f9696a4174ce3facff826ad53ffbba
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-64
3 ; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 < %s | FileCheck %s -check-prefix=CHECK-32
5 define zeroext i8 @test_add1(<16 x i8> %a, i32 signext %index, i8 zeroext %c) {
6 ; CHECK-64-LABEL: test_add1:
7 ; CHECK-64:       # %bb.0: # %entry
8 ; CHECK-64-NEXT:    vextublx 3, 3, 2
9 ; CHECK-64-NEXT:    add 3, 3, 4
10 ; CHECK-64-NEXT:    clrldi 3, 3, 56
11 ; CHECK-64-NEXT:    blr
13 ; CHECK-32-LABEL: test_add1:
14 ; CHECK-32:       # %bb.0: # %entry
15 ; CHECK-32-NEXT:    addi 5, 1, -16
16 ; CHECK-32-NEXT:    clrlwi 3, 3, 28
17 ; CHECK-32-NEXT:    stxv 34, -16(1)
18 ; CHECK-32-NEXT:    lbzx 3, 5, 3
19 ; CHECK-32-NEXT:    add 3, 3, 4
20 ; CHECK-32-NEXT:    clrlwi 3, 3, 24
21 ; CHECK-32-NEXT:    blr
22 entry:
23   %vecext = extractelement <16 x i8> %a, i32 %index
24   %conv = zext i8 %vecext to i32
25   %conv1 = zext i8 %c to i32
26   %add = add nuw nsw i32 %conv, %conv1
27   %conv2 = trunc i32 %add to i8
28   ret i8 %conv2
31 define signext i8 @test_add2(<16 x i8> %a, i32 signext %index, i8 signext %c) {
32 ; CHECK-64-LABEL: test_add2:
33 ; CHECK-64:       # %bb.0: # %entry
34 ; CHECK-64-NEXT:    vextublx 3, 3, 2
35 ; CHECK-64-NEXT:    add 3, 3, 4
36 ; CHECK-64-NEXT:    extsb 3, 3
37 ; CHECK-64-NEXT:    blr
39 ; CHECK-32-LABEL: test_add2:
40 ; CHECK-32:       # %bb.0: # %entry
41 ; CHECK-32-NEXT:    addi 5, 1, -16
42 ; CHECK-32-NEXT:    clrlwi 3, 3, 28
43 ; CHECK-32-NEXT:    stxv 34, -16(1)
44 ; CHECK-32-NEXT:    lbzx 3, 5, 3
45 ; CHECK-32-NEXT:    add 3, 3, 4
46 ; CHECK-32-NEXT:    extsb 3, 3
47 ; CHECK-32-NEXT:    blr
48 entry:
49   %vecext = extractelement <16 x i8> %a, i32 %index
50   %conv3 = zext i8 %vecext to i32
51   %conv14 = zext i8 %c to i32
52   %add = add nuw nsw i32 %conv3, %conv14
53   %conv2 = trunc i32 %add to i8
54   ret i8 %conv2
57 define zeroext i16 @test_add3(<8 x i16> %a, i32 signext %index, i16 zeroext %c) {
58 ; CHECK-64-LABEL: test_add3:
59 ; CHECK-64:       # %bb.0: # %entry
60 ; CHECK-64-NEXT:    rlwinm 3, 3, 1, 28, 30
61 ; CHECK-64-NEXT:    vextuhlx 3, 3, 2
62 ; CHECK-64-NEXT:    add 3, 3, 4
63 ; CHECK-64-NEXT:    clrldi 3, 3, 48
64 ; CHECK-64-NEXT:    blr
66 ; CHECK-32-LABEL: test_add3:
67 ; CHECK-32:       # %bb.0: # %entry
68 ; CHECK-32-NEXT:    addi 5, 1, -16
69 ; CHECK-32-NEXT:    rlwinm 3, 3, 1, 28, 30
70 ; CHECK-32-NEXT:    stxv 34, -16(1)
71 ; CHECK-32-NEXT:    lhzx 3, 5, 3
72 ; CHECK-32-NEXT:    add 3, 3, 4
73 ; CHECK-32-NEXT:    clrlwi 3, 3, 16
74 ; CHECK-32-NEXT:    blr
75 entry:
76   %vecext = extractelement <8 x i16> %a, i32 %index
77   %conv = zext i16 %vecext to i32
78   %conv1 = zext i16 %c to i32
79   %add = add nuw nsw i32 %conv, %conv1
80   %conv2 = trunc i32 %add to i16
81   ret i16 %conv2
84 define signext i16 @test_add4(<8 x i16> %a, i32 signext %index, i16 signext %c) {
85 ; CHECK-64-LABEL: test_add4:
86 ; CHECK-64:       # %bb.0: # %entry
87 ; CHECK-64-NEXT:    rlwinm 3, 3, 1, 28, 30
88 ; CHECK-64-NEXT:    vextuhlx 3, 3, 2
89 ; CHECK-64-NEXT:    add 3, 3, 4
90 ; CHECK-64-NEXT:    extsh 3, 3
91 ; CHECK-64-NEXT:    blr
93 ; CHECK-32-LABEL: test_add4:
94 ; CHECK-32:       # %bb.0: # %entry
95 ; CHECK-32-NEXT:    addi 5, 1, -16
96 ; CHECK-32-NEXT:    rlwinm 3, 3, 1, 28, 30
97 ; CHECK-32-NEXT:    stxv 34, -16(1)
98 ; CHECK-32-NEXT:    lhzx 3, 5, 3
99 ; CHECK-32-NEXT:    add 3, 3, 4
100 ; CHECK-32-NEXT:    extsh 3, 3
101 ; CHECK-32-NEXT:    blr
102 entry:
103   %vecext = extractelement <8 x i16> %a, i32 %index
104   %conv5 = zext i16 %vecext to i32
105   %conv16 = zext i16 %c to i32
106   %add = add nuw nsw i32 %conv5, %conv16
107   %conv2 = trunc i32 %add to i16
108   ret i16 %conv2
111 define zeroext i32 @test_add5(<4 x i32> %a, i32 signext %index, i32 zeroext %c) {
112 ; CHECK-64-LABEL: test_add5:
113 ; CHECK-64:       # %bb.0: # %entry
114 ; CHECK-64-NEXT:    rlwinm 3, 3, 2, 28, 29
115 ; CHECK-64-NEXT:    vextuwlx 3, 3, 2
116 ; CHECK-64-NEXT:    add 3, 3, 4
117 ; CHECK-64-NEXT:    clrldi 3, 3, 32
118 ; CHECK-64-NEXT:    blr
120 ; CHECK-32-LABEL: test_add5:
121 ; CHECK-32:       # %bb.0: # %entry
122 ; CHECK-32-NEXT:    addi 5, 1, -16
123 ; CHECK-32-NEXT:    rlwinm 3, 3, 2, 28, 29
124 ; CHECK-32-NEXT:    stxv 34, -16(1)
125 ; CHECK-32-NEXT:    lwzx 3, 5, 3
126 ; CHECK-32-NEXT:    add 3, 3, 4
127 ; CHECK-32-NEXT:    blr
128 entry:
129   %vecext = extractelement <4 x i32> %a, i32 %index
130   %add = add i32 %vecext, %c
131   ret i32 %add
134 define signext i32 @test_add6(<4 x i32> %a, i32 signext %index, i32 signext %c) {
135 ; CHECK-64-LABEL: test_add6:
136 ; CHECK-64:       # %bb.0: # %entry
137 ; CHECK-64-NEXT:    rlwinm 3, 3, 2, 28, 29
138 ; CHECK-64-NEXT:    vextuwlx 3, 3, 2
139 ; CHECK-64-NEXT:    add 3, 3, 4
140 ; CHECK-64-NEXT:    extsw 3, 3
141 ; CHECK-64-NEXT:    blr
143 ; CHECK-32-LABEL: test_add6:
144 ; CHECK-32:       # %bb.0: # %entry
145 ; CHECK-32-NEXT:    addi 5, 1, -16
146 ; CHECK-32-NEXT:    rlwinm 3, 3, 2, 28, 29
147 ; CHECK-32-NEXT:    stxv 34, -16(1)
148 ; CHECK-32-NEXT:    lwzx 3, 5, 3
149 ; CHECK-32-NEXT:    add 3, 3, 4
150 ; CHECK-32-NEXT:    blr
151 entry:
152   %vecext = extractelement <4 x i32> %a, i32 %index
153   %add = add nsw i32 %vecext, %c
154   ret i32 %add
157 ; When extracting word element 2 on LE, it's better to use mfvsrwz rather than vextuwrx
158 define zeroext i32 @test7(<4 x i32> %a) {
159 ; CHECK-64-LABEL: test7:
160 ; CHECK-64:       # %bb.0: # %entry
161 ; CHECK-64-NEXT:    li 3, 8
162 ; CHECK-64-NEXT:    vextuwlx 3, 3, 2
163 ; CHECK-64-NEXT:    blr
165 ; CHECK-32-LABEL: test7:
166 ; CHECK-32:       # %bb.0: # %entry
167 ; CHECK-32-NEXT:    stxv 34, -16(1)
168 ; CHECK-32-NEXT:    lwz 3, -8(1)
169 ; CHECK-32-NEXT:    blr
170 entry:
171   %vecext = extractelement <4 x i32> %a, i32 2
172   ret i32 %vecext
175 define zeroext i32 @testadd_7(<4 x i32> %a, i32 zeroext %c) {
176 ; CHECK-64-LABEL: testadd_7:
177 ; CHECK-64:       # %bb.0: # %entry
178 ; CHECK-64-NEXT:    li 4, 8
179 ; CHECK-64-NEXT:    vextuwlx 4, 4, 2
180 ; CHECK-64-NEXT:    add 3, 4, 3
181 ; CHECK-64-NEXT:    clrldi 3, 3, 32
182 ; CHECK-64-NEXT:    blr
184 ; CHECK-32-LABEL: testadd_7:
185 ; CHECK-32:       # %bb.0: # %entry
186 ; CHECK-32-NEXT:    stxv 34, -16(1)
187 ; CHECK-32-NEXT:    lwz 4, -8(1)
188 ; CHECK-32-NEXT:    add 3, 4, 3
189 ; CHECK-32-NEXT:    blr
190 entry:
191   %vecext = extractelement <4 x i32> %a, i32 2
192   %add = add i32 %vecext, %c
193   ret i32 %add
196 define signext i32 @test8(<4 x i32> %a) {
197 ; CHECK-64-LABEL: test8:
198 ; CHECK-64:       # %bb.0: # %entry
199 ; CHECK-64-NEXT:    li 3, 8
200 ; CHECK-64-NEXT:    vextuwlx 3, 3, 2
201 ; CHECK-64-NEXT:    extsw 3, 3
202 ; CHECK-64-NEXT:    blr
204 ; CHECK-32-LABEL: test8:
205 ; CHECK-32:       # %bb.0: # %entry
206 ; CHECK-32-NEXT:    stxv 34, -16(1)
207 ; CHECK-32-NEXT:    lwz 3, -8(1)
208 ; CHECK-32-NEXT:    blr
209 entry:
210   %vecext = extractelement <4 x i32> %a, i32 2
211   ret i32 %vecext
214 define signext i32 @testadd_8(<4 x i32> %a, i32 signext %c) {
215 ; CHECK-64-LABEL: testadd_8:
216 ; CHECK-64:       # %bb.0: # %entry
217 ; CHECK-64-NEXT:    li 4, 8
218 ; CHECK-64-NEXT:    vextuwlx 4, 4, 2
219 ; CHECK-64-NEXT:    add 3, 4, 3
220 ; CHECK-64-NEXT:    extsw 3, 3
221 ; CHECK-64-NEXT:    blr
223 ; CHECK-32-LABEL: testadd_8:
224 ; CHECK-32:       # %bb.0: # %entry
225 ; CHECK-32-NEXT:    stxv 34, -16(1)
226 ; CHECK-32-NEXT:    lwz 4, -8(1)
227 ; CHECK-32-NEXT:    add 3, 4, 3
228 ; CHECK-32-NEXT:    blr
229 entry:
230   %vecext = extractelement <4 x i32> %a, i32 2
231   %add = add nsw i32 %vecext, %c
232   ret i32 %add
235 ; When extracting word element 1 on BE, it's better to use mfvsrwz rather than vextuwlx
236 define signext i32 @test9(<4 x i32> %a) {
237 ; CHECK-64-LABEL: test9:
238 ; CHECK-64:       # %bb.0: # %entry
239 ; CHECK-64-NEXT:    mfvsrwz 3, 34
240 ; CHECK-64-NEXT:    extsw 3, 3
241 ; CHECK-64-NEXT:    blr
243 ; CHECK-32-LABEL: test9:
244 ; CHECK-32:       # %bb.0: # %entry
245 ; CHECK-32-NEXT:    stxv 34, -16(1)
246 ; CHECK-32-NEXT:    lwz 3, -12(1)
247 ; CHECK-32-NEXT:    blr
248 entry:
249   %vecext = extractelement <4 x i32> %a, i32 1
250   ret i32 %vecext
253 define signext i32 @testadd_9(<4 x i32> %a, i32 signext %c) {
254 ; CHECK-64-LABEL: testadd_9:
255 ; CHECK-64:       # %bb.0: # %entry
256 ; CHECK-64-NEXT:    mfvsrwz 4, 34
257 ; CHECK-64-NEXT:    add 3, 4, 3
258 ; CHECK-64-NEXT:    extsw 3, 3
259 ; CHECK-64-NEXT:    blr
261 ; CHECK-32-LABEL: testadd_9:
262 ; CHECK-32:       # %bb.0: # %entry
263 ; CHECK-32-NEXT:    stxv 34, -16(1)
264 ; CHECK-32-NEXT:    lwz 4, -12(1)
265 ; CHECK-32-NEXT:    add 3, 4, 3
266 ; CHECK-32-NEXT:    blr
267 entry:
268   %vecext = extractelement <4 x i32> %a, i32 1
269   %add = add nsw i32 %vecext, %c
270   ret i32 %add