forked from OSchip/llvm-project
parent
0daeb63f03
commit
9acb978105
|
@ -46,6 +46,8 @@ def SIN_cm : SIN_Common<0x8D>;
|
|||
def COS_cm : COS_Common<0x8E>;
|
||||
} // End isVector = 1
|
||||
|
||||
defm : RsqPat<RECIPSQRT_IEEE_cm, f32>;
|
||||
|
||||
def : POW_Common <LOG_IEEE_cm, EXP_IEEE_cm, MUL>;
|
||||
|
||||
defm DIV_cm : DIV_Common<RECIP_IEEE_cm>;
|
||||
|
|
|
@ -69,6 +69,7 @@ def EXP_IEEE_eg : EXP_IEEE_Common<0x81>;
|
|||
def LOG_IEEE_eg : LOG_IEEE_Common<0x83>;
|
||||
def RECIP_CLAMPED_eg : RECIP_CLAMPED_Common<0x84>;
|
||||
def RECIPSQRT_IEEE_eg : RECIPSQRT_IEEE_Common<0x89>;
|
||||
defm : RsqPat<RECIPSQRT_IEEE_eg, f32>;
|
||||
def SIN_eg : SIN_Common<0x8D>;
|
||||
def COS_eg : COS_Common<0x8E>;
|
||||
|
||||
|
|
|
@ -1068,7 +1068,7 @@ class RECIP_CLAMPED_Common <bits<11> inst> : R600_1OP <
|
|||
}
|
||||
|
||||
class RECIP_IEEE_Common <bits<11> inst> : R600_1OP <
|
||||
inst, "RECIP_IEEE", [(set f32:$dst, (fdiv FP_ONE, f32:$src0))]
|
||||
inst, "RECIP_IEEE", [(set f32:$dst, (AMDGPUrcp f32:$src0))]
|
||||
> {
|
||||
let Itinerary = TransALU;
|
||||
}
|
||||
|
@ -1114,6 +1114,7 @@ def FNEG_R600 : FNEG<R600_Reg32>;
|
|||
// Helper patterns for complex intrinsics
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// FIXME: Should be predicated on unsafe fp math.
|
||||
multiclass DIV_Common <InstR600 recip_ieee> {
|
||||
def : Pat<
|
||||
(int_AMDGPU_div f32:$src0, f32:$src1),
|
||||
|
@ -1124,6 +1125,8 @@ def : Pat<
|
|||
(fdiv f32:$src0, f32:$src1),
|
||||
(MUL_IEEE $src0, (recip_ieee $src1))
|
||||
>;
|
||||
|
||||
def : RcpPat<recip_ieee, f32>;
|
||||
}
|
||||
|
||||
class TGSI_LIT_Z_Common <InstR600 mul_lit, InstR600 log_clamped, InstR600 exp_ieee>
|
||||
|
@ -1180,6 +1183,8 @@ let Predicates = [isR600] in {
|
|||
def TGSI_LIT_Z_r600 : TGSI_LIT_Z_Common<MUL_LIT_r600, LOG_CLAMPED_r600, EXP_IEEE_r600>;
|
||||
|
||||
def : Pat<(fsqrt f32:$src), (MUL $src, (RECIPSQRT_CLAMPED_r600 $src))>;
|
||||
defm : RsqPat<RECIPSQRT_IEEE_r600, f32>;
|
||||
|
||||
def : FROUNDPat <CNDGE_r600>;
|
||||
|
||||
def R600_ExportSwz : ExportSwzInst {
|
||||
|
|
|
@ -1,65 +1,47 @@
|
|||
; RUN: llc -march=r600 -mcpu=SI -mattr=-fp32-denormals -enable-unsafe-fp-math -verify-machineinstrs < %s | FileCheck -check-prefix=SI-UNSAFE -check-prefix=SI -check-prefix=FUNC %s
|
||||
; RUN: llc -march=r600 -mcpu=SI -mattr=-fp32-denormals -verify-machineinstrs < %s | FileCheck -check-prefix=SI-SAFE -check-prefix=SI -check-prefix=FUNC %s
|
||||
|
||||
; XUN: llc -march=r600 -mcpu=SI -mattr=+fp32-denormals -verify-machineinstrs < %s | FileCheck -check-prefix=SI-SAFE-SPDENORM -check-prefix=SI -check-prefix=FUNC %s
|
||||
|
||||
; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG-SAFE -check-prefix=FUNC %s
|
||||
; RUN: llc -march=r600 -mcpu=cayman -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
|
||||
|
||||
declare float @llvm.AMDGPU.rcp.f32(float) nounwind readnone
|
||||
declare double @llvm.AMDGPU.rcp.f64(double) nounwind readnone
|
||||
|
||||
|
||||
declare float @llvm.sqrt.f32(float) nounwind readnone
|
||||
declare double @llvm.sqrt.f64(double) nounwind readnone
|
||||
|
||||
; FUNC-LABEL: @rcp_f32
|
||||
; SI: V_RCP_F32_e32
|
||||
; EG: RECIP_IEEE
|
||||
define void @rcp_f32(float addrspace(1)* %out, float %src) nounwind {
|
||||
%rcp = call float @llvm.AMDGPU.rcp.f32(float %src) nounwind readnone
|
||||
store float %rcp, float addrspace(1)* %out, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; FUNC-LABEL: @rcp_f64
|
||||
; SI: V_RCP_F64_e32
|
||||
define void @rcp_f64(double addrspace(1)* %out, double %src) nounwind {
|
||||
%rcp = call double @llvm.AMDGPU.rcp.f64(double %src) nounwind readnone
|
||||
store double %rcp, double addrspace(1)* %out, align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
; FIXME: Evergreen only ever does unsafe fp math.
|
||||
; FUNC-LABEL: @rcp_pat_f32
|
||||
|
||||
; SI-SAFE: V_RCP_F32_e32
|
||||
; XSI-SAFE-SPDENORM-NOT: V_RCP_F32_e32
|
||||
|
||||
; EG: RECIP_IEEE
|
||||
|
||||
define void @rcp_pat_f32(float addrspace(1)* %out, float %src) nounwind {
|
||||
%rcp = fdiv float 1.0, %src
|
||||
store float %rcp, float addrspace(1)* %out, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; FUNC-LABEL: @rcp_pat_f64
|
||||
; SI: V_RCP_F64_e32
|
||||
define void @rcp_pat_f64(double addrspace(1)* %out, double %src) nounwind {
|
||||
%rcp = fdiv double 1.0, %src
|
||||
store double %rcp, double addrspace(1)* %out, align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
; FUNC-LABEL: @rsq_rcp_pat_f32
|
||||
; SI-UNSAFE: V_RSQ_F32_e32
|
||||
; SI-SAFE: V_SQRT_F32_e32
|
||||
; SI-SAFE: V_RCP_F32_e32
|
||||
|
||||
; EG: RECIPSQRT_IEEE
|
||||
define void @rsq_rcp_pat_f32(float addrspace(1)* %out, float %src) nounwind {
|
||||
%sqrt = call float @llvm.sqrt.f32(float %src) nounwind readnone
|
||||
%rcp = call float @llvm.AMDGPU.rcp.f32(float %sqrt) nounwind readnone
|
||||
store float %rcp, float addrspace(1)* %out, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; FUNC-LABEL: @rsq_rcp_pat_f64
|
||||
; SI-UNSAFE: V_RSQ_F64_e32
|
||||
; SI-SAFE-NOT: V_RSQ_F64_e32
|
||||
define void @rsq_rcp_pat_f64(double addrspace(1)* %out, double %src) nounwind {
|
||||
%sqrt = call double @llvm.sqrt.f64(double %src) nounwind readnone
|
||||
%rcp = call double @llvm.AMDGPU.rcp.f64(double %sqrt) nounwind readnone
|
||||
store double %rcp, double addrspace(1)* %out, align 8
|
||||
ret void
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue