mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-04 19:38:22 +00:00
2b70009a94
I wanted to implement this as a target independent expansion, however when targets say they want to expand FP_TO_FP16 what they actually want is the unsafe math expansion when possible and expansion to a libcall in all other cases. The only way to make this work as a target independent would be to add logic to target's TargetLowering construction to mark theses nodes as Expand when LegalizeDAG can use the unsafe expansion and mark them as LibCall when it cannot. I think this would be possible, but I think it would be too fragile and complex as it would require targets to keep their expansion logic up to date with the code in LegalizeDAG. Reviewers: bogner, ab, t.p.northover, arsenm Subscribers: wdng, llvm-commits, nhaehnle Differential Revision: https://reviews.llvm.org/D25999 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285704 91177308-0d34-0410-b5e6-96231b3b80d8
58 lines
2.0 KiB
LLVM
58 lines
2.0 KiB
LLVM
; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
|
; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
|
; RUN: llc -march=amdgcn -mcpu=tonga -enable-unsafe-fp-math -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GCN-UNSAFE %s
|
|
|
|
; FUNC-LABEL: {{^}}fptrunc_f64_to_f32:
|
|
; GCN: v_cvt_f32_f64_e32 {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}
|
|
define void @fptrunc_f64_to_f32(float addrspace(1)* %out, double %in) {
|
|
%result = fptrunc double %in to float
|
|
store float %result, float addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; FUNC-LABEL: {{^}}fptrunc_f64_to_f16:
|
|
; GCN-NOT: v_cvt
|
|
; GCN-FAST: v_cvt_f32_f64_e32 [[F32:v[0-9]+]]
|
|
; GCN-FAST: v_cvt_f16_f32_e32 v[0-9]+, [[F32]]
|
|
define void @fptrunc_f64_to_f16(i16 addrspace(1)* %out, double %in) {
|
|
%result = fptrunc double %in to half
|
|
%result_i16 = bitcast half %result to i16
|
|
store i16 %result_i16, i16 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; FUNC-LABEL: {{^}}fptrunc_v2f64_to_v2f32:
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
define void @fptrunc_v2f64_to_v2f32(<2 x float> addrspace(1)* %out, <2 x double> %in) {
|
|
%result = fptrunc <2 x double> %in to <2 x float>
|
|
store <2 x float> %result, <2 x float> addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; FUNC-LABEL: {{^}}fptrunc_v4f64_to_v4f32:
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
define void @fptrunc_v4f64_to_v4f32(<4 x float> addrspace(1)* %out, <4 x double> %in) {
|
|
%result = fptrunc <4 x double> %in to <4 x float>
|
|
store <4 x float> %result, <4 x float> addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; FUNC-LABEL: {{^}}fptrunc_v8f64_to_v8f32:
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
; GCN: v_cvt_f32_f64_e32
|
|
define void @fptrunc_v8f64_to_v8f32(<8 x float> addrspace(1)* %out, <8 x double> %in) {
|
|
%result = fptrunc <8 x double> %in to <8 x float>
|
|
store <8 x float> %result, <8 x float> addrspace(1)* %out
|
|
ret void
|
|
}
|