Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

486 lines
15 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=sparc-linux-gnu < %s | FileCheck %s -check-prefixes=ALL,V8,V8-OPT
; RUN: llc -mtriple=sparcel-linux-gnu < %s | FileCheck %s -check-prefixes=ALL,V8,V8-OPT
; RUN: llc -mtriple=sparc-linux-gnu -O0 < %s | FileCheck %s -check-prefixes=ALL,V8,V8-UNOPT
; RUN: llc -mtriple=sparc-linux-gnu -mattr=v9 < %s | FileCheck %s -check-prefixes=ALL,V9
; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck %s -check-prefixes=ALL,SPARC64
define void @test_load_store(ptr %p, ptr %q) nounwind {
; ALL-LABEL: test_load_store:
; ALL: ! %bb.0:
; ALL-NEXT: lduh [%o0], %o0
; ALL-NEXT: retl
; ALL-NEXT: sth %o0, [%o1]
%a = load half, ptr %p
store half %a, ptr %q
ret void
}
define float @test_fpextend_float(ptr %p) nounwind {
; V8-LABEL: test_fpextend_float:
; V8: ! %bb.0:
; V8-NEXT: save %sp, -96, %sp
; V8-NEXT: call __extendhfsf2
; V8-NEXT: lduh [%i0], %o0
; V8-NEXT: ret
; V8-NEXT: restore
;
; V9-LABEL: test_fpextend_float:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -96, %sp
; V9-NEXT: call __extendhfsf2
; V9-NEXT: lduh [%i0], %o0
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fpextend_float:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -176, %sp
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: lduh [%i0], %o0
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = load half, ptr %p
%r = fpext half %a to float
ret float %r
}
define double @test_fpextend_double(ptr %p) nounwind {
; V8-LABEL: test_fpextend_double:
; V8: ! %bb.0:
; V8-NEXT: save %sp, -96, %sp
; V8-NEXT: call __extendhfsf2
; V8-NEXT: lduh [%i0], %o0
; V8-NEXT: fstod %f0, %f0
; V8-NEXT: ret
; V8-NEXT: restore
;
; V9-LABEL: test_fpextend_double:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -96, %sp
; V9-NEXT: call __extendhfsf2
; V9-NEXT: lduh [%i0], %o0
; V9-NEXT: fstod %f0, %f0
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fpextend_double:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -176, %sp
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: lduh [%i0], %o0
; SPARC64-NEXT: fstod %f0, %f0
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = load half, ptr %p
%r = fpext half %a to double
ret double %r
}
define void @test_fpextend_fp128(ptr %p, ptr %out) nounwind {
; V8-OPT-LABEL: test_fpextend_fp128:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -112, %sp
; V8-OPT-NEXT: call __extendhfsf2
; V8-OPT-NEXT: lduh [%i0], %o0
; V8-OPT-NEXT: st %f0, [%fp+-20]
; V8-OPT-NEXT: add %fp, -16, %i0
; V8-OPT-NEXT: st %i0, [%sp+64]
; V8-OPT-NEXT: call _Q_stoq
; V8-OPT-NEXT: ld [%fp+-20], %o0
; V8-OPT-NEXT: unimp 16
; V8-OPT-NEXT: ldd [%fp+-8], %f0
; V8-OPT-NEXT: ldd [%fp+-16], %f4
; V8-OPT-NEXT: std %f0, [%i1+8]
; V8-OPT-NEXT: std %f4, [%i1]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fpextend_fp128:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -112, %sp
; V8-UNOPT-NEXT: call __extendhfsf2
; V8-UNOPT-NEXT: lduh [%i0], %o0
; V8-UNOPT-NEXT: st %f0, [%fp+-20]
; V8-UNOPT-NEXT: add %fp, -16, %i0
; V8-UNOPT-NEXT: st %i0, [%sp+64]
; V8-UNOPT-NEXT: call _Q_stoq
; V8-UNOPT-NEXT: ld [%fp+-20], %o0
; V8-UNOPT-NEXT: unimp 16
; V8-UNOPT-NEXT: ldd [%fp+-16], %f4
; V8-UNOPT-NEXT: ! implicit-def: $q0
; V8-UNOPT-NEXT: fmovs %f4, %f0
; V8-UNOPT-NEXT: fmovs %f5, %f1
; V8-UNOPT-NEXT: ldd [%fp+-8], %f4
; V8-UNOPT-NEXT: fmovs %f4, %f2
; V8-UNOPT-NEXT: fmovs %f5, %f3
; V8-UNOPT-NEXT: fmovs %f2, %f4
; V8-UNOPT-NEXT: fmovs %f3, %f5
; V8-UNOPT-NEXT: std %f4, [%i1+8]
; V8-UNOPT-NEXT: ! kill: def $d0 killed $d0 killed $q0
; V8-UNOPT-NEXT: std %f0, [%i1]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fpextend_fp128:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -112, %sp
; V9-NEXT: call __extendhfsf2
; V9-NEXT: lduh [%i0], %o0
; V9-NEXT: st %f0, [%fp+-20]
; V9-NEXT: add %fp, -16, %i0
; V9-NEXT: st %i0, [%sp+64]
; V9-NEXT: call _Q_stoq
; V9-NEXT: ld [%fp+-20], %o0
; V9-NEXT: unimp 16
; V9-NEXT: ldd [%fp+-8], %f0
; V9-NEXT: ldd [%fp+-16], %f4
; V9-NEXT: std %f0, [%i1+8]
; V9-NEXT: std %f4, [%i1]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fpextend_fp128:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -192, %sp
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: lduh [%i0], %o0
; SPARC64-NEXT: add %fp, 2031, %o0
; SPARC64-NEXT: fmovs %f0, %f3
; SPARC64-NEXT: call _Qp_stoq
; SPARC64-NEXT: nop
; SPARC64-NEXT: ldd [%fp+2039], %f0
; SPARC64-NEXT: ldd [%fp+2031], %f4
; SPARC64-NEXT: std %f0, [%i1+8]
; SPARC64-NEXT: std %f4, [%i1]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = load half, ptr %p
%r = fpext half %a to fp128
store fp128 %r, ptr %out
ret void
}
define void @test_fptrunc_float(float %f, ptr %p) nounwind {
; V8-OPT-LABEL: test_fptrunc_float:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -96, %sp
; V8-OPT-NEXT: call __truncsfhf2
; V8-OPT-NEXT: mov %i0, %o0
; V8-OPT-NEXT: sth %o0, [%i1]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fptrunc_float:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -96, %sp
; V8-UNOPT-NEXT: mov %i0, %o0
; V8-UNOPT-NEXT: st %o0, [%fp+-4]
; V8-UNOPT-NEXT: call __truncsfhf2
; V8-UNOPT-NEXT: ld [%fp+-4], %f0
; V8-UNOPT-NEXT: sth %o0, [%i1]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fptrunc_float:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -96, %sp
; V9-NEXT: call __truncsfhf2
; V9-NEXT: mov %i0, %o0
; V9-NEXT: sth %o0, [%i1]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fptrunc_float:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -176, %sp
; SPARC64-NEXT: call __truncsfhf2
; SPARC64-NEXT: nop
; SPARC64-NEXT: sth %o0, [%i1]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = fptrunc float %f to half
store half %a, ptr %p
ret void
}
define void @test_fptrunc_double(double %d, ptr %p) nounwind {
; V8-OPT-LABEL: test_fptrunc_double:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -112, %sp
; V8-OPT-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V8-OPT-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V8-OPT-NEXT: std %i0, [%fp+-8]
; V8-OPT-NEXT: ldd [%fp+-8], %f0
; V8-OPT-NEXT: std %f0, [%fp+-16]
; V8-OPT-NEXT: call __truncdfhf2
; V8-OPT-NEXT: ldd [%fp+-16], %o0
; V8-OPT-NEXT: sth %o0, [%i2]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fptrunc_double:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -112, %sp
; V8-UNOPT-NEXT: mov %i1, %i3
; V8-UNOPT-NEXT: mov %i0, %i4
; V8-UNOPT-NEXT: ! implicit-def: $i0_i1
; V8-UNOPT-NEXT: mov %i4, %i0
; V8-UNOPT-NEXT: mov %i3, %i1
; V8-UNOPT-NEXT: std %i0, [%fp+-8]
; V8-UNOPT-NEXT: ldd [%fp+-8], %f0
; V8-UNOPT-NEXT: std %f0, [%fp+-16]
; V8-UNOPT-NEXT: ldd [%fp+-16], %i0
; V8-UNOPT-NEXT: mov %i0, %o0
; V8-UNOPT-NEXT: call __truncdfhf2
; V8-UNOPT-NEXT: mov %i1, %o1
; V8-UNOPT-NEXT: sth %o0, [%i2]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fptrunc_double:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -112, %sp
; V9-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1
; V9-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1
; V9-NEXT: std %i0, [%fp+-8]
; V9-NEXT: ldd [%fp+-8], %f0
; V9-NEXT: std %f0, [%fp+-16]
; V9-NEXT: call __truncdfhf2
; V9-NEXT: ldd [%fp+-16], %o0
; V9-NEXT: sth %o0, [%i2]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fptrunc_double:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -176, %sp
; SPARC64-NEXT: call __truncdfhf2
; SPARC64-NEXT: nop
; SPARC64-NEXT: sth %o0, [%i1]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = fptrunc double %d to half
store half %a, ptr %p
ret void
}
define void @test_fptrunc_fp128(ptr %dp, ptr %p) nounwind {
; V8-OPT-LABEL: test_fptrunc_fp128:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -112, %sp
; V8-OPT-NEXT: ldd [%i0], %f0
; V8-OPT-NEXT: ldd [%i0+8], %f4
; V8-OPT-NEXT: std %f4, [%fp+-8]
; V8-OPT-NEXT: add %fp, -16, %o0
; V8-OPT-NEXT: call __trunctfhf2
; V8-OPT-NEXT: std %f0, [%fp+-16]
; V8-OPT-NEXT: sth %o0, [%i1]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fptrunc_fp128:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -112, %sp
; V8-UNOPT-NEXT: ldd [%i0], %f4
; V8-UNOPT-NEXT: ! implicit-def: $q0
; V8-UNOPT-NEXT: fmovs %f4, %f0
; V8-UNOPT-NEXT: fmovs %f5, %f1
; V8-UNOPT-NEXT: ldd [%i0+8], %f4
; V8-UNOPT-NEXT: fmovs %f4, %f2
; V8-UNOPT-NEXT: fmovs %f5, %f3
; V8-UNOPT-NEXT: fmovs %f2, %f4
; V8-UNOPT-NEXT: fmovs %f3, %f5
; V8-UNOPT-NEXT: std %f4, [%fp+-8]
; V8-UNOPT-NEXT: ! kill: def $d0 killed $d0 killed $q0
; V8-UNOPT-NEXT: std %f0, [%fp+-16]
; V8-UNOPT-NEXT: call __trunctfhf2
; V8-UNOPT-NEXT: add %fp, -16, %o0
; V8-UNOPT-NEXT: sth %o0, [%i1]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fptrunc_fp128:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -112, %sp
; V9-NEXT: ldd [%i0], %f0
; V9-NEXT: ldd [%i0+8], %f4
; V9-NEXT: std %f4, [%fp+-8]
; V9-NEXT: add %fp, -16, %o0
; V9-NEXT: call __trunctfhf2
; V9-NEXT: std %f0, [%fp+-16]
; V9-NEXT: sth %o0, [%i1]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fptrunc_fp128:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -176, %sp
; SPARC64-NEXT: ldd [%i0], %f0
; SPARC64-NEXT: call __trunctfhf2
; SPARC64-NEXT: ldd [%i0+8], %f2
; SPARC64-NEXT: sth %o0, [%i1]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%d = load fp128, ptr %dp
%a = fptrunc fp128 %d to half
store half %a, ptr %p
ret void
}
define void @test_fadd(ptr %p, ptr %q) nounwind {
; V8-OPT-LABEL: test_fadd:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -104, %sp
; V8-OPT-NEXT: lduh [%i0], %i2
; V8-OPT-NEXT: call __extendhfsf2
; V8-OPT-NEXT: lduh [%i1], %o0
; V8-OPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill
; V8-OPT-NEXT: call __extendhfsf2
; V8-OPT-NEXT: mov %i2, %o0
; V8-OPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V8-OPT-NEXT: fadds %f0, %f1, %f0
; V8-OPT-NEXT: st %f0, [%fp+-4]
; V8-OPT-NEXT: call __truncsfhf2
; V8-OPT-NEXT: ld [%fp+-4], %o0
; V8-OPT-NEXT: sth %o0, [%i0]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fadd:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -104, %sp
; V8-UNOPT-NEXT: lduh [%i0], %i2
; V8-UNOPT-NEXT: st %i2, [%fp+-12] ! 4-byte Folded Spill
; V8-UNOPT-NEXT: call __extendhfsf2
; V8-UNOPT-NEXT: lduh [%i1], %o0
; V8-UNOPT-NEXT: ld [%fp+-12], %o0 ! 4-byte Folded Reload
; V8-UNOPT-NEXT: call __extendhfsf2
; V8-UNOPT-NEXT: st %f0, [%fp+-8]
; V8-UNOPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V8-UNOPT-NEXT: fadds %f0, %f1, %f0
; V8-UNOPT-NEXT: st %f0, [%fp+-4]
; V8-UNOPT-NEXT: call __truncsfhf2
; V8-UNOPT-NEXT: ld [%fp+-4], %o0
; V8-UNOPT-NEXT: sth %o0, [%i0]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fadd:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -104, %sp
; V9-NEXT: lduh [%i0], %i2
; V9-NEXT: call __extendhfsf2
; V9-NEXT: lduh [%i1], %o0
; V9-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill
; V9-NEXT: call __extendhfsf2
; V9-NEXT: mov %i2, %o0
; V9-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V9-NEXT: fadds %f0, %f1, %f0
; V9-NEXT: st %f0, [%fp+-4]
; V9-NEXT: call __truncsfhf2
; V9-NEXT: ld [%fp+-4], %o0
; V9-NEXT: sth %o0, [%i0]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fadd:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -192, %sp
; SPARC64-NEXT: lduh [%i0], %i2
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: lduh [%i1], %o0
; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: mov %i2, %o0
; SPARC64-NEXT: ld [%fp+2043], %f1 ! 4-byte Folded Reload
; SPARC64-NEXT: call __truncsfhf2
; SPARC64-NEXT: fadds %f0, %f1, %f1
; SPARC64-NEXT: sth %o0, [%i0]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = load half, ptr %p
%b = load half, ptr %q
%r = fadd half %a, %b
store half %r, ptr %p
ret void
}
define void @test_fmul(ptr %p, ptr %q) nounwind {
; V8-OPT-LABEL: test_fmul:
; V8-OPT: ! %bb.0:
; V8-OPT-NEXT: save %sp, -104, %sp
; V8-OPT-NEXT: lduh [%i0], %i2
; V8-OPT-NEXT: call __extendhfsf2
; V8-OPT-NEXT: lduh [%i1], %o0
; V8-OPT-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill
; V8-OPT-NEXT: call __extendhfsf2
; V8-OPT-NEXT: mov %i2, %o0
; V8-OPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V8-OPT-NEXT: fmuls %f0, %f1, %f0
; V8-OPT-NEXT: st %f0, [%fp+-4]
; V8-OPT-NEXT: call __truncsfhf2
; V8-OPT-NEXT: ld [%fp+-4], %o0
; V8-OPT-NEXT: sth %o0, [%i0]
; V8-OPT-NEXT: ret
; V8-OPT-NEXT: restore
;
; V8-UNOPT-LABEL: test_fmul:
; V8-UNOPT: ! %bb.0:
; V8-UNOPT-NEXT: save %sp, -104, %sp
; V8-UNOPT-NEXT: lduh [%i0], %i2
; V8-UNOPT-NEXT: st %i2, [%fp+-12] ! 4-byte Folded Spill
; V8-UNOPT-NEXT: call __extendhfsf2
; V8-UNOPT-NEXT: lduh [%i1], %o0
; V8-UNOPT-NEXT: ld [%fp+-12], %o0 ! 4-byte Folded Reload
; V8-UNOPT-NEXT: call __extendhfsf2
; V8-UNOPT-NEXT: st %f0, [%fp+-8]
; V8-UNOPT-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V8-UNOPT-NEXT: fmuls %f0, %f1, %f0
; V8-UNOPT-NEXT: st %f0, [%fp+-4]
; V8-UNOPT-NEXT: call __truncsfhf2
; V8-UNOPT-NEXT: ld [%fp+-4], %o0
; V8-UNOPT-NEXT: sth %o0, [%i0]
; V8-UNOPT-NEXT: ret
; V8-UNOPT-NEXT: restore
;
; V9-LABEL: test_fmul:
; V9: ! %bb.0:
; V9-NEXT: save %sp, -104, %sp
; V9-NEXT: lduh [%i0], %i2
; V9-NEXT: call __extendhfsf2
; V9-NEXT: lduh [%i1], %o0
; V9-NEXT: st %f0, [%fp+-8] ! 4-byte Folded Spill
; V9-NEXT: call __extendhfsf2
; V9-NEXT: mov %i2, %o0
; V9-NEXT: ld [%fp+-8], %f1 ! 4-byte Folded Reload
; V9-NEXT: fmuls %f0, %f1, %f0
; V9-NEXT: st %f0, [%fp+-4]
; V9-NEXT: call __truncsfhf2
; V9-NEXT: ld [%fp+-4], %o0
; V9-NEXT: sth %o0, [%i0]
; V9-NEXT: ret
; V9-NEXT: restore
;
; SPARC64-LABEL: test_fmul:
; SPARC64: ! %bb.0:
; SPARC64-NEXT: save %sp, -192, %sp
; SPARC64-NEXT: lduh [%i0], %i2
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: lduh [%i1], %o0
; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill
; SPARC64-NEXT: call __extendhfsf2
; SPARC64-NEXT: mov %i2, %o0
; SPARC64-NEXT: ld [%fp+2043], %f1 ! 4-byte Folded Reload
; SPARC64-NEXT: call __truncsfhf2
; SPARC64-NEXT: fmuls %f0, %f1, %f1
; SPARC64-NEXT: sth %o0, [%i0]
; SPARC64-NEXT: ret
; SPARC64-NEXT: restore
%a = load half, ptr %p
%b = load half, ptr %q
%r = fmul half %a, %b
store half %r, ptr %p
ret void
}