[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / xop-pcmov.ll
blob4e8abc0d4b6c4fbdcbb006466b4b4d31b49a4fda
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s
5 define <4 x double> @pcmov_4f64(<4 x double> %a, <4 x double> %b, <4 x double> %m) {
6 ; CHECK-LABEL: pcmov_4f64:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
9 ; CHECK-NEXT:    retq
10   %1 = bitcast <4 x double> %m to <4 x i64>
11   %2 = bitcast <4 x double> %a to <4 x i64>
12   %3 = and <4 x i64> %1, %2
13   %4 = xor <4 x i64> %1, <i64 -1, i64 -1, i64 -1, i64 -1>
14   %5 = bitcast <4 x double> %b to <4 x i64>
15   %6 = and <4 x i64> %4, %5
16   %7 = or <4 x i64> %3, %6
17   %8 = bitcast <4 x i64> %7 to <4 x double>
18   ret <4 x double> %8
21 define <2 x double> @pcmov_2f64(<2 x double> %a, <2 x double> %b, <2 x double> %m) {
22 ; CHECK-LABEL: pcmov_2f64:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
25 ; CHECK-NEXT:    retq
26   %1 = bitcast <2 x double> %m to <2 x i64>
27   %2 = bitcast <2 x double> %a to <2 x i64>
28   %3 = and <2 x i64> %1, %2
29   %4 = xor <2 x i64> %1, <i64 -1, i64 -1>
30   %5 = bitcast <2 x double> %b to <2 x i64>
31   %6 = and <2 x i64> %4, %5
32   %7 = or <2 x i64> %3, %6
33   %8 = bitcast <2 x i64> %7 to <2 x double>
34   ret <2 x double> %8
37 define <8 x float> @pcmov_8f32(<8 x float> %a, <8 x float> %b, <8 x float> %m) {
38 ; CHECK-LABEL: pcmov_8f32:
39 ; CHECK:       # %bb.0:
40 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
41 ; CHECK-NEXT:    retq
42   %1 = bitcast <8 x float> %m to <8 x i32>
43   %2 = bitcast <8 x float> %a to <8 x i32>
44   %3 = and <8 x i32> %1, %2
45   %4 = xor <8 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
46   %5 = bitcast <8 x float> %b to <8 x i32>
47   %6 = and <8 x i32> %4, %5
48   %7 = or <8 x i32> %3, %6
49   %8 = bitcast <8 x i32> %7 to <8 x float>
50   ret <8 x float> %8
53 define <4 x float> @pcmov_4f32(<4 x float> %a, <4 x float> %b, <4 x float> %m) {
54 ; CHECK-LABEL: pcmov_4f32:
55 ; CHECK:       # %bb.0:
56 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
57 ; CHECK-NEXT:    retq
58   %1 = bitcast <4 x float> %m to <4 x i32>
59   %2 = bitcast <4 x float> %a to <4 x i32>
60   %3 = and <4 x i32> %1, %2
61   %4 = xor <4 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1>
62   %5 = bitcast <4 x float> %b to <4 x i32>
63   %6 = and <4 x i32> %4, %5
64   %7 = or <4 x i32> %3, %6
65   %8 = bitcast <4 x i32> %7 to <4 x float>
66   ret <4 x float> %8
69 define <4 x i64> @pcmov_4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %m) {
70 ; CHECK-LABEL: pcmov_4i64:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
73 ; CHECK-NEXT:    retq
74   %1 = and <4 x i64> %a, %m
75   %2 = xor <4 x i64> %m, <i64 -1, i64 -1, i64 -1, i64 -1>
76   %3 = and <4 x i64> %b, %2
77   %4 = or <4 x i64> %1, %3
78   ret <4 x i64> %4
81 define <2 x i64> @pcmov_2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %m) {
82 ; CHECK-LABEL: pcmov_2i64:
83 ; CHECK:       # %bb.0:
84 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
85 ; CHECK-NEXT:    retq
86   %1 = and <2 x i64> %a, %m
87   %2 = xor <2 x i64> %m, <i64 -1, i64 -1>
88   %3 = and <2 x i64> %b, %2
89   %4 = or <2 x i64> %1, %3
90   ret <2 x i64> %4
93 define <8 x i32> @pcmov_8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32> %m) {
94 ; CHECK-LABEL: pcmov_8i32:
95 ; CHECK:       # %bb.0:
96 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
97 ; CHECK-NEXT:    retq
98   %1 = and <8 x i32> %a, %m
99   %2 = xor <8 x i32> %m, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
100   %3 = and <8 x i32> %b, %2
101   %4 = or <8 x i32> %1, %3
102   ret <8 x i32> %4
105 define <4 x i32> @pcmov_4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %m) {
106 ; CHECK-LABEL: pcmov_4i32:
107 ; CHECK:       # %bb.0:
108 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
109 ; CHECK-NEXT:    retq
110   %1 = and <4 x i32> %a, %m
111   %2 = xor <4 x i32> %m, <i32 -1, i32 -1, i32 -1, i32 -1>
112   %3 = and <4 x i32> %b, %2
113   %4 = or <4 x i32> %1, %3
114   ret <4 x i32> %4
117 define <16 x i16> @pcmov_16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16> %m) {
118 ; CHECK-LABEL: pcmov_16i16:
119 ; CHECK:       # %bb.0:
120 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
121 ; CHECK-NEXT:    retq
122   %1 = and <16 x i16> %a, %m
123   %2 = xor <16 x i16> %m, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
124   %3 = and <16 x i16> %b, %2
125   %4 = or <16 x i16> %1, %3
126   ret <16 x i16> %4
129 define <8 x i16> @pcmov_8i16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %m) {
130 ; CHECK-LABEL: pcmov_8i16:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
133 ; CHECK-NEXT:    retq
134   %1 = and <8 x i16> %a, %m
135   %2 = xor <8 x i16> %m, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
136   %3 = and <8 x i16> %b, %2
137   %4 = or <8 x i16> %1, %3
138   ret <8 x i16> %4
141 define <32 x i8> @pcmov_32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %m) {
142 ; CHECK-LABEL: pcmov_32i8:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
145 ; CHECK-NEXT:    retq
146   %1 = and <32 x i8> %a, %m
147   %2 = xor <32 x i8> %m, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
148   %3 = and <32 x i8> %b, %2
149   %4 = or <32 x i8> %1, %3
150   ret <32 x i8> %4
153 define <16 x i8> @pcmov_16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %m) {
154 ; CHECK-LABEL: pcmov_16i8:
155 ; CHECK:       # %bb.0:
156 ; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
157 ; CHECK-NEXT:    retq
158   %1 = and <16 x i8> %a, %m
159   %2 = xor <16 x i8> %m, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
160   %3 = and <16 x i8> %b, %2
161   %4 = or <16 x i8> %1, %3
162   ret <16 x i8> %4