xref: /llvm-project/llvm/test/CodeGen/ARM/llvm.sincos.ll (revision c3260c65e86ac363aa3a39f084db66a8a1d1af7d)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=thumbv7-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s
3
4define { half, half } @test_sincos_f16(half %a) {
5; CHECK-LABEL: test_sincos_f16:
6; CHECK:       @ %bb.0:
7; CHECK-NEXT:    push {r4, lr}
8; CHECK-NEXT:    sub sp, #8
9; CHECK-NEXT:    bl __gnu_h2f_ieee
10; CHECK-NEXT:    add r1, sp, #4
11; CHECK-NEXT:    mov r2, sp
12; CHECK-NEXT:    bl sincosf
13; CHECK-NEXT:    ldr r0, [sp, #4]
14; CHECK-NEXT:    bl __gnu_f2h_ieee
15; CHECK-NEXT:    mov r4, r0
16; CHECK-NEXT:    ldr r0, [sp]
17; CHECK-NEXT:    bl __gnu_f2h_ieee
18; CHECK-NEXT:    mov r1, r0
19; CHECK-NEXT:    mov r0, r4
20; CHECK-NEXT:    add sp, #8
21; CHECK-NEXT:    pop {r4, pc}
22  %result = call { half, half } @llvm.sincos.f16(half %a)
23  ret { half, half } %result
24}
25
26define half @test_sincos_f16_only_use_sin(half %a) {
27; CHECK-LABEL: test_sincos_f16_only_use_sin:
28; CHECK:       @ %bb.0:
29; CHECK-NEXT:    push {r7, lr}
30; CHECK-NEXT:    sub sp, #8
31; CHECK-NEXT:    bl __gnu_h2f_ieee
32; CHECK-NEXT:    add r1, sp, #4
33; CHECK-NEXT:    mov r2, sp
34; CHECK-NEXT:    bl sincosf
35; CHECK-NEXT:    ldr r0, [sp, #4]
36; CHECK-NEXT:    bl __gnu_f2h_ieee
37; CHECK-NEXT:    add sp, #8
38; CHECK-NEXT:    pop {r7, pc}
39  %result = call { half, half } @llvm.sincos.f16(half %a)
40  %result.0 = extractvalue { half, half } %result, 0
41  ret half %result.0
42}
43
44define half @test_sincos_f16_only_use_cos(half %a) {
45; CHECK-LABEL: test_sincos_f16_only_use_cos:
46; CHECK:       @ %bb.0:
47; CHECK-NEXT:    push {r7, lr}
48; CHECK-NEXT:    sub sp, #8
49; CHECK-NEXT:    bl __gnu_h2f_ieee
50; CHECK-NEXT:    add r1, sp, #4
51; CHECK-NEXT:    mov r2, sp
52; CHECK-NEXT:    bl sincosf
53; CHECK-NEXT:    ldr r0, [sp]
54; CHECK-NEXT:    bl __gnu_f2h_ieee
55; CHECK-NEXT:    add sp, #8
56; CHECK-NEXT:    pop {r7, pc}
57  %result = call { half, half } @llvm.sincos.f16(half %a)
58  %result.1 = extractvalue { half, half } %result, 1
59  ret half %result.1
60}
61
62define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) {
63; CHECK-LABEL: test_sincos_v2f16:
64; CHECK:       @ %bb.0:
65; CHECK-NEXT:    push {r4, lr}
66; CHECK-NEXT:    vpush {d8}
67; CHECK-NEXT:    sub sp, #24
68; CHECK-NEXT:    mov r4, r0
69; CHECK-NEXT:    mov r0, r1
70; CHECK-NEXT:    bl __gnu_h2f_ieee
71; CHECK-NEXT:    add r1, sp, #12
72; CHECK-NEXT:    add r2, sp, #8
73; CHECK-NEXT:    bl sincosf
74; CHECK-NEXT:    mov r0, r4
75; CHECK-NEXT:    bl __gnu_h2f_ieee
76; CHECK-NEXT:    add r1, sp, #4
77; CHECK-NEXT:    mov r2, sp
78; CHECK-NEXT:    bl sincosf
79; CHECK-NEXT:    ldr r0, [sp, #12]
80; CHECK-NEXT:    bl __gnu_f2h_ieee
81; CHECK-NEXT:    ldr r1, [sp, #4]
82; CHECK-NEXT:    strh.w r0, [sp, #22]
83; CHECK-NEXT:    mov r0, r1
84; CHECK-NEXT:    bl __gnu_f2h_ieee
85; CHECK-NEXT:    strh.w r0, [sp, #20]
86; CHECK-NEXT:    add r0, sp, #20
87; CHECK-NEXT:    vld1.32 {d8[0]}, [r0:32]
88; CHECK-NEXT:    ldr r0, [sp, #8]
89; CHECK-NEXT:    bl __gnu_f2h_ieee
90; CHECK-NEXT:    ldr r1, [sp]
91; CHECK-NEXT:    strh.w r0, [sp, #18]
92; CHECK-NEXT:    mov r0, r1
93; CHECK-NEXT:    bl __gnu_f2h_ieee
94; CHECK-NEXT:    strh.w r0, [sp, #16]
95; CHECK-NEXT:    add r0, sp, #16
96; CHECK-NEXT:    vmovl.u16 q9, d8
97; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]
98; CHECK-NEXT:    vmovl.u16 q8, d16
99; CHECK-NEXT:    vmov.32 r0, d18[0]
100; CHECK-NEXT:    vmov.32 r1, d18[1]
101; CHECK-NEXT:    vmov.32 r2, d16[0]
102; CHECK-NEXT:    vmov.32 r3, d16[1]
103; CHECK-NEXT:    add sp, #24
104; CHECK-NEXT:    vpop {d8}
105; CHECK-NEXT:    pop {r4, pc}
106  %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)
107  ret { <2 x half>, <2 x half> } %result
108}
109
110define { float, float } @test_sincos_f32(float %a) {
111; CHECK-LABEL: test_sincos_f32:
112; CHECK:       @ %bb.0:
113; CHECK-NEXT:    push {r7, lr}
114; CHECK-NEXT:    sub sp, #8
115; CHECK-NEXT:    add r1, sp, #4
116; CHECK-NEXT:    mov r2, sp
117; CHECK-NEXT:    bl sincosf
118; CHECK-NEXT:    ldrd r1, r0, [sp], #8
119; CHECK-NEXT:    pop {r7, pc}
120  %result = call { float, float } @llvm.sincos.f32(float %a)
121  ret { float, float } %result
122}
123
124define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) {
125; CHECK-LABEL: test_sincos_v2f32:
126; CHECK:       @ %bb.0:
127; CHECK-NEXT:    push {r7, lr}
128; CHECK-NEXT:    vpush {d8}
129; CHECK-NEXT:    sub sp, #16
130; CHECK-NEXT:    vmov d8, r0, r1
131; CHECK-NEXT:    add r1, sp, #4
132; CHECK-NEXT:    mov r2, sp
133; CHECK-NEXT:    vmov r0, s17
134; CHECK-NEXT:    bl sincosf
135; CHECK-NEXT:    vmov r0, s16
136; CHECK-NEXT:    add r1, sp, #12
137; CHECK-NEXT:    add r2, sp, #8
138; CHECK-NEXT:    bl sincosf
139; CHECK-NEXT:    vldr s1, [sp, #4]
140; CHECK-NEXT:    vldr s3, [sp]
141; CHECK-NEXT:    vldr s0, [sp, #12]
142; CHECK-NEXT:    vldr s2, [sp, #8]
143; CHECK-NEXT:    vmov r0, r1, d0
144; CHECK-NEXT:    vmov r2, r3, d1
145; CHECK-NEXT:    add sp, #16
146; CHECK-NEXT:    vpop {d8}
147; CHECK-NEXT:    pop {r7, pc}
148  %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)
149  ret { <2 x float>, <2 x float> } %result
150}
151
152define { double, double } @test_sincos_f64(double %a) {
153; CHECK-LABEL: test_sincos_f64:
154; CHECK:       @ %bb.0:
155; CHECK-NEXT:    push {r7, lr}
156; CHECK-NEXT:    sub sp, #16
157; CHECK-NEXT:    add r2, sp, #8
158; CHECK-NEXT:    mov r3, sp
159; CHECK-NEXT:    bl sincos
160; CHECK-NEXT:    ldrd r0, r1, [sp, #8]
161; CHECK-NEXT:    ldrd r2, r3, [sp], #16
162; CHECK-NEXT:    pop {r7, pc}
163  %result = call { double, double } @llvm.sincos.f64(double %a)
164  ret { double, double } %result
165}
166
167define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) {
168; CHECK-LABEL: test_sincos_v2f64:
169; CHECK:       @ %bb.0:
170; CHECK-NEXT:    push {r4, lr}
171; CHECK-NEXT:    sub sp, #32
172; CHECK-NEXT:    mov r1, r3
173; CHECK-NEXT:    mov r12, r2
174; CHECK-NEXT:    add r2, sp, #24
175; CHECK-NEXT:    add r3, sp, #16
176; CHECK-NEXT:    mov r4, r0
177; CHECK-NEXT:    mov r0, r12
178; CHECK-NEXT:    bl sincos
179; CHECK-NEXT:    ldrd r0, r1, [sp, #40]
180; CHECK-NEXT:    add r2, sp, #8
181; CHECK-NEXT:    mov r3, sp
182; CHECK-NEXT:    bl sincos
183; CHECK-NEXT:    vldr d19, [sp, #8]
184; CHECK-NEXT:    vldr d18, [sp, #24]
185; CHECK-NEXT:    vldr d17, [sp]
186; CHECK-NEXT:    vldr d16, [sp, #16]
187; CHECK-NEXT:    vst1.64 {d18, d19}, [r4]!
188; CHECK-NEXT:    vst1.64 {d16, d17}, [r4]
189; CHECK-NEXT:    add sp, #32
190; CHECK-NEXT:    pop {r4, pc}
191  %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)
192  ret { <2 x double>, <2 x double> } %result
193}
194
195define { fp128, fp128 } @test_sincos_f128(fp128 %a) {
196; CHECK-LABEL: test_sincos_f128:
197; CHECK:       @ %bb.0:
198; CHECK-NEXT:    push {r4, r5, r7, lr}
199; CHECK-NEXT:    sub sp, #40
200; CHECK-NEXT:    mov r12, r3
201; CHECK-NEXT:    ldr r3, [sp, #56]
202; CHECK-NEXT:    add.w lr, sp, #8
203; CHECK-NEXT:    mov r4, r0
204; CHECK-NEXT:    add r0, sp, #24
205; CHECK-NEXT:    strd r0, lr, [sp]
206; CHECK-NEXT:    mov r0, r1
207; CHECK-NEXT:    mov r1, r2
208; CHECK-NEXT:    mov r2, r12
209; CHECK-NEXT:    bl sincosl
210; CHECK-NEXT:    ldrd r2, r3, [sp, #16]
211; CHECK-NEXT:    ldrd r12, r1, [sp, #8]
212; CHECK-NEXT:    str r3, [r4, #28]
213; CHECK-NEXT:    ldrd r3, r5, [sp, #32]
214; CHECK-NEXT:    ldrd lr, r0, [sp, #24]
215; CHECK-NEXT:    strd r1, r2, [r4, #20]
216; CHECK-NEXT:    add.w r1, r4, #8
217; CHECK-NEXT:    stm.w r1, {r3, r5, r12}
218; CHECK-NEXT:    strd lr, r0, [r4]
219; CHECK-NEXT:    add sp, #40
220; CHECK-NEXT:    pop {r4, r5, r7, pc}
221  %result = call { fp128, fp128 } @llvm.sincos.f16(fp128 %a)
222  ret { fp128, fp128 } %result
223}
224