brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 41559b2 Raw
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