; 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) define inreg { fp128, fp128 } @f128_complex(fp128 %num) nounwind { ; SPARC32-LABEL: f128_complex: ; SPARC32: ! %bb.0: ; SPARC32-NEXT: save %sp, -192, %sp ; SPARC32-NEXT: ldd [%i0], %f0 ; SPARC32-NEXT: ldd [%i0+8], %f4 ; SPARC32-NEXT: std %f4, [%fp+-24] ; SPARC32-NEXT: std %f0, [%fp+-32] ; SPARC32-NEXT: std %f4, [%fp+-8] ; SPARC32-NEXT: add %fp, -16, %o0 ; SPARC32-NEXT: add %fp, -32, %o1 ; SPARC32-NEXT: call f128_complex_callee ; SPARC32-NEXT: std %f0, [%fp+-16] ; SPARC32-NEXT: sethi %hi(.LCPI2_0), %i0 ; SPARC32-NEXT: ldd [%i0+%lo(.LCPI2_0)], %f8 ; SPARC32-NEXT: add %i0, %lo(.LCPI2_0), %i0 ; SPARC32-NEXT: ldd [%i0+8], %f12 ; SPARC32-NEXT: std %f4, [%fp+-96] ; SPARC32-NEXT: std %f6, [%fp+-88] ! 16-byte Folded Spill ; SPARC32-NEXT: std %f8, [%fp+-80] ; SPARC32-NEXT: std %f12, [%fp+-72] ; SPARC32-NEXT: std %f2, [%fp+-56] ; SPARC32-NEXT: std %f0, [%fp+-64] ; SPARC32-NEXT: add %fp, -48, %i0 ; SPARC32-NEXT: add %fp, -64, %o0 ; SPARC32-NEXT: add %fp, -80, %o1 ; SPARC32-NEXT: call _Q_add ; SPARC32-NEXT: st %i0, [%sp+64] ; SPARC32-NEXT: unimp 16 ; SPARC32-NEXT: ldd [%fp+-48], %f0 ; SPARC32-NEXT: ldd [%fp+-40], %f2 ; SPARC32-NEXT: ldd [%fp+-96], %f4 ; SPARC32-NEXT: ldd [%fp+-88], %f6 ! 16-byte Folded Reload ; SPARC32-NEXT: ret ; SPARC32-NEXT: restore ; ; SPARC64-LABEL: f128_complex: ; SPARC64: ! %bb.0: ; SPARC64-NEXT: save %sp, -240, %sp ; SPARC64-NEXT: fmovd %f0, %f4 ; SPARC64-NEXT: fmovd %f2, %f6 ; SPARC64-NEXT: call f128_complex_callee ; SPARC64-NEXT: nop ; SPARC64-NEXT: std %f4, [%fp+1983] ; SPARC64-NEXT: std %f6, [%fp+1991] ! 16-byte Folded Spill ; SPARC64-NEXT: sethi %h44(.LCPI2_0), %i0 ; SPARC64-NEXT: add %i0, %m44(.LCPI2_0), %i0 ; SPARC64-NEXT: sllx %i0, 12, %i0 ; SPARC64-NEXT: ldd [%i0+%l44(.LCPI2_0)], %f4 ; SPARC64-NEXT: add %i0, %l44(.LCPI2_0), %i0 ; SPARC64-NEXT: ldd [%i0+8], %f8 ; SPARC64-NEXT: std %f2, [%fp+2023] ; SPARC64-NEXT: std %f0, [%fp+2015] ; SPARC64-NEXT: std %f4, [%fp+1999] ; SPARC64-NEXT: std %f8, [%fp+2007] ; SPARC64-NEXT: add %fp, 2031, %o0 ; SPARC64-NEXT: add %fp, 2015, %o1 ; SPARC64-NEXT: call _Qp_add ; SPARC64-NEXT: add %fp, 1999, %o2 ; SPARC64-NEXT: ldd [%fp+2031], %f0 ; SPARC64-NEXT: ldd [%fp+2039], %f2 ; SPARC64-NEXT: ldd [%fp+1983], %f4 ; SPARC64-NEXT: ldd [%fp+1991], %f6 ! 16-byte Folded Reload ; SPARC64-NEXT: ret ; SPARC64-NEXT: restore %call = call inreg { fp128, fp128 } @f128_complex_callee(fp128 %num, fp128 %num) %real = extractvalue { fp128, fp128 } %call, 0 %imag = extractvalue { fp128, fp128 } %call, 1 %add = fadd fp128 %real, 0xL00000000000000003FFF000000000000 %tmp = insertvalue { fp128, fp128 } poison, fp128 %add, 0 %ret = insertvalue { fp128, fp128 } %tmp, fp128 %imag, 1 ret { fp128, fp128 } %ret } declare inreg { fp128, fp128 } @f128_complex_callee(fp128 %a, fp128 %b)