Files
clang-p2996/llvm/test/CodeGen/SystemZ/ghc-cc-01.ll
Kai Nacke a1710eb3cd [SystemZ][NFC] Opaque pointer migration.
The LIT test cases were migrated with the script provided by
Nikita Popov.

No manual changes were made. Committed without review since
no functional changes, after consultation with uweigand.
2022-10-11 21:09:43 +00:00

104 lines
4.3 KiB
LLVM

; 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)