86 lines · plain
1; RUN: llc < %s -tailcallopt -mtriple=x86_64-linux-gnu | FileCheck %s2 3; Check the GHC call convention works (x86-64)4 5@base = external dso_local global i64 ; assigned to register: R136@sp = external dso_local global i64 ; assigned to register: rbp7@hp = external dso_local global i64 ; assigned to register: R128@r1 = external dso_local global i64 ; assigned to register: rbx9@r2 = external dso_local global i64 ; assigned to register: R1410@r3 = external dso_local global i64 ; assigned to register: rsi11@r4 = external dso_local global i64 ; assigned to register: rdi12@r5 = external dso_local global i64 ; assigned to register: R813@r6 = external dso_local global i64 ; assigned to register: R914@splim = external dso_local global i64 ; assigned to register: R1515 16@f1 = external dso_local global float ; assigned to register: xmm117@f2 = external dso_local global float ; assigned to register: xmm218@f3 = external dso_local global float ; assigned to register: xmm319@f4 = external dso_local global float ; assigned to register: xmm420@d1 = external dso_local global double ; assigned to register: xmm521@d2 = external dso_local global double ; assigned to register: xmm622 23define void @zap(i64 %a, i64 %b) nounwind {24entry:25 ; CHECK: movq %rdi, %r1326 ; CHECK-NEXT: movq %rsi, %rbp27 ; CHECK-NEXT: callq addtwo28 %0 = call ghccc i64 @addtwo(i64 %a, i64 %b)29 ; CHECK: callq foo30 call void @foo() nounwind31 ret void32}33 34define ghccc i64 @addtwo(i64 %x, i64 %y) nounwind {35entry:36 ; CHECK: leaq (%r13,%rbp), %rax37 %0 = add i64 %x, %y38 ; CHECK-NEXT: ret39 ret i64 %040}41 42define ghccc void @foo() nounwind {43entry:44 ; CHECK: movsd d2(%rip), %xmm645 ; CHECK-NEXT: movsd d1(%rip), %xmm546 ; CHECK-NEXT: movss f4(%rip), %xmm447 ; CHECK-NEXT: movss f3(%rip), %xmm348 ; CHECK-NEXT: movss f2(%rip), %xmm249 ; CHECK-NEXT: movss f1(%rip), %xmm150 ; CHECK-NEXT: movq splim(%rip), %r1551 ; CHECK-NEXT: movq r6(%rip), %r952 ; CHECK-NEXT: movq r5(%rip), %r853 ; CHECK-NEXT: movq r4(%rip), %rdi54 ; CHECK-NEXT: movq r3(%rip), %rsi55 ; CHECK-NEXT: movq r2(%rip), %r1456 ; CHECK-NEXT: movq r1(%rip), %rbx57 ; CHECK-NEXT: movq hp(%rip), %r1258 ; CHECK-NEXT: movq sp(%rip), %rbp59 ; CHECK-NEXT: movq base(%rip), %r1360 %0 = load double, ptr @d261 %1 = load double, ptr @d162 %2 = load float, ptr @f463 %3 = load float, ptr @f364 %4 = load float, ptr @f265 %5 = load float, ptr @f166 %6 = load i64, ptr @splim67 %7 = load i64, ptr @r668 %8 = load i64, ptr @r569 %9 = load i64, ptr @r470 %10 = load i64, ptr @r371 %11 = load i64, ptr @r272 %12 = load i64, ptr @r173 %13 = load i64, ptr @hp74 %14 = load i64, ptr @sp75 %15 = load i64, ptr @base76 ; CHECK: jmp bar77 tail call ghccc void @bar( i64 %15, i64 %14, i64 %13, i64 %12, i64 %11,78 i64 %10, i64 %9, i64 %8, i64 %7, i64 %6,79 float %5, float %4, float %3, float %2, double %1,80 double %0 ) nounwind81 ret void82}83 84declare ghccc void @bar(i64, i64, i64, i64, i64, i64, i64, i64, i64, i64,85 float, float, float, float, double, double)86