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