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 --check-prefix=ALL --check-prefix=KNL 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=ALL --check-prefix=SKX 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine double @test1(double %a, double %b) nounwind { 6*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test1: 7*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 8*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vucomisd %xmm1, %xmm0 9*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jne LBB0_1 10*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jnp LBB0_2 11*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB0_1: ## %l1 12*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vsubsd %xmm1, %xmm0, %xmm0 13*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 14*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB0_2: ## %l2 15*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vaddsd %xmm1, %xmm0, %xmm0 16*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 17*9880d681SAndroid Build Coastguard Worker %tobool = fcmp une double %a, %b 18*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %l1, label %l2 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerl1: 21*9880d681SAndroid Build Coastguard Worker %c = fsub double %a, %b 22*9880d681SAndroid Build Coastguard Worker ret double %c 23*9880d681SAndroid Build Coastguard Workerl2: 24*9880d681SAndroid Build Coastguard Worker %c1 = fadd double %a, %b 25*9880d681SAndroid Build Coastguard Worker ret double %c1 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine float @test2(float %a, float %b) nounwind { 29*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test2: 30*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 31*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vucomiss %xmm0, %xmm1 32*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jbe LBB1_2 33*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: ## BB#1: ## %l1 34*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vsubss %xmm1, %xmm0, %xmm0 35*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 36*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB1_2: ## %l2 37*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vaddss %xmm1, %xmm0, %xmm0 38*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 39*9880d681SAndroid Build Coastguard Worker %tobool = fcmp olt float %a, %b 40*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %l1, label %l2 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerl1: 43*9880d681SAndroid Build Coastguard Worker %c = fsub float %a, %b 44*9880d681SAndroid Build Coastguard Worker ret float %c 45*9880d681SAndroid Build Coastguard Workerl2: 46*9880d681SAndroid Build Coastguard Worker %c1 = fadd float %a, %b 47*9880d681SAndroid Build Coastguard Worker ret float %c1 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; FIXME: Can use vcmpeqss and extract from the mask here in AVX512. 51*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(float %a, float %b) { 52*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test3: 53*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 54*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vucomiss %xmm1, %xmm0 55*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: setnp %al 56*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: sete %cl 57*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: andb %al, %cl 58*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movzbl %cl, %eax 59*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker %cmp10.i = fcmp oeq float %a, %b 62*9880d681SAndroid Build Coastguard Worker %conv11.i = zext i1 %cmp10.i to i32 63*9880d681SAndroid Build Coastguard Worker ret i32 %conv11.i 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine float @test5(float %p) #0 { 67*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test5: 68*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: ## %entry 69*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vxorps %xmm1, %xmm1, %xmm1 70*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vucomiss %xmm1, %xmm0 71*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jne LBB3_1 72*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jnp LBB3_2 73*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB3_1: ## %if.end 74*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: seta %al 75*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movzbl %al, %eax 76*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: leaq {{.*}}(%rip), %rcx 77*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 78*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB3_2: ## %return 79*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 80*9880d681SAndroid Build Coastguard Workerentry: 81*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %p, 0.000000e+00 82*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %if.end 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 85*9880d681SAndroid Build Coastguard Worker %cmp1 = fcmp ogt float %p, 0.000000e+00 86*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp1, float 1.000000e+00, float -1.000000e+00 87*9880d681SAndroid Build Coastguard Worker br label %return 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end, %entry 90*9880d681SAndroid Build Coastguard Worker %retval.0 = phi float [ %cond, %if.end ], [ %p, %entry ] 91*9880d681SAndroid Build Coastguard Worker ret float %retval.0 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %a, i32 %b) { 95*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test6: 96*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 97*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: xorl %eax, %eax 98*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmpl %esi, %edi 99*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: sete %al 100*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 101*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %a, %b 102*9880d681SAndroid Build Coastguard Worker %res = zext i1 %cmp to i32 103*9880d681SAndroid Build Coastguard Worker ret i32 %res 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(double %x, double %y) #2 { 107*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test7: 108*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: ## %entry 109*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: xorl %eax, %eax 110*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vucomisd %xmm1, %xmm0 111*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: setne %al 112*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker %0 = fcmp one double %x, %y 115*9880d681SAndroid Build Coastguard Worker %or = zext i1 %0 to i32 116*9880d681SAndroid Build Coastguard Worker ret i32 %or 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %a1, i32 %a2, i32 %a3) { 120*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test8: 121*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 122*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: testl %edx, %edx 123*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movl $1, %eax 124*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmovel %eax, %edx 125*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmpl $-2147483648, %esi ## imm = 0x80000000 126*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmovnel %edx, %eax 127*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmpl $-1, %edi 128*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmovnel %edx, %eax 129*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 130*9880d681SAndroid Build Coastguard Worker %tmp1 = icmp eq i32 %a1, -1 131*9880d681SAndroid Build Coastguard Worker %tmp2 = icmp eq i32 %a2, -2147483648 132*9880d681SAndroid Build Coastguard Worker %tmp3 = and i1 %tmp1, %tmp2 133*9880d681SAndroid Build Coastguard Worker %tmp4 = icmp eq i32 %a3, 0 134*9880d681SAndroid Build Coastguard Worker %tmp5 = or i1 %tmp3, %tmp4 135*9880d681SAndroid Build Coastguard Worker %res = select i1 %tmp5, i32 1, i32 %a3 136*9880d681SAndroid Build Coastguard Worker ret i32 %res 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i64 %a) { 140*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test9: 141*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 142*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: testb $1, %dil 143*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: jne LBB7_2 144*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: ## BB#1: ## %A 145*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movl $6, %eax 146*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 147*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB7_2: ## %B 148*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movl $7, %eax 149*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 150*9880d681SAndroid Build Coastguard Worker %b = and i64 %a, 1 151*9880d681SAndroid Build Coastguard Worker %cmp10.i = icmp eq i64 %b, 0 152*9880d681SAndroid Build Coastguard Worker br i1 %cmp10.i, label %A, label %B 153*9880d681SAndroid Build Coastguard WorkerA: 154*9880d681SAndroid Build Coastguard Worker ret i32 6 155*9880d681SAndroid Build Coastguard WorkerB: 156*9880d681SAndroid Build Coastguard Worker ret i32 7 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i64 %b, i64 %c, i1 %d) { 160*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test10: 161*9880d681SAndroid Build Coastguard Worker; ALL: ## BB#0: 162*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: andl $1, %edx 163*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: kmovw %edx, %k0 164*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: cmpq %rsi, %rdi 165*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: sete %al 166*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: kmovw %eax, %k1 167*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: korw %k1, %k0, %k1 168*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: kxorw %k1, %k0, %k0 169*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: kmovw %k0, %eax 170*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: testb %al, %al 171*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: je LBB8_1 172*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: ## BB#2: ## %if.end.i 173*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movl $6, %eax 174*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 175*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: LBB8_1: ## %if.then.i 176*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movl $5, %eax 177*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker %cmp8.i = icmp eq i64 %b, %c 180*9880d681SAndroid Build Coastguard Worker %or1 = or i1 %d, %cmp8.i 181*9880d681SAndroid Build Coastguard Worker %xor1 = xor i1 %d, %or1 182*9880d681SAndroid Build Coastguard Worker br i1 %xor1, label %if.end.i, label %if.then.i 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerif.then.i: 185*9880d681SAndroid Build Coastguard Worker ret i32 5 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerif.end.i: 188*9880d681SAndroid Build Coastguard Worker ret i32 6 189*9880d681SAndroid Build Coastguard Worker} 190