|
3 | 3 | ; RUN: llc -mtriple=armv7-linux-gnueabi -mcpu=cortex-a8 < %s | FileCheck -check-prefix=GNUEABI %s |
4 | 4 | ; RUN: llc -mtriple=armv7-apple-ios6 -mcpu=cortex-a8 < %s | FileCheck -check-prefixes=IOS,IOS-NO-STRET %s |
5 | 5 | ; RUN: llc -mtriple=armv7-apple-ios7 -mcpu=cortex-a8 < %s | FileCheck -check-prefixes=IOS,IOS-WITH-STRET %s |
| 6 | +; RUN: llc -mtriple=thumbv7k-apple-watchos2.0 < %s | FileCheck -check-prefix=WATCHABI %s |
6 | 7 |
|
7 | 8 | define { half, half } @test_sincos_f16(half %a) { |
8 | 9 | ; GNU-LABEL: test_sincos_f16: |
@@ -75,6 +76,23 @@ define { half, half } @test_sincos_f16(half %a) { |
75 | 76 | ; IOS-WITH-STRET-NEXT: mov r0, r5 |
76 | 77 | ; IOS-WITH-STRET-NEXT: add sp, sp, #8 |
77 | 78 | ; IOS-WITH-STRET-NEXT: pop {r4, r5, pc} |
| 79 | +; |
| 80 | +; WATCHABI-LABEL: test_sincos_f16: |
| 81 | +; WATCHABI: .cfi_startproc |
| 82 | +; WATCHABI-NEXT: @ %bb.0: |
| 83 | +; WATCHABI-NEXT: push {r7, lr} |
| 84 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 85 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 86 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 87 | +; WATCHABI-NEXT: sub sp, #8 |
| 88 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 89 | +; WATCHABI-NEXT: vcvtb.f32.f16 s0, s0 |
| 90 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 91 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0 |
| 92 | +; WATCHABI-NEXT: vcvtb.f16.f32 s1, s1 |
| 93 | +; WATCHABI-NEXT: add sp, #8 |
| 94 | +; WATCHABI-NEXT: pop {r7, pc} |
| 95 | +; WATCHABI-NEXT: .cfi_endproc |
78 | 96 | %result = call { half, half } @llvm.sincos.f16(half %a) |
79 | 97 | ret { half, half } %result |
80 | 98 | } |
@@ -130,6 +148,22 @@ define half @test_sincos_f16_only_use_sin(half %a) { |
130 | 148 | ; IOS-WITH-STRET-NEXT: add sp, sp, #8 |
131 | 149 | ; IOS-WITH-STRET-NEXT: pop {lr} |
132 | 150 | ; IOS-WITH-STRET-NEXT: bx lr |
| 151 | +; |
| 152 | +; WATCHABI-LABEL: test_sincos_f16_only_use_sin: |
| 153 | +; WATCHABI: .cfi_startproc |
| 154 | +; WATCHABI-NEXT: @ %bb.0: |
| 155 | +; WATCHABI-NEXT: push {r7, lr} |
| 156 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 157 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 158 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 159 | +; WATCHABI-NEXT: sub sp, #8 |
| 160 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 161 | +; WATCHABI-NEXT: vcvtb.f32.f16 s0, s0 |
| 162 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 163 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0 |
| 164 | +; WATCHABI-NEXT: add sp, #8 |
| 165 | +; WATCHABI-NEXT: pop {r7, pc} |
| 166 | +; WATCHABI-NEXT: .cfi_endproc |
133 | 167 | %result = call { half, half } @llvm.sincos.f16(half %a) |
134 | 168 | %result.0 = extractvalue { half, half } %result, 0 |
135 | 169 | ret half %result.0 |
@@ -186,6 +220,22 @@ define half @test_sincos_f16_only_use_cos(half %a) { |
186 | 220 | ; IOS-WITH-STRET-NEXT: add sp, sp, #8 |
187 | 221 | ; IOS-WITH-STRET-NEXT: pop {lr} |
188 | 222 | ; IOS-WITH-STRET-NEXT: bx lr |
| 223 | +; |
| 224 | +; WATCHABI-LABEL: test_sincos_f16_only_use_cos: |
| 225 | +; WATCHABI: .cfi_startproc |
| 226 | +; WATCHABI-NEXT: @ %bb.0: |
| 227 | +; WATCHABI-NEXT: push {r7, lr} |
| 228 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 229 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 230 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 231 | +; WATCHABI-NEXT: sub sp, #8 |
| 232 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 233 | +; WATCHABI-NEXT: vcvtb.f32.f16 s0, s0 |
| 234 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 235 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s1 |
| 236 | +; WATCHABI-NEXT: add sp, #8 |
| 237 | +; WATCHABI-NEXT: pop {r7, pc} |
| 238 | +; WATCHABI-NEXT: .cfi_endproc |
189 | 239 | %result = call { half, half } @llvm.sincos.f16(half %a) |
190 | 240 | %result.1 = extractvalue { half, half } %result, 1 |
191 | 241 | ret half %result.1 |
@@ -366,6 +416,54 @@ define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) { |
366 | 416 | ; IOS-WITH-STRET-NEXT: add sp, sp, #24 |
367 | 417 | ; IOS-WITH-STRET-NEXT: vpop {d8} |
368 | 418 | ; IOS-WITH-STRET-NEXT: pop {r4, r5, pc} |
| 419 | +; |
| 420 | +; WATCHABI-LABEL: test_sincos_v2f16: |
| 421 | +; WATCHABI: .cfi_startproc |
| 422 | +; WATCHABI-NEXT: @ %bb.0: |
| 423 | +; WATCHABI-NEXT: push {r7, lr} |
| 424 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 425 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 426 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 427 | +; WATCHABI-NEXT: vpush {d10} |
| 428 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 429 | +; WATCHABI-NEXT: vpush {d8} |
| 430 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 24 |
| 431 | +; WATCHABI-NEXT: .cfi_offset d10, -16 |
| 432 | +; WATCHABI-NEXT: .cfi_offset d8, -24 |
| 433 | +; WATCHABI-NEXT: sub sp, #8 |
| 434 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 32 |
| 435 | +; WATCHABI-NEXT: vmov.f32 s16, s0 |
| 436 | +; WATCHABI-NEXT: vcvtb.f32.f16 s0, s1 |
| 437 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 438 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0 |
| 439 | +; WATCHABI-NEXT: vcvtb.f32.f16 s4, s16 |
| 440 | +; WATCHABI-NEXT: vmov r0, s0 |
| 441 | +; WATCHABI-NEXT: vmov.f32 s0, s4 |
| 442 | +; WATCHABI-NEXT: vmov.f32 s20, s1 |
| 443 | +; WATCHABI-NEXT: strh.w r0, [sp, #6] |
| 444 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 445 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0 |
| 446 | +; WATCHABI-NEXT: vmov r0, s0 |
| 447 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s20 |
| 448 | +; WATCHABI-NEXT: strh.w r0, [sp, #4] |
| 449 | +; WATCHABI-NEXT: add r0, sp, #4 |
| 450 | +; WATCHABI-NEXT: vld1.32 {d16[0]}, [r0:32] |
| 451 | +; WATCHABI-NEXT: vmov r0, s0 |
| 452 | +; WATCHABI-NEXT: vcvtb.f16.f32 s0, s1 |
| 453 | +; WATCHABI-NEXT: strh.w r0, [sp, #2] |
| 454 | +; WATCHABI-NEXT: vmov r0, s0 |
| 455 | +; WATCHABI-NEXT: vmovl.u16 q0, d16 |
| 456 | +; WATCHABI-NEXT: strh.w r0, [sp] |
| 457 | +; WATCHABI-NEXT: mov r0, sp |
| 458 | +; WATCHABI-NEXT: vld1.32 {d18[0]}, [r0:32] |
| 459 | +; WATCHABI-NEXT: vmovl.u16 q1, d18 |
| 460 | +; WATCHABI-NEXT: vmov.f32 s2, s4 |
| 461 | +; WATCHABI-NEXT: vmov.f32 s3, s5 |
| 462 | +; WATCHABI-NEXT: add sp, #8 |
| 463 | +; WATCHABI-NEXT: vpop {d8} |
| 464 | +; WATCHABI-NEXT: vpop {d10} |
| 465 | +; WATCHABI-NEXT: pop {r7, pc} |
| 466 | +; WATCHABI-NEXT: .cfi_endproc |
369 | 467 | %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a) |
370 | 468 | ret { <2 x half>, <2 x half> } %result |
371 | 469 | } |
@@ -416,6 +514,20 @@ define { float, float } @test_sincos_f32(float %a) { |
416 | 514 | ; IOS-WITH-STRET-NEXT: pop {r0, r1} |
417 | 515 | ; IOS-WITH-STRET-NEXT: pop {lr} |
418 | 516 | ; IOS-WITH-STRET-NEXT: bx lr |
| 517 | +; |
| 518 | +; WATCHABI-LABEL: test_sincos_f32: |
| 519 | +; WATCHABI: .cfi_startproc |
| 520 | +; WATCHABI-NEXT: @ %bb.0: |
| 521 | +; WATCHABI-NEXT: push {r7, lr} |
| 522 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 523 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 524 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 525 | +; WATCHABI-NEXT: sub sp, #8 |
| 526 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 527 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 528 | +; WATCHABI-NEXT: add sp, #8 |
| 529 | +; WATCHABI-NEXT: pop {r7, pc} |
| 530 | +; WATCHABI-NEXT: .cfi_endproc |
419 | 531 | %result = call { float, float } @llvm.sincos.f32(float %a) |
420 | 532 | ret { float, float } %result |
421 | 533 | } |
@@ -519,6 +631,33 @@ define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) { |
519 | 631 | ; IOS-WITH-STRET-NEXT: vpop {d8} |
520 | 632 | ; IOS-WITH-STRET-NEXT: pop {lr} |
521 | 633 | ; IOS-WITH-STRET-NEXT: bx lr |
| 634 | +; |
| 635 | +; WATCHABI-LABEL: test_sincos_v2f32: |
| 636 | +; WATCHABI: .cfi_startproc |
| 637 | +; WATCHABI-NEXT: @ %bb.0: |
| 638 | +; WATCHABI-NEXT: push {r7, lr} |
| 639 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 640 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 641 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 642 | +; WATCHABI-NEXT: vpush {d8, d9, d10} |
| 643 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 32 |
| 644 | +; WATCHABI-NEXT: .cfi_offset d10, -16 |
| 645 | +; WATCHABI-NEXT: .cfi_offset d9, -24 |
| 646 | +; WATCHABI-NEXT: .cfi_offset d8, -32 |
| 647 | +; WATCHABI-NEXT: vmov.f64 d8, d0 |
| 648 | +; WATCHABI-NEXT: vmov.f32 s0, s17 |
| 649 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 650 | +; WATCHABI-NEXT: vmov.f32 s19, s0 |
| 651 | +; WATCHABI-NEXT: vmov.f32 s0, s16 |
| 652 | +; WATCHABI-NEXT: vmov.f32 s21, s1 |
| 653 | +; WATCHABI-NEXT: bl ___sincosf_stret |
| 654 | +; WATCHABI-NEXT: vmov.f32 s20, s1 |
| 655 | +; WATCHABI-NEXT: vmov.f32 s18, s0 |
| 656 | +; WATCHABI-NEXT: vmov.f64 d1, d10 |
| 657 | +; WATCHABI-NEXT: vmov.f64 d0, d9 |
| 658 | +; WATCHABI-NEXT: vpop {d8, d9, d10} |
| 659 | +; WATCHABI-NEXT: pop {r7, pc} |
| 660 | +; WATCHABI-NEXT: .cfi_endproc |
522 | 661 | %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a) |
523 | 662 | ret { <2 x float>, <2 x float> } %result |
524 | 663 | } |
@@ -581,6 +720,20 @@ define { double, double } @test_sincos_f64(double %a) { |
581 | 720 | ; IOS-WITH-STRET-NEXT: add sp, sp, #16 |
582 | 721 | ; IOS-WITH-STRET-NEXT: pop {lr} |
583 | 722 | ; IOS-WITH-STRET-NEXT: bx lr |
| 723 | +; |
| 724 | +; WATCHABI-LABEL: test_sincos_f64: |
| 725 | +; WATCHABI: .cfi_startproc |
| 726 | +; WATCHABI-NEXT: @ %bb.0: |
| 727 | +; WATCHABI-NEXT: push {r7, lr} |
| 728 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 729 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 730 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 731 | +; WATCHABI-NEXT: sub sp, #8 |
| 732 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 16 |
| 733 | +; WATCHABI-NEXT: bl ___sincos_stret |
| 734 | +; WATCHABI-NEXT: add sp, #8 |
| 735 | +; WATCHABI-NEXT: pop {r7, pc} |
| 736 | +; WATCHABI-NEXT: .cfi_endproc |
584 | 737 | %result = call { double, double } @llvm.sincos.f64(double %a) |
585 | 738 | ret { double, double } %result |
586 | 739 | } |
@@ -692,6 +845,39 @@ define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) { |
692 | 845 | ; IOS-WITH-STRET-NEXT: vst1.32 {d18, d19}, [r6] |
693 | 846 | ; IOS-WITH-STRET-NEXT: add sp, sp, #32 |
694 | 847 | ; IOS-WITH-STRET-NEXT: pop {r4, r5, r6, pc} |
| 848 | +; |
| 849 | +; WATCHABI-LABEL: test_sincos_v2f64: |
| 850 | +; WATCHABI: .cfi_startproc |
| 851 | +; WATCHABI-NEXT: @ %bb.0: |
| 852 | +; WATCHABI-NEXT: push {r7, lr} |
| 853 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 8 |
| 854 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 855 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 856 | +; WATCHABI-NEXT: vpush {d8, d9, d10, d11, d12, d13} |
| 857 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 56 |
| 858 | +; WATCHABI-NEXT: .cfi_offset d13, -16 |
| 859 | +; WATCHABI-NEXT: .cfi_offset d12, -24 |
| 860 | +; WATCHABI-NEXT: .cfi_offset d11, -32 |
| 861 | +; WATCHABI-NEXT: .cfi_offset d10, -40 |
| 862 | +; WATCHABI-NEXT: .cfi_offset d9, -48 |
| 863 | +; WATCHABI-NEXT: .cfi_offset d8, -56 |
| 864 | +; WATCHABI-NEXT: sub sp, #8 |
| 865 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 64 |
| 866 | +; WATCHABI-NEXT: vorr q4, q0, q0 |
| 867 | +; WATCHABI-NEXT: vorr d0, d9, d9 |
| 868 | +; WATCHABI-NEXT: bl ___sincos_stret |
| 869 | +; WATCHABI-NEXT: vorr d11, d0, d0 |
| 870 | +; WATCHABI-NEXT: vorr d0, d8, d8 |
| 871 | +; WATCHABI-NEXT: vorr d13, d1, d1 |
| 872 | +; WATCHABI-NEXT: bl ___sincos_stret |
| 873 | +; WATCHABI-NEXT: vorr d12, d1, d1 |
| 874 | +; WATCHABI-NEXT: vorr d10, d0, d0 |
| 875 | +; WATCHABI-NEXT: vorr q1, q6, q6 |
| 876 | +; WATCHABI-NEXT: vorr q0, q5, q5 |
| 877 | +; WATCHABI-NEXT: add sp, #8 |
| 878 | +; WATCHABI-NEXT: vpop {d8, d9, d10, d11, d12, d13} |
| 879 | +; WATCHABI-NEXT: pop {r7, pc} |
| 880 | +; WATCHABI-NEXT: .cfi_endproc |
695 | 881 | %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a) |
696 | 882 | ret { <2 x double>, <2 x double> } %result |
697 | 883 | } |
@@ -778,6 +964,41 @@ define { fp128, fp128 } @test_sincos_f128(fp128 %a) { |
778 | 964 | ; IOS-NEXT: bl _sinl |
779 | 965 | ; IOS-NEXT: stm r4, {r0, r1, r2, r3} |
780 | 966 | ; IOS-NEXT: pop {r4, r5, r6, r7, r8, pc} |
| 967 | +; |
| 968 | +; WATCHABI-LABEL: test_sincos_f128: |
| 969 | +; WATCHABI: .cfi_startproc |
| 970 | +; WATCHABI-NEXT: @ %bb.0: |
| 971 | +; WATCHABI-NEXT: push.w {r4, r5, r6, r7, r8, lr} |
| 972 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 24 |
| 973 | +; WATCHABI-NEXT: .cfi_offset lr, -4 |
| 974 | +; WATCHABI-NEXT: .cfi_offset r7, -8 |
| 975 | +; WATCHABI-NEXT: .cfi_offset r6, -12 |
| 976 | +; WATCHABI-NEXT: .cfi_offset r5, -16 |
| 977 | +; WATCHABI-NEXT: .cfi_offset r4, -20 |
| 978 | +; WATCHABI-NEXT: .cfi_offset r8, -24 |
| 979 | +; WATCHABI-NEXT: sub sp, #8 |
| 980 | +; WATCHABI-NEXT: .cfi_def_cfa_offset 32 |
| 981 | +; WATCHABI-NEXT: ldr.w r8, [sp, #32] |
| 982 | +; WATCHABI-NEXT: mov r4, r0 |
| 983 | +; WATCHABI-NEXT: mov r5, r3 |
| 984 | +; WATCHABI-NEXT: mov r6, r2 |
| 985 | +; WATCHABI-NEXT: mov r7, r1 |
| 986 | +; WATCHABI-NEXT: mov r0, r1 |
| 987 | +; WATCHABI-NEXT: mov r1, r2 |
| 988 | +; WATCHABI-NEXT: mov r2, r3 |
| 989 | +; WATCHABI-NEXT: mov r3, r8 |
| 990 | +; WATCHABI-NEXT: bl _cosl |
| 991 | +; WATCHABI-NEXT: add.w r9, r4, #16 |
| 992 | +; WATCHABI-NEXT: stm.w r9, {r0, r1, r2, r3} |
| 993 | +; WATCHABI-NEXT: mov r0, r7 |
| 994 | +; WATCHABI-NEXT: mov r1, r6 |
| 995 | +; WATCHABI-NEXT: mov r2, r5 |
| 996 | +; WATCHABI-NEXT: mov r3, r8 |
| 997 | +; WATCHABI-NEXT: bl _sinl |
| 998 | +; WATCHABI-NEXT: stm r4!, {r0, r1, r2, r3} |
| 999 | +; WATCHABI-NEXT: add sp, #8 |
| 1000 | +; WATCHABI-NEXT: pop.w {r4, r5, r6, r7, r8, pc} |
| 1001 | +; WATCHABI-NEXT: .cfi_endproc |
781 | 1002 | %result = call { fp128, fp128 } @llvm.sincos.f16(fp128 %a) |
782 | 1003 | ret { fp128, fp128 } %result |
783 | 1004 | } |
0 commit comments