xref: /llvm-project/llvm/test/CodeGen/X86/combine-select.ll (revision 5439b3d1e5b62892651b82417d8adca10b4651a7)
1a010b3c9SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2a010b3c9SCraig Topper; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
3a010b3c9SCraig Topper
4a010b3c9SCraig Topperdefine <4 x float> @select_mask_add_ss(<4 x float> %w, i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
5a010b3c9SCraig Topper; CHECK-LABEL: select_mask_add_ss:
6a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
796062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
896062eaaSAlexander Ivchenko; CHECK-NEXT:    vaddss %xmm2, %xmm1, %xmm0 {%k1}
9a010b3c9SCraig Topper; CHECK-NEXT:    retq
10a010b3c9SCraig Topperentry:
11a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
12a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
13a010b3c9SCraig Topper  %2 = fadd float %1, %0
14a010b3c9SCraig Topper  %3 = and i8 %u, 1
15a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
16a010b3c9SCraig Topper  %5 = extractelement <4 x float> %w, i32 0
17a010b3c9SCraig Topper  %6 = select i1 %4, float %5, float %2
18a010b3c9SCraig Topper  %7 = insertelement <4 x float> %a, float %6, i32 0
19a010b3c9SCraig Topper  ret <4 x float> %7
20a010b3c9SCraig Topper}
21a010b3c9SCraig Topper
22a010b3c9SCraig Topperdefine <4 x float> @select_maskz_add_ss(i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
23a010b3c9SCraig Topper; CHECK-LABEL: select_maskz_add_ss:
24a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
2596062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
2696062eaaSAlexander Ivchenko; CHECK-NEXT:    vaddss %xmm1, %xmm0, %xmm0 {%k1} {z}
27a010b3c9SCraig Topper; CHECK-NEXT:    retq
28a010b3c9SCraig Topperentry:
29a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
30a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
31a010b3c9SCraig Topper  %2 = fadd float %1, %0
32a010b3c9SCraig Topper  %3 = and i8 %u, 1
33a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
34a010b3c9SCraig Topper  %5 = select i1 %4, float 0.000000e+00, float %2
35a010b3c9SCraig Topper  %6 = insertelement <4 x float> %a, float %5, i32 0
36a010b3c9SCraig Topper  ret <4 x float> %6
37a010b3c9SCraig Topper}
38a010b3c9SCraig Topper
39a010b3c9SCraig Topperdefine <4 x float> @select_mask_sub_ss(<4 x float> %w, i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
40a010b3c9SCraig Topper; CHECK-LABEL: select_mask_sub_ss:
41a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
4296062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
4396062eaaSAlexander Ivchenko; CHECK-NEXT:    vsubss %xmm2, %xmm1, %xmm0 {%k1}
44a010b3c9SCraig Topper; CHECK-NEXT:    retq
45a010b3c9SCraig Topperentry:
46a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
47a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
48a010b3c9SCraig Topper  %2 = fsub float %1, %0
49a010b3c9SCraig Topper  %3 = and i8 %u, 1
50a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
51a010b3c9SCraig Topper  %5 = extractelement <4 x float> %w, i32 0
52a010b3c9SCraig Topper  %6 = select i1 %4, float %5, float %2
53a010b3c9SCraig Topper  %7 = insertelement <4 x float> %a, float %6, i32 0
54a010b3c9SCraig Topper  ret <4 x float> %7
55a010b3c9SCraig Topper}
56a010b3c9SCraig Topper
57a010b3c9SCraig Topperdefine <4 x float> @select_maskz_sub_ss(i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
58a010b3c9SCraig Topper; CHECK-LABEL: select_maskz_sub_ss:
59a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
6096062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
6196062eaaSAlexander Ivchenko; CHECK-NEXT:    vsubss %xmm1, %xmm0, %xmm0 {%k1} {z}
62a010b3c9SCraig Topper; CHECK-NEXT:    retq
63a010b3c9SCraig Topperentry:
64a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
65a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
66a010b3c9SCraig Topper  %2 = fsub float %1, %0
67a010b3c9SCraig Topper  %3 = and i8 %u, 1
68a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
69a010b3c9SCraig Topper  %5 = select i1 %4, float 0.000000e+00, float %2
70a010b3c9SCraig Topper  %6 = insertelement <4 x float> %a, float %5, i32 0
71a010b3c9SCraig Topper  ret <4 x float> %6
72a010b3c9SCraig Topper}
73a010b3c9SCraig Topper
74a010b3c9SCraig Topperdefine <4 x float> @select_mask_mul_ss(<4 x float> %w, i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
75a010b3c9SCraig Topper; CHECK-LABEL: select_mask_mul_ss:
76a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
7796062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
7896062eaaSAlexander Ivchenko; CHECK-NEXT:    vmulss %xmm2, %xmm1, %xmm0 {%k1}
79a010b3c9SCraig Topper; CHECK-NEXT:    retq
80a010b3c9SCraig Topperentry:
81a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
82a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
83a010b3c9SCraig Topper  %2 = fmul float %1, %0
84a010b3c9SCraig Topper  %3 = and i8 %u, 1
85a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
86a010b3c9SCraig Topper  %5 = extractelement <4 x float> %w, i32 0
87a010b3c9SCraig Topper  %6 = select i1 %4, float %5, float %2
88a010b3c9SCraig Topper  %7 = insertelement <4 x float> %a, float %6, i32 0
89a010b3c9SCraig Topper  ret <4 x float> %7
90a010b3c9SCraig Topper}
91a010b3c9SCraig Topper
92a010b3c9SCraig Topperdefine <4 x float> @select_maskz_mul_ss(i8 zeroext %u, <4 x float> %a, <4 x float> %b) {
93a010b3c9SCraig Topper; CHECK-LABEL: select_maskz_mul_ss:
94a010b3c9SCraig Topper; CHECK:       ## %bb.0: ## %entry
9596062eaaSAlexander Ivchenko; CHECK-NEXT:    kmovw %edi, %k1
9696062eaaSAlexander Ivchenko; CHECK-NEXT:    vmulss %xmm1, %xmm0, %xmm0 {%k1} {z}
97a010b3c9SCraig Topper; CHECK-NEXT:    retq
98a010b3c9SCraig Topperentry:
99a010b3c9SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
100a010b3c9SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
101a010b3c9SCraig Topper  %2 = fmul float %1, %0
102a010b3c9SCraig Topper  %3 = and i8 %u, 1
103a010b3c9SCraig Topper  %4 = icmp eq i8 %3, 0
104a010b3c9SCraig Topper  %5 = select i1 %4, float 0.000000e+00, float %2
105a010b3c9SCraig Topper  %6 = insertelement <4 x float> %a, float %5, i32 0
106a010b3c9SCraig Topper  ret <4 x float> %6
107a010b3c9SCraig Topper}
108*5439b3d1SCraig Topper
109*5439b3d1SCraig Topper; Make sure we don't crash trying to truncate the and instruction i4->i8. We need to extend instead.
110*5439b3d1SCraig Topperdefine <4 x float> @select_mask_add_ss_small_mask_type(<4 x float> %w, i4 %u, <4 x float> %a, <4 x float> %b) {
111*5439b3d1SCraig Topper; CHECK-LABEL: select_mask_add_ss_small_mask_type:
112*5439b3d1SCraig Topper; CHECK:       ## %bb.0: ## %entry
113*5439b3d1SCraig Topper; CHECK-NEXT:    kmovw %edi, %k1
114*5439b3d1SCraig Topper; CHECK-NEXT:    vaddss %xmm2, %xmm1, %xmm0 {%k1}
115*5439b3d1SCraig Topper; CHECK-NEXT:    retq
116*5439b3d1SCraig Topperentry:
117*5439b3d1SCraig Topper  %0 = extractelement <4 x float> %b, i32 0
118*5439b3d1SCraig Topper  %1 = extractelement <4 x float> %a, i32 0
119*5439b3d1SCraig Topper  %2 = fadd float %1, %0
120*5439b3d1SCraig Topper  %3 = and i4 %u, 1
121*5439b3d1SCraig Topper  %4 = icmp eq i4 %3, 0
122*5439b3d1SCraig Topper  %5 = extractelement <4 x float> %w, i32 0
123*5439b3d1SCraig Topper  %6 = select i1 %4, float %5, float %2
124*5439b3d1SCraig Topper  %7 = insertelement <4 x float> %a, float %6, i32 0
125*5439b3d1SCraig Topper  ret <4 x float> %7
126*5439b3d1SCraig Topper}
127*5439b3d1SCraig Topper
128