[Mesa-dev] [PATCH 1/2] R600/SI: Add FMA pattern

Tom Stellard tom at stellard.net
Fri Aug 9 20:19:34 PDT 2013


On Fri, Aug 09, 2013 at 02:59:07PM +0200, Niels Ole Salscheider wrote:
> ---

This series is:

Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

Your implementation of  SITargetLowering::isFMAFasterThanFMulAndFAdd()
is correct for SI, not sure about Sea Islands, but we can always fix it
later.  Feel free to commit these patches whenever you want.

-Tom

>  lib/Target/R600/SIInstructions.td |  8 ++++++--
>  test/CodeGen/R600/fma.ll          | 31 +++++++++++++++++++++++++++++++
>  2 Dateien geändert, 37 Zeilen hinzugefügt(+), 2 Zeilen entfernt(-)
>  create mode 100644 test/CodeGen/R600/fma.ll
> 
> diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td
> index dc41885..dc14609 100644
> --- a/lib/Target/R600/SIInstructions.td
> +++ b/lib/Target/R600/SIInstructions.td
> @@ -1007,8 +1007,12 @@ def V_BFE_U32 : VOP3_32 <0x00000148, "V_BFE_U32", []>;
>  def V_BFE_I32 : VOP3_32 <0x00000149, "V_BFE_I32", []>;
>  def V_BFI_B32 : VOP3_32 <0x0000014a, "V_BFI_B32", []>;
>  defm : BFIPatterns <V_BFI_B32>;
> -def V_FMA_F32 : VOP3_32 <0x0000014b, "V_FMA_F32", []>;
> -def V_FMA_F64 : VOP3_64 <0x0000014c, "V_FMA_F64", []>;
> +def V_FMA_F32 : VOP3_32 <0x0000014b, "V_FMA_F32",
> +  [(set f32:$dst, (fma f32:$src0, f32:$src1, f32:$src2))]
> +>;
> +def V_FMA_F64 : VOP3_64 <0x0000014c, "V_FMA_F64",
> +  [(set f64:$dst, (fma f64:$src0, f64:$src1, f64:$src2))]
> +>;
>  //def V_LERP_U8 : VOP3_U8 <0x0000014d, "V_LERP_U8", []>;
>  def V_ALIGNBIT_B32 : VOP3_32 <0x0000014e, "V_ALIGNBIT_B32", []>;
>  def : ROTRPattern <V_ALIGNBIT_B32>;
> diff --git a/test/CodeGen/R600/fma.ll b/test/CodeGen/R600/fma.ll
> new file mode 100644
> index 0000000..afef970
> --- /dev/null
> +++ b/test/CodeGen/R600/fma.ll
> @@ -0,0 +1,31 @@
> +; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s
> +
> +; CHECK: @fma_f32
> +; CHECK: V_FMA_F32 {{VGPR[0-9]+, VGPR[0-9]+, VGPR[0-9]+, VGPR[0-9]+}}
> +
> +define void @fma_f32(float addrspace(1)* %out, float addrspace(1)* %in1,
> +                     float addrspace(1)* %in2, float addrspace(1)* %in3) {
> +   %r0 = load float addrspace(1)* %in1
> +   %r1 = load float addrspace(1)* %in2
> +   %r2 = load float addrspace(1)* %in3
> +   %r3 = tail call float @llvm.fma.f32(float %r0, float %r1, float %r2)
> +   store float %r3, float addrspace(1)* %out
> +   ret void
> +}
> +
> +declare float @llvm.fma.f32(float, float, float)
> +
> +; CHECK: @fma_f64
> +; CHECK: V_FMA_F64 {{VGPR[0-9]+_VGPR[0-9]+, VGPR[0-9]+_VGPR[0-9]+, VGPR[0-9]+_VGPR[0-9]+, VGPR[0-9]+_VGPR[0-9]+}}
> +
> +define void @fma_f64(double addrspace(1)* %out, double addrspace(1)* %in1,
> +                     double addrspace(1)* %in2, double addrspace(1)* %in3) {
> +   %r0 = load double addrspace(1)* %in1
> +   %r1 = load double addrspace(1)* %in2
> +   %r2 = load double addrspace(1)* %in3
> +   %r3 = tail call double @llvm.fma.f64(double %r0, double %r1, double %r2)
> +   store double %r3, double addrspace(1)* %out
> +   ret void
> +}
> +
> +declare double @llvm.fma.f64(double, double, double)
> -- 
> 1.7.11.7
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list