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-unknown-unknown -mattr=+sse2 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1) 5*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) 6*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @footz(<2 x i64> %a) nounwind { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: footz: 10*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsfq %rax, %rax 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm1 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsfq %rax, %rax 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm0 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 21*9880d681SAndroid Build Coastguard Worker %c = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a, i1 true) 22*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %c 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foolz(<2 x i64> %a) nounwind { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foolz: 27*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsrq %rax, %rax 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorq $63, %rax 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm1 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsrq %rax, %rax 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorq $63, %rax 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm0 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 40*9880d681SAndroid Build Coastguard Worker %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true) 41*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %c 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foopop(<2 x i64> %a) nounwind { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foopop: 47*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm1 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $1, %xmm1 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm1 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psubq %xmm1, %xmm0 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323] 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm2 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand %xmm1, %xmm2 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $2, %xmm0 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand %xmm1, %xmm0 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddq %xmm2, %xmm0 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm1 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $4, %xmm1 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddq %xmm0, %xmm1 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm1 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm0, %xmm0 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psadbw %xmm0, %xmm1 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 66*9880d681SAndroid Build Coastguard Worker %c = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a) 67*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %c 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1) 71*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) 72*9880d681SAndroid Build Coastguard Workerdeclare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>) 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @promtz(<2 x i32> %a) nounwind { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: promtz: 76*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por {{.*}}(%rip), %xmm0 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsfq %rax, %rax 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $64, %ecx 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmoveq %rcx, %rax 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm1 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsfq %rax, %rax 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmoveq %rcx, %rax 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm0 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 91*9880d681SAndroid Build Coastguard Worker %c = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false) 92*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %c 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @promlz(<2 x i32> %a) nounwind { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: promlz: 97*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm0 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsrq %rax, %rax 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $127, %ecx 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmoveq %rcx, %rax 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorq $63, %rax 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm1 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm0, %rax 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bsrq %rax, %rax 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmoveq %rcx, %rax 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorq $63, %rax 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %rax, %xmm0 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psubq {{.*}}(%rip), %xmm1 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 115*9880d681SAndroid Build Coastguard Worker %c = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) 116*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %c 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @prompop(<2 x i32> %a) nounwind { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: prompop: 122*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm0 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm2, %xmm2 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm1 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $1, %xmm1 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm1 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psubq %xmm1, %xmm0 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323] 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm3 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand %xmm1, %xmm3 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $2, %xmm0 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand %xmm1, %xmm0 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddq %xmm3, %xmm0 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm1 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $4, %xmm1 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddq %xmm0, %xmm1 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pand {{.*}}(%rip), %xmm1 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psadbw %xmm2, %xmm1 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 142*9880d681SAndroid Build Coastguard Worker %c = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a) 143*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %c 144*9880d681SAndroid Build Coastguard Worker} 145