Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / PowerPC / vselect-constants.ll
blobb72142943dd8be6500e65300d381c4a2253f33dd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-unknown | FileCheck %s
4 ; First, check the generic pattern for any 2 vector constants. Then, check special cases where
5 ; the constants are all off-by-one. Finally, check the extra special cases where the constants
6 ; include 0 or -1.
7 ; Each minimal select test is repeated with a more typical pattern that includes a compare to
8 ; generate the condition value.
10 define <4 x i32> @sel_C1_or_C2_vec(<4 x i1> %cond) {
11 ; CHECK-LABEL: sel_C1_or_C2_vec:
12 ; CHECK:       # %bb.0:
13 ; CHECK-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
14 ; CHECK-NEXT:    vspltisw 3, -16
15 ; CHECK-NEXT:    vspltisw 4, 15
16 ; CHECK-NEXT:    addi 3, 3, .LCPI0_0@toc@l
17 ; CHECK-NEXT:    vsubuwm 3, 4, 3
18 ; CHECK-NEXT:    lxvd2x 0, 0, 3
19 ; CHECK-NEXT:    addis 3, 2, .LCPI0_1@toc@ha
20 ; CHECK-NEXT:    vslw 2, 2, 3
21 ; CHECK-NEXT:    addi 3, 3, .LCPI0_1@toc@l
22 ; CHECK-NEXT:    vsraw 2, 2, 3
23 ; CHECK-NEXT:    xxswapd 37, 0
24 ; CHECK-NEXT:    lxvd2x 0, 0, 3
25 ; CHECK-NEXT:    xxswapd 32, 0
26 ; CHECK-NEXT:    xxsel 34, 32, 37, 34
27 ; CHECK-NEXT:    blr
28   %add = select <4 x i1> %cond, <4 x i32> <i32 3000, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1>
29   ret <4 x i32> %add
32 define <4 x i32> @cmp_sel_C1_or_C2_vec(<4 x i32> %x, <4 x i32> %y) {
33 ; CHECK-LABEL: cmp_sel_C1_or_C2_vec:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    addis 3, 2, .LCPI1_0@toc@ha
36 ; CHECK-NEXT:    vcmpequw 2, 2, 3
37 ; CHECK-NEXT:    addi 3, 3, .LCPI1_0@toc@l
38 ; CHECK-NEXT:    lxvd2x 0, 0, 3
39 ; CHECK-NEXT:    addis 3, 2, .LCPI1_1@toc@ha
40 ; CHECK-NEXT:    addi 3, 3, .LCPI1_1@toc@l
41 ; CHECK-NEXT:    xxswapd 36, 0
42 ; CHECK-NEXT:    lxvd2x 0, 0, 3
43 ; CHECK-NEXT:    xxswapd 37, 0
44 ; CHECK-NEXT:    xxsel 34, 37, 36, 34
45 ; CHECK-NEXT:    blr
46   %cond = icmp eq <4 x i32> %x, %y
47   %add = select <4 x i1> %cond, <4 x i32> <i32 3000, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1>
48   ret <4 x i32> %add
51 define <4 x i32> @sel_Cplus1_or_C_vec(<4 x i1> %cond) {
52 ; CHECK-LABEL: sel_Cplus1_or_C_vec:
53 ; CHECK:       # %bb.0:
54 ; CHECK-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
55 ; CHECK-NEXT:    vspltisw 3, 1
56 ; CHECK-NEXT:    addi 3, 3, .LCPI2_0@toc@l
57 ; CHECK-NEXT:    xxland 34, 34, 35
58 ; CHECK-NEXT:    lxvd2x 0, 0, 3
59 ; CHECK-NEXT:    xxswapd 36, 0
60 ; CHECK-NEXT:    vadduwm 2, 2, 4
61 ; CHECK-NEXT:    blr
62   %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1>
63   ret <4 x i32> %add
66 define <4 x i32> @cmp_sel_Cplus1_or_C_vec(<4 x i32> %x, <4 x i32> %y) {
67 ; CHECK-LABEL: cmp_sel_Cplus1_or_C_vec:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
70 ; CHECK-NEXT:    vcmpequw 2, 2, 3
71 ; CHECK-NEXT:    addi 3, 3, .LCPI3_0@toc@l
72 ; CHECK-NEXT:    lxvd2x 0, 0, 3
73 ; CHECK-NEXT:    xxswapd 36, 0
74 ; CHECK-NEXT:    vsubuwm 2, 4, 2
75 ; CHECK-NEXT:    blr
76   %cond = icmp eq <4 x i32> %x, %y
77   %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1>
78   ret <4 x i32> %add
81 define <4 x i32> @sel_Cminus1_or_C_vec(<4 x i1> %cond) {
82 ; CHECK-LABEL: sel_Cminus1_or_C_vec:
83 ; CHECK:       # %bb.0:
84 ; CHECK-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
85 ; CHECK-NEXT:    vspltisw 3, -16
86 ; CHECK-NEXT:    vspltisw 4, 15
87 ; CHECK-NEXT:    addi 3, 3, .LCPI4_0@toc@l
88 ; CHECK-NEXT:    vsubuwm 3, 4, 3
89 ; CHECK-NEXT:    lxvd2x 0, 0, 3
90 ; CHECK-NEXT:    vslw 2, 2, 3
91 ; CHECK-NEXT:    vsraw 2, 2, 3
92 ; CHECK-NEXT:    xxswapd 37, 0
93 ; CHECK-NEXT:    vadduwm 2, 2, 5
94 ; CHECK-NEXT:    blr
95   %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 44, i32 2, i32 0, i32 1>
96   ret <4 x i32> %add
99 define <4 x i32> @cmp_sel_Cminus1_or_C_vec(<4 x i32> %x, <4 x i32> %y) {
100 ; CHECK-LABEL: cmp_sel_Cminus1_or_C_vec:
101 ; CHECK:       # %bb.0:
102 ; CHECK-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
103 ; CHECK-NEXT:    vcmpequw 2, 2, 3
104 ; CHECK-NEXT:    addi 3, 3, .LCPI5_0@toc@l
105 ; CHECK-NEXT:    lxvd2x 0, 0, 3
106 ; CHECK-NEXT:    xxswapd 36, 0
107 ; CHECK-NEXT:    vadduwm 2, 2, 4
108 ; CHECK-NEXT:    blr
109   %cond = icmp eq <4 x i32> %x, %y
110   %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 44, i32 2, i32 0, i32 1>
111   ret <4 x i32> %add
114 define <4 x i32> @sel_minus1_or_0_vec(<4 x i1> %cond) {
115 ; CHECK-LABEL: sel_minus1_or_0_vec:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    vspltisw 3, -16
118 ; CHECK-NEXT:    vspltisw 4, 15
119 ; CHECK-NEXT:    vsubuwm 3, 4, 3
120 ; CHECK-NEXT:    vslw 2, 2, 3
121 ; CHECK-NEXT:    vsraw 2, 2, 3
122 ; CHECK-NEXT:    blr
123   %add = select <4 x i1> %cond, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
124   ret <4 x i32> %add
127 define <4 x i32> @cmp_sel_minus1_or_0_vec(<4 x i32> %x, <4 x i32> %y) {
128 ; CHECK-LABEL: cmp_sel_minus1_or_0_vec:
129 ; CHECK:       # %bb.0:
130 ; CHECK-NEXT:    vcmpequw 2, 2, 3
131 ; CHECK-NEXT:    blr
132   %cond = icmp eq <4 x i32> %x, %y
133   %add = select <4 x i1> %cond, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
134   ret <4 x i32> %add
137 define <4 x i32> @sel_0_or_minus1_vec(<4 x i1> %cond) {
138 ; CHECK-LABEL: sel_0_or_minus1_vec:
139 ; CHECK:       # %bb.0:
140 ; CHECK-NEXT:    vspltisw 3, 1
141 ; CHECK-NEXT:    xxland 34, 34, 35
142 ; CHECK-NEXT:    xxleqv 35, 35, 35
143 ; CHECK-NEXT:    vadduwm 2, 2, 3
144 ; CHECK-NEXT:    blr
145   %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
146   ret <4 x i32> %add
149 define <4 x i32> @cmp_sel_0_or_minus1_vec(<4 x i32> %x, <4 x i32> %y) {
150 ; CHECK-LABEL: cmp_sel_0_or_minus1_vec:
151 ; CHECK:       # %bb.0:
152 ; CHECK-NEXT:    vcmpequw 2, 2, 3
153 ; CHECK-NEXT:    xxlnor 34, 34, 34
154 ; CHECK-NEXT:    blr
155   %cond = icmp eq <4 x i32> %x, %y
156   %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
157   ret <4 x i32> %add
160 define <4 x i32> @sel_1_or_0_vec(<4 x i1> %cond) {
161 ; CHECK-LABEL: sel_1_or_0_vec:
162 ; CHECK:       # %bb.0:
163 ; CHECK-NEXT:    vspltisw 3, 1
164 ; CHECK-NEXT:    xxland 34, 34, 35
165 ; CHECK-NEXT:    blr
166   %add = select <4 x i1> %cond, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
167   ret <4 x i32> %add
170 define <4 x i32> @cmp_sel_1_or_0_vec(<4 x i32> %x, <4 x i32> %y) {
171 ; CHECK-LABEL: cmp_sel_1_or_0_vec:
172 ; CHECK:       # %bb.0:
173 ; CHECK-NEXT:    vspltisw 4, 1
174 ; CHECK-NEXT:    vcmpequw 2, 2, 3
175 ; CHECK-NEXT:    xxland 34, 34, 36
176 ; CHECK-NEXT:    blr
177   %cond = icmp eq <4 x i32> %x, %y
178   %add = select <4 x i1> %cond, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
179   ret <4 x i32> %add
182 define <4 x i32> @sel_0_or_1_vec(<4 x i1> %cond) {
183 ; CHECK-LABEL: sel_0_or_1_vec:
184 ; CHECK:       # %bb.0:
185 ; CHECK-NEXT:    vspltisw 3, 1
186 ; CHECK-NEXT:    xxlandc 34, 35, 34
187 ; CHECK-NEXT:    blr
188   %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
189   ret <4 x i32> %add
192 define <4 x i32> @cmp_sel_0_or_1_vec(<4 x i32> %x, <4 x i32> %y) {
193 ; CHECK-LABEL: cmp_sel_0_or_1_vec:
194 ; CHECK:       # %bb.0:
195 ; CHECK-NEXT:    vcmpequw 2, 2, 3
196 ; CHECK-NEXT:    vspltisw 4, 1
197 ; CHECK-NEXT:    xxlnor 0, 34, 34
198 ; CHECK-NEXT:    xxland 34, 0, 36
199 ; CHECK-NEXT:    blr
200   %cond = icmp eq <4 x i32> %x, %y
201   %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
202   ret <4 x i32> %add