1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx | FileCheck -check-prefix=X32 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-win32 -mattr=+avx | FileCheck -check-prefix=X32 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+avx | FileCheck -check-prefix=WIN64 %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck -check-prefix=X64 %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare <16 x float> @func_float16_ptr(<16 x float>, <16 x float> *) 7*9880d681SAndroid Build Coastguard Workerdeclare <16 x float> @func_float16(<16 x float>, <16 x float>) 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @func_int(i32, i32) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: testf16_inp 11*9880d681SAndroid Build Coastguard Worker; WIN64: vaddps {{.*}}, {{%ymm[0-1]}} 12*9880d681SAndroid Build Coastguard Worker; WIN64: vaddps {{.*}}, {{%ymm[0-1]}} 13*9880d681SAndroid Build Coastguard Worker; WIN64: leaq {{.*}}(%rsp), %rcx 14*9880d681SAndroid Build Coastguard Worker; WIN64: call 15*9880d681SAndroid Build Coastguard Worker; WIN64: ret 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; X32-LABEL: testf16_inp 18*9880d681SAndroid Build Coastguard Worker; X32: vaddps {{.*}}, {{%ymm[0-1]}} 19*9880d681SAndroid Build Coastguard Worker; X32: vaddps {{.*}}, {{%ymm[0-1]}} 20*9880d681SAndroid Build Coastguard Worker; Push is not deemed profitable if we're realigning the stack. 21*9880d681SAndroid Build Coastguard Worker; X32: {{pushl|movl}} %eax 22*9880d681SAndroid Build Coastguard Worker; X32: call 23*9880d681SAndroid Build Coastguard Worker; X32: ret 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; X64-LABEL: testf16_inp 26*9880d681SAndroid Build Coastguard Worker; X64: vaddps {{.*}}, {{%ymm[0-1]}} 27*9880d681SAndroid Build Coastguard Worker; X64: vaddps {{.*}}, {{%ymm[0-1]}} 28*9880d681SAndroid Build Coastguard Worker; X64: leaq {{.*}}(%rsp), %rdi 29*9880d681SAndroid Build Coastguard Worker; X64: call 30*9880d681SAndroid Build Coastguard Worker; X64: ret 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker;test calling conventions - input parameters 33*9880d681SAndroid Build Coastguard Workerdefine <16 x float> @testf16_inp(<16 x float> %a, <16 x float> %b) nounwind { 34*9880d681SAndroid Build Coastguard Worker %y = alloca <16 x float>, align 16 35*9880d681SAndroid Build Coastguard Worker %x = fadd <16 x float> %a, %b 36*9880d681SAndroid Build Coastguard Worker %1 = call intel_ocl_bicc <16 x float> @func_float16_ptr(<16 x float> %x, <16 x float>* %y) 37*9880d681SAndroid Build Coastguard Worker %2 = load <16 x float>, <16 x float>* %y, align 16 38*9880d681SAndroid Build Coastguard Worker %3 = fadd <16 x float> %2, %1 39*9880d681SAndroid Build Coastguard Worker ret <16 x float> %3 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker;test calling conventions - preserved registers 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; preserved ymm6-ymm15 45*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: testf16_regs 46*9880d681SAndroid Build Coastguard Worker; WIN64: call 47*9880d681SAndroid Build Coastguard Worker; WIN64: vaddps {{%ymm[6-7]}}, {{%ymm[0-1]}}, {{%ymm[0-1]}} 48*9880d681SAndroid Build Coastguard Worker; WIN64: vaddps {{%ymm[6-7]}}, {{%ymm[0-1]}}, {{%ymm[0-1]}} 49*9880d681SAndroid Build Coastguard Worker; WIN64: ret 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; preserved ymm8-ymm15 52*9880d681SAndroid Build Coastguard Worker; X64-LABEL: testf16_regs 53*9880d681SAndroid Build Coastguard Worker; X64: call 54*9880d681SAndroid Build Coastguard Worker; X64: vaddps {{%ymm[8-9]}}, {{%ymm[0-1]}}, {{%ymm[0-1]}} 55*9880d681SAndroid Build Coastguard Worker; X64: vaddps {{%ymm[8-9]}}, {{%ymm[0-1]}}, {{%ymm[0-1]}} 56*9880d681SAndroid Build Coastguard Worker; X64: ret 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine <16 x float> @testf16_regs(<16 x float> %a, <16 x float> %b) nounwind { 59*9880d681SAndroid Build Coastguard Worker %y = alloca <16 x float>, align 16 60*9880d681SAndroid Build Coastguard Worker %x = fadd <16 x float> %a, %b 61*9880d681SAndroid Build Coastguard Worker %1 = call intel_ocl_bicc <16 x float> @func_float16_ptr(<16 x float> %x, <16 x float>* %y) 62*9880d681SAndroid Build Coastguard Worker %2 = load <16 x float>, <16 x float>* %y, align 16 63*9880d681SAndroid Build Coastguard Worker %3 = fadd <16 x float> %1, %b 64*9880d681SAndroid Build Coastguard Worker %4 = fadd <16 x float> %2, %3 65*9880d681SAndroid Build Coastguard Worker ret <16 x float> %4 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; test calling conventions - prolog and epilog 69*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: test_prolog_epilog 70*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 71*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 72*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 73*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 74*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 75*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 76*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 77*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 78*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 79*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{%ymm([6-9]|1[0-5])}}, {{.*(%rbp).*}} # 32-byte Spill 80*9880d681SAndroid Build Coastguard Worker; WIN64: call 81*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 82*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 83*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 84*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 85*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 86*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 87*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 88*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 89*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 90*9880d681SAndroid Build Coastguard Worker; WIN64: vmovaps {{.*(%rbp).*}}, {{%ymm([6-9]|1[0-5])}} # 32-byte Reload 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_prolog_epilog 93*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 94*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 95*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 96*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 97*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 98*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 99*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 100*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{%ymm([8-9]|1[0-5])}}, {{.*}}(%rsp) ## 32-byte Spill 101*9880d681SAndroid Build Coastguard Worker; X64: call 102*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 103*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 104*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 105*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 106*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 107*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 108*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 109*9880d681SAndroid Build Coastguard Worker; X64: vmovups {{.*}}(%rsp), {{%ymm([8-9]|1[0-5])}} ## 32-byte Reload 110*9880d681SAndroid Build Coastguard Workerdefine intel_ocl_bicc <16 x float> @test_prolog_epilog(<16 x float> %a, <16 x float> %b) nounwind { 111*9880d681SAndroid Build Coastguard Worker %c = call <16 x float> @func_float16(<16 x float> %a, <16 x float> %b) 112*9880d681SAndroid Build Coastguard Worker ret <16 x float> %c 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; test functions with integer parameters 116*9880d681SAndroid Build Coastguard Worker; pass parameters on stack for 32-bit platform 117*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_int 118*9880d681SAndroid Build Coastguard Worker; X32: pushl {{.*}} 119*9880d681SAndroid Build Coastguard Worker; X32: pushl {{.*}} 120*9880d681SAndroid Build Coastguard Worker; X32: call 121*9880d681SAndroid Build Coastguard Worker; X32: addl {{.*}}, %eax 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; pass parameters in registers for 64-bit platform 124*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_int 125*9880d681SAndroid Build Coastguard Worker; X64: leal {{.*}}, %edi 126*9880d681SAndroid Build Coastguard Worker; X64: movl {{.*}}, %esi 127*9880d681SAndroid Build Coastguard Worker; X64: call 128*9880d681SAndroid Build Coastguard Worker; X64: addl {{.*}}, %eax 129*9880d681SAndroid Build Coastguard Workerdefine i32 @test_int(i32 %a, i32 %b) nounwind { 130*9880d681SAndroid Build Coastguard Worker %c1 = add i32 %a, %b 131*9880d681SAndroid Build Coastguard Worker %c2 = call intel_ocl_bicc i32 @func_int(i32 %c1, i32 %a) 132*9880d681SAndroid Build Coastguard Worker %c = add i32 %c2, %b 133*9880d681SAndroid Build Coastguard Worker ret i32 %c 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: test_float4 137*9880d681SAndroid Build Coastguard Worker; WIN64-NOT: vzeroupper 138*9880d681SAndroid Build Coastguard Worker; WIN64: call 139*9880d681SAndroid Build Coastguard Worker; WIN64-NOT: vzeroupper 140*9880d681SAndroid Build Coastguard Worker; WIN64: call 141*9880d681SAndroid Build Coastguard Worker; WIN64: ret 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_float4 144*9880d681SAndroid Build Coastguard Worker; X64-NOT: vzeroupper 145*9880d681SAndroid Build Coastguard Worker; X64: call 146*9880d681SAndroid Build Coastguard Worker; X64-NOT: vzeroupper 147*9880d681SAndroid Build Coastguard Worker; X64: call 148*9880d681SAndroid Build Coastguard Worker; X64: ret 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_float4 151*9880d681SAndroid Build Coastguard Worker; X32: vzeroupper 152*9880d681SAndroid Build Coastguard Worker; X32: call 153*9880d681SAndroid Build Coastguard Worker; X32: vzeroupper 154*9880d681SAndroid Build Coastguard Worker; X32: call 155*9880d681SAndroid Build Coastguard Worker; X32: ret 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @func_float4(<4 x float>, <4 x float>, <4 x float>) 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test_float4(<8 x float> %a, <8 x float> %b, <8 x float> %c) nounwind readnone { 160*9880d681SAndroid Build Coastguard Workerentry: 161*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 162*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x float> %b, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 163*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x float> %c, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 164*9880d681SAndroid Build Coastguard Worker %call.i = tail call intel_ocl_bicc <4 x float> @func_float4(<4 x float> %0, <4 x float> %1, <4 x float> %2) nounwind 165*9880d681SAndroid Build Coastguard Worker %3 = shufflevector <4 x float> %call.i, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> 166*9880d681SAndroid Build Coastguard Worker %4 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 167*9880d681SAndroid Build Coastguard Worker %5 = shufflevector <8 x float> %b, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 168*9880d681SAndroid Build Coastguard Worker %6 = shufflevector <8 x float> %c, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 169*9880d681SAndroid Build Coastguard Worker %call.i2 = tail call intel_ocl_bicc <4 x float> @func_float4(<4 x float> %4, <4 x float> %5, <4 x float> %6) nounwind 170*9880d681SAndroid Build Coastguard Worker %7 = shufflevector <4 x float> %call.i2, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> 171*9880d681SAndroid Build Coastguard Worker %8 = shufflevector <8 x float> %3, <8 x float> %7, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11> 172*9880d681SAndroid Build Coastguard Worker ret <8 x float> %8 173*9880d681SAndroid Build Coastguard Worker} 174