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