Revert "[AArch64] Add DAG combine for extract extend pattern"
[oota-llvm.git] / test / CodeGen / AArch64 / ghc-cc.ll
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
54   %0 = load i64, i64* @base
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
67   %0 = load float, float* @f1
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
80   %0 = load double, double* @d1
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)