Skip to content

Commit 12568b6

Browse files
authored
SystemZ: Add sincos intrinsic test (#147473)
The ZOS run line is mostly broken. update_test_checks seems to not work on it and I have no idea what I'm looking at here. It's not obvious to me what the calls are. I added some checks for the references to the libcalls printed at the end of the module, but didn't check anything in the function body. half also just asserts somewhere.
1 parent 8eab158 commit 12568b6

File tree

2 files changed

+327
-0
lines changed

2 files changed

+327
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=s390x-linux-gnu < %s | FileCheck -check-prefix=LINUX %s
3+
4+
; FIXME: Merge with llvm.sincos.ll when zos is fixed for half.
5+
6+
define { half, half } @test_sincos_f16(half %a) #0 {
7+
; LINUX-LABEL: test_sincos_f16:
8+
; LINUX: # %bb.0:
9+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
10+
; LINUX-NEXT: .cfi_offset %r14, -48
11+
; LINUX-NEXT: .cfi_offset %r15, -40
12+
; LINUX-NEXT: aghi %r15, -176
13+
; LINUX-NEXT: .cfi_def_cfa_offset 336
14+
; LINUX-NEXT: std %f8, 168(%r15) # 8-byte Spill
15+
; LINUX-NEXT: .cfi_offset %f8, -168
16+
; LINUX-NEXT: brasl %r14, __extendhfsf2@PLT
17+
; LINUX-NEXT: la %r2, 164(%r15)
18+
; LINUX-NEXT: la %r3, 160(%r15)
19+
; LINUX-NEXT: brasl %r14, sincosf@PLT
20+
; LINUX-NEXT: le %f0, 164(%r15)
21+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
22+
; LINUX-NEXT: le %f1, 160(%r15)
23+
; LINUX-NEXT: ler %f8, %f0
24+
; LINUX-NEXT: ler %f0, %f1
25+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
26+
; LINUX-NEXT: ler %f2, %f0
27+
; LINUX-NEXT: ler %f0, %f8
28+
; LINUX-NEXT: ld %f8, 168(%r15) # 8-byte Reload
29+
; LINUX-NEXT: lmg %r14, %r15, 288(%r15)
30+
; LINUX-NEXT: br %r14
31+
%result = call { half, half } @llvm.sincos.f16(half %a)
32+
ret { half, half } %result
33+
}
34+
35+
define half @test_sincos_f16_only_use_sin(half %a) #0 {
36+
; LINUX-LABEL: test_sincos_f16_only_use_sin:
37+
; LINUX: # %bb.0:
38+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
39+
; LINUX-NEXT: .cfi_offset %r14, -48
40+
; LINUX-NEXT: .cfi_offset %r15, -40
41+
; LINUX-NEXT: aghi %r15, -168
42+
; LINUX-NEXT: .cfi_def_cfa_offset 328
43+
; LINUX-NEXT: brasl %r14, __extendhfsf2@PLT
44+
; LINUX-NEXT: la %r2, 160(%r15)
45+
; LINUX-NEXT: la %r3, 164(%r15)
46+
; LINUX-NEXT: brasl %r14, sincosf@PLT
47+
; LINUX-NEXT: le %f0, 160(%r15)
48+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
49+
; LINUX-NEXT: lmg %r14, %r15, 280(%r15)
50+
; LINUX-NEXT: br %r14
51+
%result = call { half, half } @llvm.sincos.f16(half %a)
52+
%result.0 = extractvalue { half, half } %result, 0
53+
ret half %result.0
54+
}
55+
56+
define half @test_sincos_f16_only_use_cos(half %a) #0 {
57+
; LINUX-LABEL: test_sincos_f16_only_use_cos:
58+
; LINUX: # %bb.0:
59+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
60+
; LINUX-NEXT: .cfi_offset %r14, -48
61+
; LINUX-NEXT: .cfi_offset %r15, -40
62+
; LINUX-NEXT: aghi %r15, -168
63+
; LINUX-NEXT: .cfi_def_cfa_offset 328
64+
; LINUX-NEXT: brasl %r14, __extendhfsf2@PLT
65+
; LINUX-NEXT: la %r2, 164(%r15)
66+
; LINUX-NEXT: la %r3, 160(%r15)
67+
; LINUX-NEXT: brasl %r14, sincosf@PLT
68+
; LINUX-NEXT: le %f0, 160(%r15)
69+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
70+
; LINUX-NEXT: lmg %r14, %r15, 280(%r15)
71+
; LINUX-NEXT: br %r14
72+
%result = call { half, half } @llvm.sincos.f16(half %a)
73+
%result.1 = extractvalue { half, half } %result, 1
74+
ret half %result.1
75+
}
76+
77+
define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) #0 {
78+
; LINUX-LABEL: test_sincos_v2f16:
79+
; LINUX: # %bb.0:
80+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
81+
; LINUX-NEXT: .cfi_offset %r14, -48
82+
; LINUX-NEXT: .cfi_offset %r15, -40
83+
; LINUX-NEXT: aghi %r15, -200
84+
; LINUX-NEXT: .cfi_def_cfa_offset 360
85+
; LINUX-NEXT: std %f8, 192(%r15) # 8-byte Spill
86+
; LINUX-NEXT: std %f9, 184(%r15) # 8-byte Spill
87+
; LINUX-NEXT: std %f10, 176(%r15) # 8-byte Spill
88+
; LINUX-NEXT: .cfi_offset %f8, -168
89+
; LINUX-NEXT: .cfi_offset %f9, -176
90+
; LINUX-NEXT: .cfi_offset %f10, -184
91+
; LINUX-NEXT: ler %f8, %f2
92+
; LINUX-NEXT: brasl %r14, __extendhfsf2@PLT
93+
; LINUX-NEXT: la %r2, 172(%r15)
94+
; LINUX-NEXT: la %r3, 168(%r15)
95+
; LINUX-NEXT: brasl %r14, sincosf@PLT
96+
; LINUX-NEXT: ler %f0, %f8
97+
; LINUX-NEXT: brasl %r14, __extendhfsf2@PLT
98+
; LINUX-NEXT: la %r2, 164(%r15)
99+
; LINUX-NEXT: la %r3, 160(%r15)
100+
; LINUX-NEXT: brasl %r14, sincosf@PLT
101+
; LINUX-NEXT: le %f0, 172(%r15)
102+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
103+
; LINUX-NEXT: le %f1, 164(%r15)
104+
; LINUX-NEXT: ler %f8, %f0
105+
; LINUX-NEXT: ler %f0, %f1
106+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
107+
; LINUX-NEXT: le %f1, 168(%r15)
108+
; LINUX-NEXT: ler %f9, %f0
109+
; LINUX-NEXT: ler %f0, %f1
110+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
111+
; LINUX-NEXT: le %f1, 160(%r15)
112+
; LINUX-NEXT: ler %f10, %f0
113+
; LINUX-NEXT: ler %f0, %f1
114+
; LINUX-NEXT: brasl %r14, __truncsfhf2@PLT
115+
; LINUX-NEXT: ler %f6, %f0
116+
; LINUX-NEXT: ler %f0, %f8
117+
; LINUX-NEXT: ler %f2, %f9
118+
; LINUX-NEXT: ler %f4, %f10
119+
; LINUX-NEXT: ld %f8, 192(%r15) # 8-byte Reload
120+
; LINUX-NEXT: ld %f9, 184(%r15) # 8-byte Reload
121+
; LINUX-NEXT: ld %f10, 176(%r15) # 8-byte Reload
122+
; LINUX-NEXT: lmg %r14, %r15, 312(%r15)
123+
; LINUX-NEXT: br %r14
124+
%result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)
125+
ret { <2 x half>, <2 x half> } %result
126+
}
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
; RUN: llc -mtriple=s390x-linux-gnu < %s | FileCheck -check-prefix=LINUX %s
2+
; RUN: llc -mtriple=s390x-ibm-zos < %s | FileCheck -check-prefix=ZOS %s
3+
4+
; FIXME: half cases split out since they are broken on zos
5+
6+
; FIXME: Check ZOS function content
7+
8+
define { float, float } @test_sincos_f32(float %a) #0 {
9+
; LINUX-LABEL: test_sincos_f32:
10+
; LINUX: # %bb.0:
11+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
12+
; LINUX-NEXT: aghi %r15, -168
13+
; LINUX-NEXT: la %r2, 164(%r15)
14+
; LINUX-NEXT: la %r3, 160(%r15)
15+
; LINUX-NEXT: brasl %r14, sincosf@PLT
16+
; LINUX-NEXT: le %f0, 164(%r15)
17+
; LINUX-NEXT: le %f2, 160(%r15)
18+
; LINUX-NEXT: lmg %r14, %r15, 280(%r15)
19+
; LINUX-NEXT: br %r14
20+
%result = call { float, float } @llvm.sincos.f32(float %a)
21+
ret { float, float } %result
22+
}
23+
24+
define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) #0 {
25+
; LINUX-LABEL: test_sincos_v2f32:
26+
; LINUX: # %bb.0:
27+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
28+
; LINUX-NEXT: aghi %r15, -184
29+
; LINUX-NEXT: std %f8, 176(%r15) # 8-byte Spill
30+
; LINUX-NEXT: la %r2, 164(%r15)
31+
; LINUX-NEXT: la %r3, 160(%r15)
32+
; LINUX-NEXT: ler %f8, %f2
33+
; LINUX-NEXT: brasl %r14, sincosf@PLT
34+
; LINUX-NEXT: la %r2, 172(%r15)
35+
; LINUX-NEXT: la %r3, 168(%r15)
36+
; LINUX-NEXT: ler %f0, %f8
37+
; LINUX-NEXT: brasl %r14, sincosf@PLT
38+
; LINUX-NEXT: le %f0, 164(%r15)
39+
; LINUX-NEXT: le %f2, 172(%r15)
40+
; LINUX-NEXT: le %f4, 160(%r15)
41+
; LINUX-NEXT: le %f6, 168(%r15)
42+
; LINUX-NEXT: ld %f8, 176(%r15) # 8-byte Reload
43+
; LINUX-NEXT: lmg %r14, %r15, 296(%r15)
44+
; LINUX-NEXT: br %r14
45+
%result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)
46+
ret { <2 x float>, <2 x float> } %result
47+
}
48+
49+
define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) #0 {
50+
; LINUX-LABEL: test_sincos_v3f32:
51+
; LINUX: # %bb.0:
52+
; LINUX-NEXT: stmg %r13, %r15, 104(%r15)
53+
; LINUX-NEXT: aghi %r15, -192
54+
; LINUX-NEXT: std %f8, 184(%r15) # 8-byte Spill
55+
; LINUX-NEXT: std %f9, 176(%r15) # 8-byte Spill
56+
; LINUX-NEXT: lgr %r13, %r2
57+
; LINUX-NEXT: la %r2, 164(%r15)
58+
; LINUX-NEXT: la %r3, 160(%r15)
59+
; LINUX-NEXT: ler %f8, %f4
60+
; LINUX-NEXT: ler %f9, %f2
61+
; LINUX-NEXT: brasl %r14, sincosf@PLT
62+
; LINUX-NEXT: la %r2, 172(%r15)
63+
; LINUX-NEXT: la %r3, 168(%r15)
64+
; LINUX-NEXT: ler %f0, %f9
65+
; LINUX-NEXT: brasl %r14, sincosf@PLT
66+
; LINUX-NEXT: la %r2, 8(%r13)
67+
; LINUX-NEXT: la %r3, 24(%r13)
68+
; LINUX-NEXT: ler %f0, %f8
69+
; LINUX-NEXT: brasl %r14, sincosf@PLT
70+
; LINUX-NEXT: le %f0, 164(%r15)
71+
; LINUX-NEXT: le %f1, 172(%r15)
72+
; LINUX-NEXT: le %f2, 160(%r15)
73+
; LINUX-NEXT: lgdr %r0, %f0
74+
; LINUX-NEXT: lgdr %r1, %f1
75+
; LINUX-NEXT: lgdr %r2, %f2
76+
; LINUX-NEXT: le %f0, 168(%r15)
77+
; LINUX-NEXT: nilf %r0, 0
78+
; LINUX-NEXT: srlg %r1, %r1, 32
79+
; LINUX-NEXT: nilf %r2, 0
80+
; LINUX-NEXT: lgdr %r3, %f0
81+
; LINUX-NEXT: srlg %r3, %r3, 32
82+
; LINUX-NEXT: lr %r0, %r1
83+
; LINUX-NEXT: lr %r2, %r3
84+
; LINUX-NEXT: stg %r2, 16(%r13)
85+
; LINUX-NEXT: stg %r0, 0(%r13)
86+
; LINUX-NEXT: ld %f8, 184(%r15) # 8-byte Reload
87+
; LINUX-NEXT: ld %f9, 176(%r15) # 8-byte Reload
88+
; LINUX-NEXT: lmg %r13, %r15, 296(%r15)
89+
; LINUX-NEXT: br %r14
90+
%result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a)
91+
ret { <3 x float>, <3 x float> } %result
92+
}
93+
94+
define { double, double } @test_sincos_f64(double %a) #0 {
95+
; LINUX-LABEL: test_sincos_f64:
96+
; LINUX: # %bb.0:
97+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
98+
; LINUX-NEXT: aghi %r15, -176
99+
; LINUX-NEXT: la %r2, 168(%r15)
100+
; LINUX-NEXT: la %r3, 160(%r15)
101+
; LINUX-NEXT: brasl %r14, sincos@PLT
102+
; LINUX-NEXT: ld %f0, 168(%r15)
103+
; LINUX-NEXT: ld %f2, 160(%r15)
104+
; LINUX-NEXT: lmg %r14, %r15, 288(%r15)
105+
; LINUX-NEXT: br %r14
106+
%result = call { double, double } @llvm.sincos.f64(double %a)
107+
ret { double, double } %result
108+
}
109+
110+
define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) #0 {
111+
; LINUX-LABEL: test_sincos_v2f64:
112+
; LINUX: # %bb.0:
113+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
114+
; LINUX-NEXT: aghi %r15, -200
115+
; LINUX-NEXT: std %f8, 192(%r15) # 8-byte Spill
116+
; LINUX-NEXT: la %r2, 168(%r15)
117+
; LINUX-NEXT: la %r3, 160(%r15)
118+
; LINUX-NEXT: ldr %f8, %f2
119+
; LINUX-NEXT: brasl %r14, sincos@PLT
120+
; LINUX-NEXT: la %r2, 184(%r15)
121+
; LINUX-NEXT: la %r3, 176(%r15)
122+
; LINUX-NEXT: ldr %f0, %f8
123+
; LINUX-NEXT: brasl %r14, sincos@PLT
124+
; LINUX-NEXT: ld %f0, 168(%r15)
125+
; LINUX-NEXT: ld %f2, 184(%r15)
126+
; LINUX-NEXT: ld %f4, 160(%r15)
127+
; LINUX-NEXT: ld %f6, 176(%r15)
128+
; LINUX-NEXT: ld %f8, 192(%r15) # 8-byte Reload
129+
; LINUX-NEXT: lmg %r14, %r15, 312(%r15)
130+
; LINUX-NEXT: br %r14
131+
%result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)
132+
ret { <2 x double>, <2 x double> } %result
133+
}
134+
135+
define { fp128, fp128 } @test_sincos_f128(fp128 %a) #0 {
136+
; LINUX-LABEL: test_sincos_f128:
137+
; LINUX: # %bb.0:
138+
; LINUX-NEXT: stmg %r14, %r15, 112(%r15)
139+
; LINUX-NEXT: aghi %r15, -176
140+
; LINUX-NEXT: ld %f0, 0(%r3)
141+
; LINUX-NEXT: ld %f2, 8(%r3)
142+
; LINUX-NEXT: lgr %r3, %r2
143+
; LINUX-NEXT: la %r4, 16(%r2)
144+
; LINUX-NEXT: la %r2, 160(%r15)
145+
; LINUX-NEXT: std %f0, 160(%r15)
146+
; LINUX-NEXT: std %f2, 168(%r15)
147+
; LINUX-NEXT: brasl %r14, sincosl@PLT
148+
; LINUX-NEXT: lmg %r14, %r15, 288(%r15)
149+
; LINUX-NEXT: br %r14
150+
%result = call { fp128, fp128 } @llvm.sincos.f128(fp128 %a)
151+
ret { fp128, fp128 } %result
152+
}
153+
154+
define { <2 x fp128>, <2 x fp128> } @test_sincos_v2f128(<2 x fp128> %a) #0 {
155+
; LINUX-LABEL: test_sincos_v2f128:
156+
; LINUX: # %bb.0:
157+
; LINUX-NEXT: stmg %r13, %r15, 104(%r15)
158+
; LINUX-NEXT: aghi %r15, -208
159+
; LINUX-NEXT: std %f8, 200(%r15) # 8-byte Spill
160+
; LINUX-NEXT: std %f10, 192(%r15) # 8-byte Spill
161+
; LINUX-NEXT: lgr %r13, %r2
162+
; LINUX-NEXT: ld %f8, 0(%r3)
163+
; LINUX-NEXT: ld %f10, 8(%r3)
164+
; LINUX-NEXT: ld %f0, 16(%r3)
165+
; LINUX-NEXT: ld %f2, 24(%r3)
166+
; LINUX-NEXT: la %r3, 16(%r2)
167+
; LINUX-NEXT: la %r4, 48(%r2)
168+
; LINUX-NEXT: la %r2, 176(%r15)
169+
; LINUX-NEXT: std %f0, 176(%r15)
170+
; LINUX-NEXT: std %f2, 184(%r15)
171+
; LINUX-NEXT: brasl %r14, sincosl@PLT
172+
; LINUX-NEXT: la %r4, 32(%r13)
173+
; LINUX-NEXT: la %r2, 160(%r15)
174+
; LINUX-NEXT: std %f8, 160(%r15)
175+
; LINUX-NEXT: std %f10, 168(%r15)
176+
; LINUX-NEXT: lgr %r3, %r13
177+
; LINUX-NEXT: brasl %r14, sincosl@PLT
178+
; LINUX-NEXT: ld %f8, 200(%r15) # 8-byte Reload
179+
; LINUX-NEXT: ld %f10, 192(%r15) # 8-byte Reload
180+
; LINUX-NEXT: lmg %r13, %r15, 312(%r15)
181+
; LINUX-NEXT: br %r14
182+
%result = call { <2 x fp128>, <2 x fp128> } @llvm.sincos.v2f128(<2 x fp128> %a)
183+
ret { <2 x fp128>, <2 x fp128> } %result
184+
}
185+
186+
187+
; ZOS: .quad R(@@FSIN@B) * Offset 0 function descriptor of @@FSIN@B
188+
; ZOS: .quad V(@@FSIN@B)
189+
; ZOS: .quad R(@@FCOS@B) * Offset 16 function descriptor of @@FCOS@B
190+
; ZOS: .quad V(@@FCOS@B)
191+
; ZOS: .quad R(@@SSIN@B) * Offset 32 function descriptor of @@SSIN@B
192+
; ZOS: .quad V(@@SSIN@B)
193+
; ZOS: .quad R(@@SCOS@B) * Offset 48 function descriptor of @@SCOS@B
194+
; ZOS: .quad V(@@SCOS@B)
195+
; ZOS: .quad R(@@LSIN@B) * Offset 64 function descriptor of @@LSIN@B
196+
; ZOS: .quad V(@@LSIN@B)
197+
; ZOS: .quad R(@@LCOS@B) * Offset 80 function descriptor of @@LCOS@B
198+
; ZOS: .quad V(@@LCOS@B)
199+
200+
201+
attributes #0 = { nounwind }

0 commit comments

Comments
 (0)