; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=sparc   | FileCheck %s --check-prefix=SPARC32
; RUN: llc < %s -mtriple=sparcv9 | FileCheck %s --check-prefix=SPARC64

define fp128 @f128_direct(fp128 %num) nounwind {
; SPARC32-LABEL: f128_direct:
; SPARC32:       ! %bb.0:
; SPARC32-NEXT:    save %sp, -144, %sp
; SPARC32-NEXT:    ldd [%i0], %f0
; SPARC32-NEXT:    ldd [%i0+8], %f4
; SPARC32-NEXT:    ld [%fp+64], %i0
; SPARC32-NEXT:    add %fp, -16, %i1
; SPARC32-NEXT:    st %i1, [%sp+64]
; SPARC32-NEXT:    std %f4, [%fp+-40]
; SPARC32-NEXT:    std %f0, [%fp+-48]
; SPARC32-NEXT:    std %f4, [%fp+-24]
; SPARC32-NEXT:    add %fp, -32, %o0
; SPARC32-NEXT:    add %fp, -48, %o1
; SPARC32-NEXT:    call f128_callee
; SPARC32-NEXT:    std %f0, [%fp+-32]
; SPARC32-NEXT:    unimp 16
; SPARC32-NEXT:    ldd [%fp+-8], %f0
; SPARC32-NEXT:    ldd [%fp+-16], %f4
; SPARC32-NEXT:    std %f0, [%i0+8]
; SPARC32-NEXT:    std %f4, [%i0]
; SPARC32-NEXT:    ret
; SPARC32-NEXT:    restore
;
; SPARC64-LABEL: f128_direct:
; SPARC64:       ! %bb.0:
; SPARC64-NEXT:    save %sp, -176, %sp
; SPARC64-NEXT:    fmovd %f0, %f4
; SPARC64-NEXT:    fmovd %f2, %f6
; SPARC64-NEXT:    call f128_callee
; SPARC64-NEXT:    nop
; SPARC64-NEXT:    ret
; SPARC64-NEXT:    restore
    %ret = call fp128 @f128_callee(fp128 %num, fp128 %num)
    ret fp128 %ret
}
declare fp128 @f128_callee(fp128 %a, fp128 %b)

define fp128 @f128_direct_spill(i32 %o0, i32 %o1, i32 %o2, i32 %o3, i32 %o4, i32 %o5, i32 %ss0, fp128 %num) nounwind {
; SPARC32-LABEL: f128_direct_spill:
; SPARC32:       ! %bb.0:
; SPARC32-NEXT:    save %sp, -136, %sp
; SPARC32-NEXT:    ld [%fp+96], %g2
; SPARC32-NEXT:    ldd [%g2], %f0
; SPARC32-NEXT:    ldd [%g2+8], %f4
; SPARC32-NEXT:    ld [%fp+64], %l0
; SPARC32-NEXT:    mov %i5, %o5
; SPARC32-NEXT:    mov %i4, %o4
; SPARC32-NEXT:    mov %i3, %o3
; SPARC32-NEXT:    mov %i2, %o2
; SPARC32-NEXT:    mov %i1, %o1
; SPARC32-NEXT:    mov %i0, %o0
; SPARC32-NEXT:    add %fp, -32, %i0
; SPARC32-NEXT:    st %i0, [%sp+92]
; SPARC32-NEXT:    add %fp, -16, %i0
; SPARC32-NEXT:    st %i0, [%sp+64]
; SPARC32-NEXT:    std %f4, [%fp+-24]
; SPARC32-NEXT:    call f128_callee_spill
; SPARC32-NEXT:    std %f0, [%fp+-32]
; SPARC32-NEXT:    unimp 16
; SPARC32-NEXT:    ldd [%fp+-8], %f0
; SPARC32-NEXT:    ldd [%fp+-16], %f4
; SPARC32-NEXT:    std %f0, [%l0+8]
; SPARC32-NEXT:    std %f4, [%l0]
; SPARC32-NEXT:    ret
; SPARC32-NEXT:    restore
;
; SPARC64-LABEL: f128_direct_spill:
; SPARC64:       ! %bb.0:
; SPARC64-NEXT:    save %sp, -192, %sp
; SPARC64-NEXT:    fmovd %f16, %f12
; SPARC64-NEXT:    fmovd %f18, %f14
; SPARC64-NEXT:    mov %i5, %o5
; SPARC64-NEXT:    mov %i4, %o4
; SPARC64-NEXT:    mov %i3, %o3
; SPARC64-NEXT:    mov %i2, %o2
; SPARC64-NEXT:    mov %i1, %o1
; SPARC64-NEXT:    call f128_callee_spill
; SPARC64-NEXT:    mov %i0, %o0
; SPARC64-NEXT:    ret
; SPARC64-NEXT:    restore
    %ret = call fp128 @f128_callee_spill(i32 %o0, i32 %o1, i32 %o2, i32 %o3, i32 %o4, i32 %o5, fp128 %num)
    ret fp128 %ret
}
declare fp128 @f128_callee_spill(i32 %o0, i32 %o1, i32 %o2, i32 %o3, i32 %o4, i32 %o5, fp128 %a)
