blob: 6083c4415b3326c22590d62aeed9356fdf88aa48 [file] [log] [blame]
Ulrich Weigandcfa1d2b2016-02-19 14:10:21 +00001; Test incoming i128 arguments.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5; Do some arithmetic so that we can see the register being used.
6define void @f1(i128 *%r2, i16 %r3, i32 %r4, i64 %r5, i128 %r6) {
7; CHECK-LABEL: f1:
8; CHECK-DAG: lg [[REGL:%r[0-5]+]], 8(%r6)
9; CHECK-DAG: lg [[REGH:%r[0-5]+]], 0(%r6)
10; CHECK: algr [[REGL]], [[REGL]]
11; CHECK-NEXT: alcgr [[REGH]], [[REGH]]
12; CHECK-DAG: stg [[REGL]], 8(%r2)
13; CHECK-DAG: stg [[REGH]], 0(%r2)
14; CHECK: br %r14
15 %y = add i128 %r6, %r6
16 store i128 %y, i128 *%r2
17 ret void
18}
19
20; Test a case where the i128 address is passed on the stack.
21define void @f2(i128 *%r2, i16 %r3, i32 %r4, i64 %r5,
22 i128 %r6, i64 %s1, i64 %s2, i128 %s4) {
23; CHECK-LABEL: f2:
24; CHECK: lg [[ADDR:%r[1-5]+]], 176(%r15)
25; CHECK-DAG: lg [[REGL:%r[0-5]+]], 8([[ADDR]])
26; CHECK-DAG: lg [[REGH:%r[0-5]+]], 0([[ADDR]])
27; CHECK: algr [[REGL]], [[REGL]]
28; CHECK-NEXT: alcgr [[REGH]], [[REGH]]
29; CHECK-DAG: stg [[REGL]], 8(%r2)
30; CHECK-DAG: stg [[REGH]], 0(%r2)
31; CHECK: br %r14
32 %y = add i128 %s4, %s4
33 store i128 %y, i128 *%r2
34 ret void
35}
36
37; Explicit i128 return values are likewise passed indirectly.
38define i128 @f14(i128 %r3) {
39; CHECK-LABEL: f14:
40; CHECK-DAG: lg [[REGL:%r[0-5]+]], 8(%r3)
41; CHECK-DAG: lg [[REGH:%r[0-5]+]], 0(%r3)
42; CHECK: algr [[REGL]], [[REGL]]
43; CHECK-NEXT: alcgr [[REGH]], [[REGH]]
44; CHECK-DAG: stg [[REGL]], 8(%r2)
45; CHECK-DAG: stg [[REGH]], 0(%r2)
46; CHECK: br %r14
47 %y = add i128 %r3, %r3
48 ret i128 %y
49}
50