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