Skip to content

Commit da8fb7c

Browse files
[SystemZ] Add tests for llvm.canonicalize.f(32|64).
These tests include only the floating point types supported in common code. Once a SystemZ-specific implementation for `f16` and `f128` is available, these tests will be expanded to include those types as well. The tests are heavily based on the equivalent tests for X86.
1 parent da0f89e commit da8fb7c

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --default-march s390x-unknown-linux-gnu --version 5
2+
; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z16 < %s | FileCheck %s -check-prefixes=Z16
3+
4+
define float @canonicalize_fp32(float %a) {
5+
; Z16-LABEL: canonicalize_fp32:
6+
; Z16: # %bb.0:
7+
; Z16-NEXT: vgmf %v1, 2, 8
8+
; Z16-NEXT: meebr %f0, %f1
9+
; Z16-NEXT: br %r14
10+
%canonicalized = call float @llvm.canonicalize.f32(float %a)
11+
ret float %canonicalized
12+
}
13+
14+
define double @canonicalize_fp64(double %a) {
15+
; Z16-LABEL: canonicalize_fp64:
16+
; Z16: # %bb.0:
17+
; Z16-NEXT: vgmg %v1, 2, 11
18+
; Z16-NEXT: mdbr %f0, %f1
19+
; Z16-NEXT: br %r14
20+
%canonicalized = call double @llvm.canonicalize.f64(double %a)
21+
ret double %canonicalized
22+
}
23+
24+
define void @canonicalize_ptr_f32(float * %out) {
25+
; Z16-LABEL: canonicalize_ptr_f32:
26+
; Z16: # %bb.0:
27+
; Z16-NEXT: vgmf %v0, 2, 8
28+
; Z16-NEXT: meeb %f0, 0(%r2)
29+
; Z16-NEXT: ste %f0, 0(%r2)
30+
; Z16-NEXT: br %r14
31+
%val = load float, float * %out
32+
%canonicalized = call float @llvm.canonicalize.f32(float %val)
33+
store float %canonicalized, float * %out
34+
ret void
35+
}
36+
37+
define void @canonicalize_ptr_f64(double * %out) {
38+
; Z16-LABEL: canonicalize_ptr_f64:
39+
; Z16: # %bb.0:
40+
; Z16-NEXT: vgmg %v0, 2, 11
41+
; Z16-NEXT: mdb %f0, 0(%r2)
42+
; Z16-NEXT: std %f0, 0(%r2)
43+
; Z16-NEXT: br %r14
44+
%val = load double, double * %out
45+
%canonicalized = call double @llvm.canonicalize.f64(double %val)
46+
store double %canonicalized, double * %out
47+
ret void
48+
}
49+
50+
define <4 x float> @canonicalize_v4f32(<4 x float> %a) {
51+
; Z16-LABEL: canonicalize_v4f32:
52+
; Z16: # %bb.0:
53+
; Z16-NEXT: vrepf %v0, %v24, 3
54+
; Z16-NEXT: vgmf %v1, 2, 8
55+
; Z16-NEXT: vrepf %v2, %v24, 2
56+
; Z16-NEXT: meebr %f0, %f1
57+
; Z16-NEXT: meebr %f2, %f1
58+
; Z16-NEXT: vrepf %v3, %v24, 1
59+
; Z16-NEXT: vmrhf %v0, %v2, %v0
60+
; Z16-NEXT: wfmsb %f2, %v24, %f1
61+
; Z16-NEXT: wfmsb %f1, %f3, %f1
62+
; Z16-NEXT: vmrhf %v1, %v2, %v1
63+
; Z16-NEXT: vmrhg %v24, %v1, %v0
64+
; Z16-NEXT: br %r14
65+
%canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %a)
66+
ret <4 x float> %canonicalized
67+
}
68+
69+
define <4 x double> @canonicalize_v4f64(<4 x double> %a) {
70+
; Z16-LABEL: canonicalize_v4f64:
71+
; Z16: # %bb.0:
72+
; Z16-NEXT: vgmg %v0, 2, 11
73+
; Z16-NEXT: vrepg %v2, %v24, 1
74+
; Z16-NEXT: wfmdb %f1, %v24, %f0
75+
; Z16-NEXT: mdbr %f2, %f0
76+
; Z16-NEXT: vmrhg %v24, %v1, %v2
77+
; Z16-NEXT: vrepg %v2, %v26, 1
78+
; Z16-NEXT: wfmdb %f1, %v26, %f0
79+
; Z16-NEXT: wfmdb %f0, %f2, %f0
80+
; Z16-NEXT: vmrhg %v26, %v1, %v0
81+
; Z16-NEXT: br %r14
82+
%canonicalized = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %a)
83+
ret <4 x double> %canonicalized
84+
}
85+
86+
define void @canonicalize_ptr_v4f32(<4 x float> * %out) {
87+
; Z16-LABEL: canonicalize_ptr_v4f32:
88+
; Z16: # %bb.0:
89+
; Z16-NEXT: vl %v0, 0(%r2), 3
90+
; Z16-NEXT: vrepf %v1, %v0, 3
91+
; Z16-NEXT: vgmf %v2, 2, 8
92+
; Z16-NEXT: vrepf %v3, %v0, 2
93+
; Z16-NEXT: meebr %f1, %f2
94+
; Z16-NEXT: meebr %f3, %f2
95+
; Z16-NEXT: vmrhf %v1, %v3, %v1
96+
; Z16-NEXT: wfmsb %f3, %f0, %f2
97+
; Z16-NEXT: vrepf %v0, %v0, 1
98+
; Z16-NEXT: meebr %f0, %f2
99+
; Z16-NEXT: vmrhf %v0, %v3, %v0
100+
; Z16-NEXT: vmrhg %v0, %v0, %v1
101+
; Z16-NEXT: vst %v0, 0(%r2), 3
102+
; Z16-NEXT: br %r14
103+
%val = load <4 x float>, <4 x float> * %out
104+
%canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %val)
105+
store <4 x float> %canonicalized, <4 x float> * %out
106+
ret void
107+
}
108+
109+
define void @canonicalize_ptr_v4f64(<4 x double> * %out) {
110+
; Z16-LABEL: canonicalize_ptr_v4f64:
111+
; Z16: # %bb.0:
112+
; Z16-NEXT: vl %v1, 16(%r2), 4
113+
; Z16-NEXT: vgmg %v2, 2, 11
114+
; Z16-NEXT: wfmdb %f3, %f1, %f2
115+
; Z16-NEXT: vrepg %v1, %v1, 1
116+
; Z16-NEXT: mdbr %f1, %f2
117+
; Z16-NEXT: vl %v0, 0(%r2), 4
118+
; Z16-NEXT: vmrhg %v1, %v3, %v1
119+
; Z16-NEXT: wfmdb %f3, %f0, %f2
120+
; Z16-NEXT: vrepg %v0, %v0, 1
121+
; Z16-NEXT: mdbr %f0, %f2
122+
; Z16-NEXT: vmrhg %v0, %v3, %v0
123+
; Z16-NEXT: vst %v0, 0(%r2), 4
124+
; Z16-NEXT: vst %v1, 16(%r2), 4
125+
; Z16-NEXT: br %r14
126+
%val = load <4 x double>, <4 x double> * %out
127+
%canonicalized = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %val)
128+
store <4 x double> %canonicalized, <4 x double> * %out
129+
ret void
130+
}
131+
132+
define void @canonicalize_undef(double * %out) {
133+
; Z16-LABEL: canonicalize_undef:
134+
; Z16: # %bb.0:
135+
; Z16-NEXT: llihh %r0, 32760
136+
; Z16-NEXT: stg %r0, 0(%r2)
137+
; Z16-NEXT: br %r14
138+
%canonicalized = call double @llvm.canonicalize.f64(double undef)
139+
store double %canonicalized, double * %out
140+
ret void
141+
}

0 commit comments

Comments
 (0)