xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/ghc-cc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Check the GHC call convention works (aarch64)
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@base  = external global i64 ; assigned to register: r19
6*9880d681SAndroid Build Coastguard Worker@sp    = external global i64 ; assigned to register: r20
7*9880d681SAndroid Build Coastguard Worker@hp    = external global i64 ; assigned to register: r21
8*9880d681SAndroid Build Coastguard Worker@r1    = external global i64 ; assigned to register: r22
9*9880d681SAndroid Build Coastguard Worker@r2    = external global i64 ; assigned to register: r23
10*9880d681SAndroid Build Coastguard Worker@r3    = external global i64 ; assigned to register: r24
11*9880d681SAndroid Build Coastguard Worker@r4    = external global i64 ; assigned to register: r25
12*9880d681SAndroid Build Coastguard Worker@r5    = external global i64 ; assigned to register: r26
13*9880d681SAndroid Build Coastguard Worker@r6    = external global i64 ; assigned to register: r27
14*9880d681SAndroid Build Coastguard Worker@splim = external global i64 ; assigned to register: r28
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker@f1 = external global float  ; assigned to register: s8
17*9880d681SAndroid Build Coastguard Worker@f2 = external global float  ; assigned to register: s9
18*9880d681SAndroid Build Coastguard Worker@f3 = external global float  ; assigned to register: s10
19*9880d681SAndroid Build Coastguard Worker@f4 = external global float  ; assigned to register: s11
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker@d1 = external global double ; assigned to register: d12
22*9880d681SAndroid Build Coastguard Worker@d2 = external global double ; assigned to register: d13
23*9880d681SAndroid Build Coastguard Worker@d3 = external global double ; assigned to register: d14
24*9880d681SAndroid Build Coastguard Worker@d4 = external global double ; assigned to register: d15
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine ghccc i64 @addtwo(i64 %x, i64 %y) nounwind {
27*9880d681SAndroid Build Coastguard Workerentry:
28*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: addtwo
29*9880d681SAndroid Build Coastguard Worker  ; CHECK:       add      x0, x19, x20
30*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ret
31*9880d681SAndroid Build Coastguard Worker  %0 = add i64 %x, %y
32*9880d681SAndroid Build Coastguard Worker  ret i64 %0
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine void @zap(i64 %a, i64 %b) nounwind {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: zap
38*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT:   mov   {{x[0-9]+}}, sp
39*9880d681SAndroid Build Coastguard Worker  ; CHECK:       bl    addtwo
40*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  bl    foo
41*9880d681SAndroid Build Coastguard Worker  %0 = call ghccc i64 @addtwo(i64 %a, i64 %b)
42*9880d681SAndroid Build Coastguard Worker  call void @foo() nounwind
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine ghccc void @foo_i64 () nounwind {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: foo_i64
49*9880d681SAndroid Build Coastguard Worker  ; CHECK:       adrp    {{x[0-9]+}}, base
50*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ldr     x19, [{{x[0-9]+}}, :lo12:base]
51*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  bl      bar_i64
52*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ret
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* @base
55*9880d681SAndroid Build Coastguard Worker  tail call ghccc void @bar_i64( i64 %0 ) nounwind
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine ghccc void @foo_float () nounwind {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: foo_float
62*9880d681SAndroid Build Coastguard Worker  ; CHECK:       adrp    {{x[0-9]+}}, f1
63*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ldr     s8, [{{x[0-9]+}}, :lo12:f1]
64*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  bl      bar_float
65*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ret
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* @f1
68*9880d681SAndroid Build Coastguard Worker  tail call ghccc void @bar_float( float %0 ) nounwind
69*9880d681SAndroid Build Coastguard Worker  ret void
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine ghccc void @foo_double () nounwind {
73*9880d681SAndroid Build Coastguard Workerentry:
74*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: foo_double
75*9880d681SAndroid Build Coastguard Worker  ; CHECK:       adrp    {{x[0-9]+}}, d1
76*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ldr     d12, [{{x[0-9]+}}, :lo12:d1]
77*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  bl      bar_double
78*9880d681SAndroid Build Coastguard Worker  ; CHECK-NEXT:  ret
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  %0 = load double, double* @d1
81*9880d681SAndroid Build Coastguard Worker  tail call ghccc void @bar_double( double %0 ) nounwind
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdeclare ghccc void @foo ()
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdeclare ghccc void @bar_i64 (i64)
88*9880d681SAndroid Build Coastguard Workerdeclare ghccc void @bar_float (float)
89*9880d681SAndroid Build Coastguard Workerdeclare ghccc void @bar_double (double)
90