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