| ; Check that the GHC calling convention works (s390x) | |
| ; | |
| ; RUN: llc -mtriple=s390x-ibm-linux < %s | FileCheck %s | |
| @base = external dso_local global i64 ; assigned to register: r7 | |
| @sp = external dso_local global i64 ; assigned to register: r8 | |
| @hp = external dso_local global i64 ; assigned to register: r10 | |
| @r1 = external dso_local global i64 ; assigned to register: r11 | |
| @r2 = external dso_local global i64 ; assigned to register: r12 | |
| @r3 = external dso_local global i64 ; assigned to register: r13 | |
| @r4 = external dso_local global i64 ; assigned to register: r6 | |
| @r5 = external dso_local global i64 ; assigned to register: r2 | |
| @r6 = external dso_local global i64 ; assigned to register: r3 | |
| @r7 = external dso_local global i64 ; assigned to register: r4 | |
| @r8 = external dso_local global i64 ; assigned to register: r5 | |
| @splim = external dso_local global i64 ; assigned to register: r9 | |
| @f1 = external dso_local global float ; assigned to register: s8 | |
| @f2 = external dso_local global float ; assigned to register: s9 | |
| @f3 = external dso_local global float ; assigned to register: s10 | |
| @f4 = external dso_local global float ; assigned to register: s11 | |
| @f5 = external dso_local global float ; assigned to register: s0 | |
| @f6 = external dso_local global float ; assigned to register: s1 | |
| @d1 = external dso_local global double ; assigned to register: d12 | |
| @d2 = external dso_local global double ; assigned to register: d13 | |
| @d3 = external dso_local global double ; assigned to register: d14 | |
| @d4 = external dso_local global double ; assigned to register: d15 | |
| @d5 = external dso_local global double ; assigned to register: d2 | |
| @d6 = external dso_local global double ; assigned to register: d3 | |
| define ghccc void @foo() nounwind { | |
| entry: | |
| ; CHECK: larl {{%r[0-9]+}}, d6 | |
| ; CHECK-NEXT: ld %f3, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, d5 | |
| ; CHECK-NEXT: ld %f2, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, d4 | |
| ; CHECK-NEXT: ld %f15, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, d3 | |
| ; CHECK-NEXT: ld %f14, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, d2 | |
| ; CHECK-NEXT: ld %f13, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, d1 | |
| ; CHECK-NEXT: ld %f12, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f6 | |
| ; CHECK-NEXT: le %f1, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f5 | |
| ; CHECK-NEXT: le %f0, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f4 | |
| ; CHECK-NEXT: le %f11, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f3 | |
| ; CHECK-NEXT: le %f10, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f2 | |
| ; CHECK-NEXT: le %f9, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: larl {{%r[0-9]+}}, f1 | |
| ; CHECK-NEXT: le %f8, 0({{%r[0-9]+}}) | |
| ; CHECK-NEXT: lgrl %r9, splim | |
| ; CHECK-NEXT: lgrl %r5, r8 | |
| ; CHECK-NEXT: lgrl %r4, r7 | |
| ; CHECK-NEXT: lgrl %r3, r6 | |
| ; CHECK-NEXT: lgrl %r2, r5 | |
| ; CHECK-NEXT: lgrl %r6, r4 | |
| ; CHECK-NEXT: lgrl %r13, r3 | |
| ; CHECK-NEXT: lgrl %r12, r2 | |
| ; CHECK-NEXT: lgrl %r11, r1 | |
| ; CHECK-NEXT: lgrl %r10, hp | |
| ; CHECK-NEXT: lgrl %r8, sp | |
| ; CHECK-NEXT: lgrl %r7, base | |
| %0 = load double, ptr @d6 | |
| %1 = load double, ptr @d5 | |
| %2 = load double, ptr @d4 | |
| %3 = load double, ptr @d3 | |
| %4 = load double, ptr @d2 | |
| %5 = load double, ptr @d1 | |
| %6 = load float, ptr @f6 | |
| %7 = load float, ptr @f5 | |
| %8 = load float, ptr @f4 | |
| %9 = load float, ptr @f3 | |
| %10 = load float, ptr @f2 | |
| %11 = load float, ptr @f1 | |
| %12 = load i64, ptr @splim | |
| %13 = load i64, ptr @r8 | |
| %14 = load i64, ptr @r7 | |
| %15 = load i64, ptr @r6 | |
| %16 = load i64, ptr @r5 | |
| %17 = load i64, ptr @r4 | |
| %18 = load i64, ptr @r3 | |
| %19 = load i64, ptr @r2 | |
| %20 = load i64, ptr @r1 | |
| %21 = load i64, ptr @hp | |
| %22 = load i64, ptr @sp | |
| %23 = load i64, ptr @base | |
| ; CHECK: brasl %r14, bar | |
| tail call ghccc void @bar(i64 %23, i64 %22, i64 %21, i64 %20, i64 %19, i64 %18, i64 %17, i64 %16, i64 %15, i64 %14, i64 %13, i64 %12, | |
| float %11, float %10, float %9, float %8, float %7, float %6, | |
| double %5, double %4, double %3, double %2, double %1, double %0) nounwind | |
| ret void | |
| } | |
| declare ghccc void @bar(i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, | |
| float, float, float, float, float, float, | |
| double, double, double, double, double, double) |