1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @select00(i32 %a, <16 x i32> %b) nounwind { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select00: 6*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpxord %zmm1, %zmm1, %zmm1 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl $255, %edi 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je LBB0_2 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ## BB#1: 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovaps %zmm0, %zmm1 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: LBB0_2: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpxord %zmm1, %zmm0, %zmm0 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 15*9880d681SAndroid Build Coastguard Worker %cmpres = icmp eq i32 %a, 255 16*9880d681SAndroid Build Coastguard Worker %selres = select i1 %cmpres, <16 x i32> zeroinitializer, <16 x i32> %b 17*9880d681SAndroid Build Coastguard Worker %res = xor <16 x i32> %b, %selres 18*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %res 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @select01(i32 %a, <8 x i64> %b) nounwind { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select01: 23*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpxord %zmm1, %zmm1, %zmm1 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl $255, %edi 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je LBB1_2 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ## BB#1: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovaps %zmm0, %zmm1 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: LBB1_2: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vpxorq %zmm1, %zmm0, %zmm0 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 32*9880d681SAndroid Build Coastguard Worker %cmpres = icmp eq i32 %a, 255 33*9880d681SAndroid Build Coastguard Worker %selres = select i1 %cmpres, <8 x i64> zeroinitializer, <8 x i64> %b 34*9880d681SAndroid Build Coastguard Worker %res = xor <8 x i64> %b, %selres 35*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %res 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine float @select02(float %a, float %b, float %c, float %eps) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select02: 40*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcmpless %xmm0, %xmm3, %k1 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %xmm2, %xmm0, %xmm1 {%k1} 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovaps %zmm1, %zmm0 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 45*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge float %a, %eps 46*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, float %c, float %b 47*9880d681SAndroid Build Coastguard Worker ret float %cond 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine double @select03(double %a, double %b, double %c, double %eps) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select03: 52*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vcmplesd %xmm0, %xmm3, %k1 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovsd %xmm2, %xmm0, %xmm1 {%k1} 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovaps %zmm1, %zmm0 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 57*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge double %a, %eps 58*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, double %c, double %b 59*9880d681SAndroid Build Coastguard Worker ret double %cond 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine <16 x double> @select04(<16 x double> %a, <16 x double> %b) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select04: 64*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovaps %zmm3, %zmm1 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 67*9880d681SAndroid Build Coastguard Worker %sel = select <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x double> %a, <16 x double> %b 68*9880d681SAndroid Build Coastguard Worker ret <16 x double> %sel 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i8 @select05(i8 %a.0, i8 %m) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select05: 73*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orl %esi, %edi 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edi, %eax 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 77*9880d681SAndroid Build Coastguard Worker %mask = bitcast i8 %m to <8 x i1> 78*9880d681SAndroid Build Coastguard Worker %a = bitcast i8 %a.0 to <8 x i1> 79*9880d681SAndroid Build Coastguard Worker %r = select <8 x i1> %mask, <8 x i1> <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>, <8 x i1> %a 80*9880d681SAndroid Build Coastguard Worker %res = bitcast <8 x i1> %r to i8 81*9880d681SAndroid Build Coastguard Worker ret i8 %res; 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine i8 @select05_mem(<8 x i1>* %a.0, <8 x i1>* %m) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select05_mem: 86*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl (%rsi), %eax 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %eax, %k0 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl (%rdi), %eax 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %eax, %k1 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: korw %k1, %k0, %k0 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %k0, %eax 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 95*9880d681SAndroid Build Coastguard Worker %mask = load <8 x i1> , <8 x i1>* %m 96*9880d681SAndroid Build Coastguard Worker %a = load <8 x i1> , <8 x i1>* %a.0 97*9880d681SAndroid Build Coastguard Worker %r = select <8 x i1> %mask, <8 x i1> <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>, <8 x i1> %a 98*9880d681SAndroid Build Coastguard Worker %res = bitcast <8 x i1> %r to i8 99*9880d681SAndroid Build Coastguard Worker ret i8 %res; 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine i8 @select06(i8 %a.0, i8 %m) { 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select06: 104*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andl %esi, %edi 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %edi, %eax 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 108*9880d681SAndroid Build Coastguard Worker %mask = bitcast i8 %m to <8 x i1> 109*9880d681SAndroid Build Coastguard Worker %a = bitcast i8 %a.0 to <8 x i1> 110*9880d681SAndroid Build Coastguard Worker %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> zeroinitializer 111*9880d681SAndroid Build Coastguard Worker %res = bitcast <8 x i1> %r to i8 112*9880d681SAndroid Build Coastguard Worker ret i8 %res; 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine i8 @select06_mem(<8 x i1>* %a.0, <8 x i1>* %m) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select06_mem: 117*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl (%rsi), %eax 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %eax, %k0 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movzbl (%rdi), %eax 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %eax, %k1 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kandw %k1, %k0, %k0 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %k0, %eax 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 126*9880d681SAndroid Build Coastguard Worker %mask = load <8 x i1> , <8 x i1>* %m 127*9880d681SAndroid Build Coastguard Worker %a = load <8 x i1> , <8 x i1>* %a.0 128*9880d681SAndroid Build Coastguard Worker %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> zeroinitializer 129*9880d681SAndroid Build Coastguard Worker %res = bitcast <8 x i1> %r to i8 130*9880d681SAndroid Build Coastguard Worker ret i8 %res; 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Workerdefine i8 @select07(i8 %a.0, i8 %b.0, i8 %m) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select07: 134*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %edx, %k0 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %edi, %k1 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %esi, %k2 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kandw %k0, %k1, %k1 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: knotw %k0, %k0 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kandw %k0, %k2, %k0 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: korw %k0, %k1, %k0 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: kmovw %k0, %eax 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ## kill: %AL<def> %AL<kill> %EAX<kill> 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 145*9880d681SAndroid Build Coastguard Worker %mask = bitcast i8 %m to <8 x i1> 146*9880d681SAndroid Build Coastguard Worker %a = bitcast i8 %a.0 to <8 x i1> 147*9880d681SAndroid Build Coastguard Worker %b = bitcast i8 %b.0 to <8 x i1> 148*9880d681SAndroid Build Coastguard Worker %r = select <8 x i1> %mask, <8 x i1> %a, <8 x i1> %b 149*9880d681SAndroid Build Coastguard Worker %res = bitcast <8 x i1> %r to i8 150*9880d681SAndroid Build Coastguard Worker ret i8 %res; 151*9880d681SAndroid Build Coastguard Worker} 152