diff options
Diffstat (limited to 'llvm/test/CodeGen/AVR/llvm.sincos.ll')
-rw-r--r-- | llvm/test/CodeGen/AVR/llvm.sincos.ll | 883 |
1 files changed, 883 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AVR/llvm.sincos.ll b/llvm/test/CodeGen/AVR/llvm.sincos.ll new file mode 100644 index 0000000..897101d --- /dev/null +++ b/llvm/test/CodeGen/AVR/llvm.sincos.ll @@ -0,0 +1,883 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 +; RUN: llc -mtriple=avr-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,NONGNU %s +; RUN: llc -mtriple=avr-unknown-linux-gnu < %s | FileCheck -check-prefixes=CHECK,GNU %s + +define { half, half } @test_sincos_f16(half %a) #0 { +; NONGNU-LABEL: test_sincos_f16: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: push r12 +; NONGNU-NEXT: push r13 +; NONGNU-NEXT: push r14 +; NONGNU-NEXT: push r15 +; NONGNU-NEXT: push r16 +; NONGNU-NEXT: push r17 +; NONGNU-NEXT: mov r24, r22 +; NONGNU-NEXT: mov r25, r23 +; NONGNU-NEXT: rcall __extendhfsf2 +; NONGNU-NEXT: mov r16, r22 +; NONGNU-NEXT: mov r17, r23 +; NONGNU-NEXT: mov r14, r24 +; NONGNU-NEXT: mov r15, r25 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r12, r24 +; NONGNU-NEXT: mov r13, r25 +; NONGNU-NEXT: mov r22, r16 +; NONGNU-NEXT: mov r23, r17 +; NONGNU-NEXT: mov r24, r14 +; NONGNU-NEXT: mov r25, r15 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r22, r24 +; NONGNU-NEXT: mov r23, r25 +; NONGNU-NEXT: mov r18, r12 +; NONGNU-NEXT: mov r19, r13 +; NONGNU-NEXT: pop r17 +; NONGNU-NEXT: pop r16 +; NONGNU-NEXT: pop r15 +; NONGNU-NEXT: pop r14 +; NONGNU-NEXT: pop r13 +; NONGNU-NEXT: pop r12 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_f16: +; GNU: ; %bb.0: +; GNU-NEXT: push r16 +; GNU-NEXT: push r17 +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r24, r22 +; GNU-NEXT: mov r25, r23 +; GNU-NEXT: rcall __extendhfsf2 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r22, Y+5 +; GNU-NEXT: ldd r23, Y+6 +; GNU-NEXT: ldd r24, Y+7 +; GNU-NEXT: ldd r25, Y+8 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r16, r24 +; GNU-NEXT: mov r17, r25 +; GNU-NEXT: ldd r22, Y+1 +; GNU-NEXT: ldd r23, Y+2 +; GNU-NEXT: ldd r24, Y+3 +; GNU-NEXT: ldd r25, Y+4 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r22, r24 +; GNU-NEXT: mov r23, r25 +; GNU-NEXT: mov r18, r16 +; GNU-NEXT: mov r19, r17 +; GNU-NEXT: adiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: pop r17 +; GNU-NEXT: pop r16 +; GNU-NEXT: ret + %result = call { half, half } @llvm.sincos.f16(half %a) + ret { half, half } %result +} + +define half @test_sincos_f16_only_use_sin(half %a) #0 { +; NONGNU-LABEL: test_sincos_f16_only_use_sin: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: mov r24, r22 +; NONGNU-NEXT: mov r25, r23 +; NONGNU-NEXT: rcall __extendhfsf2 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r22, r24 +; NONGNU-NEXT: mov r23, r25 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_f16_only_use_sin: +; GNU: ; %bb.0: +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r24, r22 +; GNU-NEXT: mov r25, r23 +; GNU-NEXT: rcall __extendhfsf2 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r22, Y+5 +; GNU-NEXT: ldd r23, Y+6 +; GNU-NEXT: ldd r24, Y+7 +; GNU-NEXT: ldd r25, Y+8 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r22, r24 +; GNU-NEXT: mov r23, r25 +; GNU-NEXT: adiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: ret + %result = call { half, half } @llvm.sincos.f16(half %a) + %result.0 = extractvalue { half, half } %result, 0 + ret half %result.0 +} + +define half @test_sincos_f16_only_use_cos(half %a) #0 { +; NONGNU-LABEL: test_sincos_f16_only_use_cos: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: mov r24, r22 +; NONGNU-NEXT: mov r25, r23 +; NONGNU-NEXT: rcall __extendhfsf2 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r22, r24 +; NONGNU-NEXT: mov r23, r25 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_f16_only_use_cos: +; GNU: ; %bb.0: +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r24, r22 +; GNU-NEXT: mov r25, r23 +; GNU-NEXT: rcall __extendhfsf2 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r22, Y+1 +; GNU-NEXT: ldd r23, Y+2 +; GNU-NEXT: ldd r24, Y+3 +; GNU-NEXT: ldd r25, Y+4 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r22, r24 +; GNU-NEXT: mov r23, r25 +; GNU-NEXT: adiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: ret + %result = call { half, half } @llvm.sincos.f16(half %a) + %result.1 = extractvalue { half, half } %result, 1 + ret half %result.1 +} + +define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) #0 { +; NONGNU-LABEL: test_sincos_v2f16: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: push r6 +; NONGNU-NEXT: push r7 +; NONGNU-NEXT: push r8 +; NONGNU-NEXT: push r9 +; NONGNU-NEXT: push r10 +; NONGNU-NEXT: push r11 +; NONGNU-NEXT: push r12 +; NONGNU-NEXT: push r13 +; NONGNU-NEXT: push r14 +; NONGNU-NEXT: push r15 +; NONGNU-NEXT: push r16 +; NONGNU-NEXT: push r17 +; NONGNU-NEXT: mov r10, r22 +; NONGNU-NEXT: mov r11, r23 +; NONGNU-NEXT: rcall __extendhfsf2 +; NONGNU-NEXT: mov r16, r22 +; NONGNU-NEXT: mov r17, r23 +; NONGNU-NEXT: mov r14, r24 +; NONGNU-NEXT: mov r15, r25 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r12, r24 +; NONGNU-NEXT: mov r13, r25 +; NONGNU-NEXT: mov r24, r10 +; NONGNU-NEXT: mov r25, r11 +; NONGNU-NEXT: rcall __extendhfsf2 +; NONGNU-NEXT: mov r10, r22 +; NONGNU-NEXT: mov r11, r23 +; NONGNU-NEXT: mov r8, r24 +; NONGNU-NEXT: mov r9, r25 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r6, r24 +; NONGNU-NEXT: mov r7, r25 +; NONGNU-NEXT: mov r22, r10 +; NONGNU-NEXT: mov r23, r11 +; NONGNU-NEXT: mov r24, r8 +; NONGNU-NEXT: mov r25, r9 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r10, r24 +; NONGNU-NEXT: mov r11, r25 +; NONGNU-NEXT: mov r22, r16 +; NONGNU-NEXT: mov r23, r17 +; NONGNU-NEXT: mov r24, r14 +; NONGNU-NEXT: mov r25, r15 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: rcall __truncsfhf2 +; NONGNU-NEXT: mov r18, r10 +; NONGNU-NEXT: mov r19, r11 +; NONGNU-NEXT: mov r20, r12 +; NONGNU-NEXT: mov r21, r13 +; NONGNU-NEXT: mov r22, r6 +; NONGNU-NEXT: mov r23, r7 +; NONGNU-NEXT: pop r17 +; NONGNU-NEXT: pop r16 +; NONGNU-NEXT: pop r15 +; NONGNU-NEXT: pop r14 +; NONGNU-NEXT: pop r13 +; NONGNU-NEXT: pop r12 +; NONGNU-NEXT: pop r11 +; NONGNU-NEXT: pop r10 +; NONGNU-NEXT: pop r9 +; NONGNU-NEXT: pop r8 +; NONGNU-NEXT: pop r7 +; NONGNU-NEXT: pop r6 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_v2f16: +; GNU: ; %bb.0: +; GNU-NEXT: push r12 +; GNU-NEXT: push r13 +; GNU-NEXT: push r14 +; GNU-NEXT: push r15 +; GNU-NEXT: push r16 +; GNU-NEXT: push r17 +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 16 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r16, r24 +; GNU-NEXT: mov r17, r25 +; GNU-NEXT: mov r24, r22 +; GNU-NEXT: mov r25, r23 +; GNU-NEXT: rcall __extendhfsf2 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 243 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 247 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: mov r24, r16 +; GNU-NEXT: mov r25, r17 +; GNU-NEXT: rcall __extendhfsf2 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r22, Y+13 +; GNU-NEXT: ldd r23, Y+14 +; GNU-NEXT: ldd r24, Y+15 +; GNU-NEXT: ldd r25, Y+16 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r16, r24 +; GNU-NEXT: mov r17, r25 +; GNU-NEXT: ldd r22, Y+5 +; GNU-NEXT: ldd r23, Y+6 +; GNU-NEXT: ldd r24, Y+7 +; GNU-NEXT: ldd r25, Y+8 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r14, r24 +; GNU-NEXT: mov r15, r25 +; GNU-NEXT: ldd r22, Y+9 +; GNU-NEXT: ldd r23, Y+10 +; GNU-NEXT: ldd r24, Y+11 +; GNU-NEXT: ldd r25, Y+12 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r12, r24 +; GNU-NEXT: mov r13, r25 +; GNU-NEXT: ldd r22, Y+1 +; GNU-NEXT: ldd r23, Y+2 +; GNU-NEXT: ldd r24, Y+3 +; GNU-NEXT: ldd r25, Y+4 +; GNU-NEXT: rcall __truncsfhf2 +; GNU-NEXT: mov r18, r16 +; GNU-NEXT: mov r19, r17 +; GNU-NEXT: mov r20, r14 +; GNU-NEXT: mov r21, r15 +; GNU-NEXT: mov r22, r12 +; GNU-NEXT: mov r23, r13 +; GNU-NEXT: adiw r28, 16 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: pop r17 +; GNU-NEXT: pop r16 +; GNU-NEXT: pop r15 +; GNU-NEXT: pop r14 +; GNU-NEXT: pop r13 +; GNU-NEXT: pop r12 +; GNU-NEXT: ret + %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a) + ret { <2 x half>, <2 x half> } %result +} + +define { float, float } @test_sincos_f32(float %a) #0 { +; NONGNU-LABEL: test_sincos_f32: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: push r10 +; NONGNU-NEXT: push r11 +; NONGNU-NEXT: push r12 +; NONGNU-NEXT: push r13 +; NONGNU-NEXT: push r14 +; NONGNU-NEXT: push r15 +; NONGNU-NEXT: push r16 +; NONGNU-NEXT: push r17 +; NONGNU-NEXT: mov r16, r24 +; NONGNU-NEXT: mov r17, r25 +; NONGNU-NEXT: mov r14, r22 +; NONGNU-NEXT: mov r15, r23 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: mov r12, r22 +; NONGNU-NEXT: mov r13, r23 +; NONGNU-NEXT: mov r10, r24 +; NONGNU-NEXT: mov r11, r25 +; NONGNU-NEXT: mov r22, r14 +; NONGNU-NEXT: mov r23, r15 +; NONGNU-NEXT: mov r24, r16 +; NONGNU-NEXT: mov r25, r17 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: mov r18, r12 +; NONGNU-NEXT: mov r19, r13 +; NONGNU-NEXT: mov r20, r10 +; NONGNU-NEXT: mov r21, r11 +; NONGNU-NEXT: pop r17 +; NONGNU-NEXT: pop r16 +; NONGNU-NEXT: pop r15 +; NONGNU-NEXT: pop r14 +; NONGNU-NEXT: pop r13 +; NONGNU-NEXT: pop r12 +; NONGNU-NEXT: pop r11 +; NONGNU-NEXT: pop r10 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_f32: +; GNU: ; %bb.0: +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r18, Y+5 +; GNU-NEXT: ldd r19, Y+6 +; GNU-NEXT: ldd r20, Y+7 +; GNU-NEXT: ldd r21, Y+8 +; GNU-NEXT: ldd r22, Y+1 +; GNU-NEXT: ldd r23, Y+2 +; GNU-NEXT: ldd r24, Y+3 +; GNU-NEXT: ldd r25, Y+4 +; GNU-NEXT: adiw r28, 8 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: ret + %result = call { float, float } @llvm.sincos.f32(float %a) + ret { float, float } %result +} + +define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) #0 { +; NONGNU-LABEL: test_sincos_v2f32: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: push r8 +; NONGNU-NEXT: push r9 +; NONGNU-NEXT: push r10 +; NONGNU-NEXT: push r11 +; NONGNU-NEXT: push r12 +; NONGNU-NEXT: push r13 +; NONGNU-NEXT: push r14 +; NONGNU-NEXT: push r15 +; NONGNU-NEXT: mov r14, r22 +; NONGNU-NEXT: mov r15, r23 +; NONGNU-NEXT: mov r12, r20 +; NONGNU-NEXT: mov r13, r21 +; NONGNU-NEXT: mov r10, r18 +; NONGNU-NEXT: mov r11, r19 +; NONGNU-NEXT: mov r8, r24 +; NONGNU-NEXT: mov r9, r25 +; NONGNU-NEXT: mov r22, r12 +; NONGNU-NEXT: mov r23, r13 +; NONGNU-NEXT: mov r24, r14 +; NONGNU-NEXT: mov r25, r15 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: mov r30, r8 +; NONGNU-NEXT: mov r31, r9 +; NONGNU-NEXT: std Z+15, r25 +; NONGNU-NEXT: std Z+14, r24 +; NONGNU-NEXT: std Z+13, r23 +; NONGNU-NEXT: std Z+12, r22 +; NONGNU-NEXT: mov r22, r16 +; NONGNU-NEXT: mov r23, r17 +; NONGNU-NEXT: mov r24, r10 +; NONGNU-NEXT: mov r25, r11 +; NONGNU-NEXT: rcall cos +; NONGNU-NEXT: mov r30, r8 +; NONGNU-NEXT: mov r31, r9 +; NONGNU-NEXT: std Z+11, r25 +; NONGNU-NEXT: std Z+10, r24 +; NONGNU-NEXT: std Z+9, r23 +; NONGNU-NEXT: std Z+8, r22 +; NONGNU-NEXT: mov r22, r12 +; NONGNU-NEXT: mov r23, r13 +; NONGNU-NEXT: mov r24, r14 +; NONGNU-NEXT: mov r25, r15 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: mov r30, r8 +; NONGNU-NEXT: mov r31, r9 +; NONGNU-NEXT: std Z+7, r25 +; NONGNU-NEXT: std Z+6, r24 +; NONGNU-NEXT: std Z+5, r23 +; NONGNU-NEXT: std Z+4, r22 +; NONGNU-NEXT: mov r22, r16 +; NONGNU-NEXT: mov r23, r17 +; NONGNU-NEXT: mov r24, r10 +; NONGNU-NEXT: mov r25, r11 +; NONGNU-NEXT: rcall sin +; NONGNU-NEXT: mov r30, r8 +; NONGNU-NEXT: mov r31, r9 +; NONGNU-NEXT: std Z+3, r25 +; NONGNU-NEXT: std Z+2, r24 +; NONGNU-NEXT: std Z+1, r23 +; NONGNU-NEXT: st Z, r22 +; NONGNU-NEXT: pop r15 +; NONGNU-NEXT: pop r14 +; NONGNU-NEXT: pop r13 +; NONGNU-NEXT: pop r12 +; NONGNU-NEXT: pop r11 +; NONGNU-NEXT: pop r10 +; NONGNU-NEXT: pop r9 +; NONGNU-NEXT: pop r8 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_v2f32: +; GNU: ; %bb.0: +; GNU-NEXT: push r12 +; GNU-NEXT: push r13 +; GNU-NEXT: push r14 +; GNU-NEXT: push r15 +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 16 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r30, r22 +; GNU-NEXT: mov r31, r23 +; GNU-NEXT: mov r14, r18 +; GNU-NEXT: mov r15, r19 +; GNU-NEXT: mov r12, r24 +; GNU-NEXT: mov r13, r25 +; GNU-NEXT: mov r26, r28 +; GNU-NEXT: mov r27, r29 +; GNU-NEXT: adiw r26, 13 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 247 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: mov r22, r20 +; GNU-NEXT: mov r23, r21 +; GNU-NEXT: mov r24, r30 +; GNU-NEXT: mov r25, r31 +; GNU-NEXT: mov r20, r26 +; GNU-NEXT: mov r21, r27 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: mov r20, r28 +; GNU-NEXT: mov r21, r29 +; GNU-NEXT: subi r20, 251 +; GNU-NEXT: sbci r21, 255 +; GNU-NEXT: mov r18, r28 +; GNU-NEXT: mov r19, r29 +; GNU-NEXT: subi r18, 255 +; GNU-NEXT: sbci r19, 255 +; GNU-NEXT: mov r22, r16 +; GNU-NEXT: mov r23, r17 +; GNU-NEXT: mov r24, r14 +; GNU-NEXT: mov r25, r15 +; GNU-NEXT: rcall sincosf +; GNU-NEXT: ldd r24, Y+11 +; GNU-NEXT: ldd r25, Y+12 +; GNU-NEXT: mov r30, r12 +; GNU-NEXT: mov r31, r13 +; GNU-NEXT: std Z+15, r25 +; GNU-NEXT: std Z+14, r24 +; GNU-NEXT: ldd r24, Y+9 +; GNU-NEXT: ldd r25, Y+10 +; GNU-NEXT: std Z+13, r25 +; GNU-NEXT: std Z+12, r24 +; GNU-NEXT: ldd r24, Y+3 +; GNU-NEXT: ldd r25, Y+4 +; GNU-NEXT: std Z+11, r25 +; GNU-NEXT: std Z+10, r24 +; GNU-NEXT: ldd r24, Y+1 +; GNU-NEXT: ldd r25, Y+2 +; GNU-NEXT: std Z+9, r25 +; GNU-NEXT: std Z+8, r24 +; GNU-NEXT: ldd r24, Y+15 +; GNU-NEXT: ldd r25, Y+16 +; GNU-NEXT: std Z+7, r25 +; GNU-NEXT: std Z+6, r24 +; GNU-NEXT: ldd r24, Y+13 +; GNU-NEXT: ldd r25, Y+14 +; GNU-NEXT: std Z+5, r25 +; GNU-NEXT: std Z+4, r24 +; GNU-NEXT: ldd r24, Y+7 +; GNU-NEXT: ldd r25, Y+8 +; GNU-NEXT: std Z+3, r25 +; GNU-NEXT: std Z+2, r24 +; GNU-NEXT: ldd r24, Y+5 +; GNU-NEXT: ldd r25, Y+6 +; GNU-NEXT: std Z+1, r25 +; GNU-NEXT: st Z, r24 +; GNU-NEXT: adiw r28, 16 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: pop r15 +; GNU-NEXT: pop r14 +; GNU-NEXT: pop r13 +; GNU-NEXT: pop r12 +; GNU-NEXT: ret + %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a) + ret { <2 x float>, <2 x float> } %result +} + +; FIXME: Broken +; define { double, double } @test_sincos_f64(double %a) #0 { +; %result = call { double, double } @llvm.sincos.f64(double %a) +; ret { double, double } %result +; } + +; FIXME: Broken +; define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) #0 { +; %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a) +; ret { <2 x double>, <2 x double> } %result +; } + +define { fp128, fp128 } @test_sincos_f128(fp128 %a) #0 { +; NONGNU-LABEL: test_sincos_f128: +; NONGNU: ; %bb.0: +; NONGNU-NEXT: push r2 +; NONGNU-NEXT: push r3 +; NONGNU-NEXT: push r4 +; NONGNU-NEXT: push r5 +; NONGNU-NEXT: push r6 +; NONGNU-NEXT: push r7 +; NONGNU-NEXT: push r28 +; NONGNU-NEXT: push r29 +; NONGNU-NEXT: in r28, 61 +; NONGNU-NEXT: in r29, 62 +; NONGNU-NEXT: sbiw r28, 34 +; NONGNU-NEXT: in r0, 63 +; NONGNU-NEXT: cli +; NONGNU-NEXT: out 62, r29 +; NONGNU-NEXT: out 63, r0 +; NONGNU-NEXT: out 61, r28 +; NONGNU-NEXT: std Y+2, r23 ; 2-byte Folded Spill +; NONGNU-NEXT: std Y+1, r22 ; 2-byte Folded Spill +; NONGNU-NEXT: mov r2, r20 +; NONGNU-NEXT: mov r3, r21 +; NONGNU-NEXT: mov r4, r18 +; NONGNU-NEXT: mov r5, r19 +; NONGNU-NEXT: mov r6, r24 +; NONGNU-NEXT: mov r7, r25 +; NONGNU-NEXT: mov r24, r28 +; NONGNU-NEXT: mov r25, r29 +; NONGNU-NEXT: adiw r24, 3 +; NONGNU-NEXT: rcall cosl +; NONGNU-NEXT: mov r24, r28 +; NONGNU-NEXT: mov r25, r29 +; NONGNU-NEXT: adiw r24, 19 +; NONGNU-NEXT: mov r18, r4 +; NONGNU-NEXT: mov r19, r5 +; NONGNU-NEXT: mov r20, r2 +; NONGNU-NEXT: mov r21, r3 +; NONGNU-NEXT: ldd r22, Y+1 ; 2-byte Folded Reload +; NONGNU-NEXT: ldd r23, Y+2 ; 2-byte Folded Reload +; NONGNU-NEXT: rcall sinl +; NONGNU-NEXT: ldd r24, Y+17 +; NONGNU-NEXT: ldd r25, Y+18 +; NONGNU-NEXT: mov r30, r6 +; NONGNU-NEXT: mov r31, r7 +; NONGNU-NEXT: std Z+31, r25 +; NONGNU-NEXT: std Z+30, r24 +; NONGNU-NEXT: ldd r24, Y+15 +; NONGNU-NEXT: ldd r25, Y+16 +; NONGNU-NEXT: std Z+29, r25 +; NONGNU-NEXT: std Z+28, r24 +; NONGNU-NEXT: ldd r24, Y+13 +; NONGNU-NEXT: ldd r25, Y+14 +; NONGNU-NEXT: std Z+27, r25 +; NONGNU-NEXT: std Z+26, r24 +; NONGNU-NEXT: ldd r24, Y+11 +; NONGNU-NEXT: ldd r25, Y+12 +; NONGNU-NEXT: std Z+25, r25 +; NONGNU-NEXT: std Z+24, r24 +; NONGNU-NEXT: ldd r24, Y+9 +; NONGNU-NEXT: ldd r25, Y+10 +; NONGNU-NEXT: std Z+23, r25 +; NONGNU-NEXT: std Z+22, r24 +; NONGNU-NEXT: ldd r24, Y+7 +; NONGNU-NEXT: ldd r25, Y+8 +; NONGNU-NEXT: std Z+21, r25 +; NONGNU-NEXT: std Z+20, r24 +; NONGNU-NEXT: ldd r24, Y+5 +; NONGNU-NEXT: ldd r25, Y+6 +; NONGNU-NEXT: std Z+19, r25 +; NONGNU-NEXT: std Z+18, r24 +; NONGNU-NEXT: ldd r24, Y+3 +; NONGNU-NEXT: ldd r25, Y+4 +; NONGNU-NEXT: std Z+17, r25 +; NONGNU-NEXT: std Z+16, r24 +; NONGNU-NEXT: ldd r24, Y+33 +; NONGNU-NEXT: ldd r25, Y+34 +; NONGNU-NEXT: std Z+15, r25 +; NONGNU-NEXT: std Z+14, r24 +; NONGNU-NEXT: ldd r24, Y+31 +; NONGNU-NEXT: ldd r25, Y+32 +; NONGNU-NEXT: std Z+13, r25 +; NONGNU-NEXT: std Z+12, r24 +; NONGNU-NEXT: ldd r24, Y+29 +; NONGNU-NEXT: ldd r25, Y+30 +; NONGNU-NEXT: std Z+11, r25 +; NONGNU-NEXT: std Z+10, r24 +; NONGNU-NEXT: ldd r24, Y+27 +; NONGNU-NEXT: ldd r25, Y+28 +; NONGNU-NEXT: std Z+9, r25 +; NONGNU-NEXT: std Z+8, r24 +; NONGNU-NEXT: ldd r24, Y+25 +; NONGNU-NEXT: ldd r25, Y+26 +; NONGNU-NEXT: std Z+7, r25 +; NONGNU-NEXT: std Z+6, r24 +; NONGNU-NEXT: ldd r24, Y+23 +; NONGNU-NEXT: ldd r25, Y+24 +; NONGNU-NEXT: std Z+5, r25 +; NONGNU-NEXT: std Z+4, r24 +; NONGNU-NEXT: ldd r24, Y+21 +; NONGNU-NEXT: ldd r25, Y+22 +; NONGNU-NEXT: std Z+3, r25 +; NONGNU-NEXT: std Z+2, r24 +; NONGNU-NEXT: ldd r24, Y+19 +; NONGNU-NEXT: ldd r25, Y+20 +; NONGNU-NEXT: std Z+1, r25 +; NONGNU-NEXT: st Z, r24 +; NONGNU-NEXT: adiw r28, 34 +; NONGNU-NEXT: in r0, 63 +; NONGNU-NEXT: cli +; NONGNU-NEXT: out 62, r29 +; NONGNU-NEXT: out 63, r0 +; NONGNU-NEXT: out 61, r28 +; NONGNU-NEXT: pop r29 +; NONGNU-NEXT: pop r28 +; NONGNU-NEXT: pop r7 +; NONGNU-NEXT: pop r6 +; NONGNU-NEXT: pop r5 +; NONGNU-NEXT: pop r4 +; NONGNU-NEXT: pop r3 +; NONGNU-NEXT: pop r2 +; NONGNU-NEXT: ret +; +; GNU-LABEL: test_sincos_f128: +; GNU: ; %bb.0: +; GNU-NEXT: push r6 +; GNU-NEXT: push r7 +; GNU-NEXT: push r28 +; GNU-NEXT: push r29 +; GNU-NEXT: in r28, 61 +; GNU-NEXT: in r29, 62 +; GNU-NEXT: sbiw r28, 52 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: mov r6, r24 +; GNU-NEXT: mov r7, r25 +; GNU-NEXT: mov r24, r28 +; GNU-NEXT: mov r25, r29 +; GNU-NEXT: adiw r24, 21 +; GNU-NEXT: std Y+4, r25 +; GNU-NEXT: std Y+3, r24 +; GNU-NEXT: mov r24, r28 +; GNU-NEXT: mov r25, r29 +; GNU-NEXT: adiw r24, 37 +; GNU-NEXT: std Y+2, r25 +; GNU-NEXT: std Y+1, r24 +; GNU-NEXT: mov r24, r28 +; GNU-NEXT: mov r25, r29 +; GNU-NEXT: adiw r24, 5 +; GNU-NEXT: rcall sincosl +; GNU-NEXT: ldd r24, Y+35 +; GNU-NEXT: ldd r25, Y+36 +; GNU-NEXT: mov r30, r6 +; GNU-NEXT: mov r31, r7 +; GNU-NEXT: std Z+31, r25 +; GNU-NEXT: std Z+30, r24 +; GNU-NEXT: ldd r24, Y+33 +; GNU-NEXT: ldd r25, Y+34 +; GNU-NEXT: std Z+29, r25 +; GNU-NEXT: std Z+28, r24 +; GNU-NEXT: ldd r24, Y+31 +; GNU-NEXT: ldd r25, Y+32 +; GNU-NEXT: std Z+27, r25 +; GNU-NEXT: std Z+26, r24 +; GNU-NEXT: ldd r24, Y+29 +; GNU-NEXT: ldd r25, Y+30 +; GNU-NEXT: std Z+25, r25 +; GNU-NEXT: std Z+24, r24 +; GNU-NEXT: ldd r24, Y+27 +; GNU-NEXT: ldd r25, Y+28 +; GNU-NEXT: std Z+23, r25 +; GNU-NEXT: std Z+22, r24 +; GNU-NEXT: ldd r24, Y+25 +; GNU-NEXT: ldd r25, Y+26 +; GNU-NEXT: std Z+21, r25 +; GNU-NEXT: std Z+20, r24 +; GNU-NEXT: ldd r24, Y+23 +; GNU-NEXT: ldd r25, Y+24 +; GNU-NEXT: std Z+19, r25 +; GNU-NEXT: std Z+18, r24 +; GNU-NEXT: ldd r24, Y+21 +; GNU-NEXT: ldd r25, Y+22 +; GNU-NEXT: std Z+17, r25 +; GNU-NEXT: std Z+16, r24 +; GNU-NEXT: ldd r24, Y+51 +; GNU-NEXT: ldd r25, Y+52 +; GNU-NEXT: std Z+15, r25 +; GNU-NEXT: std Z+14, r24 +; GNU-NEXT: ldd r24, Y+49 +; GNU-NEXT: ldd r25, Y+50 +; GNU-NEXT: std Z+13, r25 +; GNU-NEXT: std Z+12, r24 +; GNU-NEXT: ldd r24, Y+47 +; GNU-NEXT: ldd r25, Y+48 +; GNU-NEXT: std Z+11, r25 +; GNU-NEXT: std Z+10, r24 +; GNU-NEXT: ldd r24, Y+45 +; GNU-NEXT: ldd r25, Y+46 +; GNU-NEXT: std Z+9, r25 +; GNU-NEXT: std Z+8, r24 +; GNU-NEXT: ldd r24, Y+43 +; GNU-NEXT: ldd r25, Y+44 +; GNU-NEXT: std Z+7, r25 +; GNU-NEXT: std Z+6, r24 +; GNU-NEXT: ldd r24, Y+41 +; GNU-NEXT: ldd r25, Y+42 +; GNU-NEXT: std Z+5, r25 +; GNU-NEXT: std Z+4, r24 +; GNU-NEXT: ldd r24, Y+39 +; GNU-NEXT: ldd r25, Y+40 +; GNU-NEXT: std Z+3, r25 +; GNU-NEXT: std Z+2, r24 +; GNU-NEXT: ldd r24, Y+37 +; GNU-NEXT: ldd r25, Y+38 +; GNU-NEXT: std Z+1, r25 +; GNU-NEXT: st Z, r24 +; GNU-NEXT: adiw r28, 52 +; GNU-NEXT: in r0, 63 +; GNU-NEXT: cli +; GNU-NEXT: out 62, r29 +; GNU-NEXT: out 63, r0 +; GNU-NEXT: out 61, r28 +; GNU-NEXT: pop r29 +; GNU-NEXT: pop r28 +; GNU-NEXT: pop r7 +; GNU-NEXT: pop r6 +; GNU-NEXT: ret + %result = call { fp128, fp128 } @llvm.sincos.f128(fp128 %a) + ret { fp128, fp128 } %result +} + +attributes #0 = { nounwind } + +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; CHECK: {{.*}} |