xref: /llvm-project/llvm/test/CodeGen/SystemZ/call-zos-01.ll (revision c17040599666c1f14906a899cabcf545c2c85744)
1; Test the passing of scalar values in GPRs, FPRs in 64-bit calls on z/OS.
2;
3; RUN: llc < %s -mtriple=s390x-ibm-zos -mcpu=z10 | FileCheck %s
4
5; CHECK-LABEL: call_char:
6; CHECK: lghi  1,8
7define i8 @call_char(){
8  %retval = call i8 (i8) @pass_char(i8 8)
9  ret i8 %retval
10}
11
12; CHECK-LABEL: call_short:
13; CHECK: lghi  1,16
14define i16 @call_short() {
15entry:
16  %retval = call i16 (i16) @pass_short(i16 16)
17  ret i16 %retval
18}
19
20; CHECK-LABEL: call_int:
21; CHECK: lghi  1,32
22; CHECK: lghi  2,33
23define i32 @call_int() {
24entry:
25  %retval = call i32 (i32, i32) @pass_int(i32 32, i32 33)
26  ret i32 %retval
27}
28
29; CHECK-LABEL: call_long:
30; CHECK: lghi  1,64
31; CHECK: lghi  2,65
32; CHECK: lghi  3,66
33define i64 @call_long() {
34entry:
35  %retval = call i64 (i64, i64, i64) @pass_long(i64 64, i64 65, i64 66)
36  ret i64 %retval
37}
38
39; CHECK-LABEL: call_ptr:
40; CHECK: lgr 1,2
41define i32 @call_ptr(ptr %p1, ptr %p2) {
42entry:
43  %retval = call i32 (ptr) @pass_ptr(ptr %p2)
44  ret i32 %retval
45}
46
47; CHECK-LABEL: call_integrals:
48; CHECK: lghi  1,64
49; CHECK: lghi  2,32
50; CHECK: lghi  3,16
51define i64 @call_integrals() {
52entry:
53  %retval = call i64 (i64, i32, i16, i64) @pass_integrals0(i64 64, i32 32, i16 16, i64 128)
54  ret i64 %retval
55}
56
57; CHECK-LABEL: pass_char:
58; CHECK: lgr 3,1
59define signext i8 @pass_char(i8 signext %arg) {
60entry:
61  ret i8 %arg
62}
63
64; CHECK-LABEL: pass_short:
65; CHECK: lgr 3,1
66define signext i16 @pass_short(i16 signext %arg) {
67entry:
68  ret i16 %arg
69}
70
71; CHECK-LABEL: pass_int:
72; CHECK: lgr 3,2
73define signext i32 @pass_int(i32 signext %arg0, i32 signext %arg1) {
74entry:
75  ret i32 %arg1
76}
77
78; CHECK-LABEL: pass_long:
79; CHECK: agr 1,2
80; CHECK: agr 3,1
81define signext i64 @pass_long(i64 signext %arg0, i64 signext %arg1, i64 signext %arg2) {
82entry:
83  %N = add i64 %arg0, %arg1
84  %M = add i64 %N, %arg2
85  ret i64 %M
86}
87
88; CHECK-LABEL: pass_integrals0:
89; CHECK: ag  2,2200(4)
90; CHECK-NEXT: lgr 3,2
91define signext i64 @pass_integrals0(i64 signext %arg0, i32 signext %arg1, i16 signext %arg2, i64 signext %arg3) {
92entry:
93  %N = sext i32 %arg1 to i64
94  %M = add i64 %arg3, %N
95  ret i64 %M
96}
97
98; CHECK-LABEL: call_float:
99; CHECK: le 0,0({{[0-9]}})
100define float @call_float() {
101entry:
102  %ret = call float (float) @pass_float(float 0x400921FB60000000)
103  ret float %ret
104}
105
106; CHECK-LABEL: call_double:
107; CHECK: larl  [[GENREG:[0-9]+]],L#{{CPI[0-9]+_[0-9]+}}
108; CHECK-NEXT: ld  0,0([[GENREG]])
109define double @call_double() {
110entry:
111  %ret = call double (double) @pass_double(double 3.141000e+00)
112  ret double %ret
113}
114
115; CHECK-LABEL: call_longdouble:
116; CHECK: larl  [[GENREG:[0-9]+]],L#{{CPI[0-9]+_[0-9]+}}
117; CHECK-NEXT: ld  0,0([[GENREG]])
118; CHECK-NEXT: ld  2,8([[GENREG]])
119define fp128 @call_longdouble() {
120entry:
121  %ret = call fp128 (fp128) @pass_longdouble(fp128 0xLE0FC1518450562CD4000921FB5444261)
122  ret fp128 %ret
123}
124
125; CHECK-LABEL: call_floats0
126; CHECK: larl  [[GENREG:[0-9]+]],L#{{CPI[0-9]+_[0-9]+}}
127; CHECK-NEXT: ld  1,0([[GENREG]])
128; CHECK-NEXT: ld  3,8([[GENREG]])
129; CHECK: lxr 5,0
130; CHECK: lxr 0,1
131; CHECK: lxr 4,5
132define i64 @call_floats0(fp128 %arg0, double %arg1) {
133entry:
134  %ret = call i64 (fp128, fp128, double) @pass_floats0(fp128 0xLE0FC1518450562CD4000921FB5444261, fp128 %arg0, double %arg1)
135  ret i64 %ret
136}
137
138; CHECK-LABEL: call_floats1
139; CHECK: lxr 1,0
140; CHECK: ldr 0,4
141; CHECK: lxr 4,1
142define i64 @call_floats1(fp128 %arg0, double %arg1) {
143entry:
144  %ret = call i64 (double, fp128) @pass_floats1(double %arg1, fp128 %arg0)
145  ret i64 %ret
146}
147
148; CHECK-LABEL: pass_float:
149; CHECK: larl  1,L#{{CPI[0-9]+_[0-9]+}}
150; CHECK: aeb 0,0(1)
151define float @pass_float(float %arg) {
152entry:
153  %X = fadd float %arg, 0x400821FB60000000
154  ret float %X
155}
156
157; CHECK-LABEL: pass_double:
158; CHECK: larl  1,L#{{CPI[0-9]+_[0-9]+}}
159; CHECK: adb 0,0(1)
160define double @pass_double(double %arg) {
161entry:
162  %X = fadd double %arg, 1.414213e+00
163  ret double %X
164}
165
166; CHECK-LABEL: pass_longdouble
167; CHECK: larl  1,L#{{CPI[0-9]+_[0-9]+}}
168; CHECK: lxdb  1,0(1)
169; CHECK: axbr  0,1
170define fp128 @pass_longdouble(fp128 %arg) {
171entry:
172  %X = fadd fp128 %arg, 0xL10000000000000004000921FB53C8D4F
173  ret fp128 %X
174}
175
176; CHECK-LABEL: pass_floats0
177; CHECK: larl  1,L#{{CPI[0-9]+_[0-9]+}}
178; CHECK: axbr  0,4
179; CHECK: axbr  1,0
180; CHECK: cxbr  1,5
181define i64 @pass_floats0(fp128 %arg0, fp128 %arg1, double %arg2) {
182  %X = fadd fp128 %arg0, %arg1
183  %arg2_ext = fpext double %arg2 to fp128
184  %Y = fadd fp128 %X, %arg2_ext
185  %ret_bool = fcmp ueq fp128 %Y, 0xLE0FC1518450562CD4000921FB5444261
186  %ret = sext i1 %ret_bool to i64
187  ret i64 %ret
188}
189
190declare i64 @pass_floats1(double %arg0, fp128 %arg1)
191declare i32 @pass_ptr(ptr %arg)
192