r220989 - [PowerPC] Initial VSX intrinsic support, with min/max for vector double

Bill Schmidt wschmidt at linux.vnet.ibm.com
Fri Oct 31 18:46:01 PDT 2014


On Sat, 2014-11-01 at 00:55 +0000, Eric Christopher wrote:
>         
>         
>          bool PPCTargetInfo::hasFeature(StringRef Feature) const {
>         -  return Feature == "powerpc";
>         +  return (Feature == "powerpc" ||
>         +         (Feature == "vsx" && HasVSX) ||
>         +         (Feature == "power8-vector" && HasP8Vector));
>          }

> 
> 
> Can you make this a StringSwitch?

Sure.
> 
> Also, feature of "power8-vector"? What's that supposed to be?

This corresponds to -mp8-vector.  VMX (Altivec) has been around for a
while.  VSX was introduced in POWER7.  POWER8 added a bunch of
extensions to both the VMX and VSX instruction sets, which are
enabled/disabled by the -mp8-vector switch on gcc.  The switch is in
existence for LLVM, although none of the P8 instructions have been added
yet.

In addition to enabling more instructions, -mp8-vector also indicates
that unaligned 16-byte references have significantly improved
performance.

I figured I would add this as long as the VSX feature was going in, as I
expect we'll need to test it soon enough.

- Bill
> 
> -eric
> 
> 
>  
>         
>         Modified: cfe/trunk/lib/Headers/altivec.h
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/altivec.h?rev=220989&r1=220988&r2=220989&view=diff
>         ==============================================================================
>         --- cfe/trunk/lib/Headers/altivec.h (original)
>         +++ cfe/trunk/lib/Headers/altivec.h Fri Oct 31 14:19:24 2014
>         @@ -2667,9 +2667,21 @@ vec_max(vector unsigned int __a, vector
>          static vector float __ATTRS_o_ai
>          vec_max(vector float __a, vector float __b)
>          {
>         +#ifdef __VSX__
>         +  return __builtin_vsx_xvmaxsp(__a, __b);
>         +#else
>            return __builtin_altivec_vmaxfp(__a, __b);
>         +#endif
>          }
>         
>         +#ifdef __VSX__
>         +static vector double __ATTRS_o_ai
>         +vec_max(vector double __a, vector double __b)
>         +{
>         +  return __builtin_vsx_xvmaxdp(__a, __b);
>         +}
>         +#endif
>         +
>          /* vec_vmaxsb */
>         
>          static vector signed char __ATTRS_o_ai
>         @@ -2795,7 +2807,11 @@ vec_vmaxuw(vector unsigned int __a,
>         vect
>          static vector float __attribute__((__always_inline__))
>          vec_vmaxfp(vector float __a, vector float __b)
>          {
>         +#ifdef __VSX__
>         +  return __builtin_vsx_xvmaxsp(__a, __b);
>         +#else
>            return __builtin_altivec_vmaxfp(__a, __b);
>         +#endif
>          }
>         
>          /* vec_mergeh */
>         @@ -3299,8 +3315,20 @@ vec_min(vector unsigned int __a, vector
>          static vector float __ATTRS_o_ai
>          vec_min(vector float __a, vector float __b)
>          {
>         +#ifdef __VSX__
>         +  return __builtin_vsx_xvminsp(__a, __b);
>         +#else
>            return __builtin_altivec_vminfp(__a, __b);
>         +#endif
>         +}
>         +
>         +#ifdef __VSX__
>         +static vector double __ATTRS_o_ai
>         +vec_min(vector double __a, vector double __b)
>         +{
>         +  return __builtin_vsx_xvmindp(__a, __b);
>          }
>         +#endif
>         
>          /* vec_vminsb */
>         
>         @@ -3427,7 +3455,11 @@ vec_vminuw(vector unsigned int __a,
>         vect
>          static vector float __attribute__((__always_inline__))
>          vec_vminfp(vector float __a, vector float __b)
>          {
>         +#ifdef __VSX__
>         +  return __builtin_vsx_xvminsp(__a, __b);
>         +#else
>            return __builtin_altivec_vminfp(__a, __b);
>         +#endif
>          }
>         
>          /* vec_mladd */
>         
>         Modified: cfe/trunk/lib/Sema/DeclSpec.cpp
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DeclSpec.cpp?rev=220989&r1=220988&r2=220989&view=diff
>         ==============================================================================
>         --- cfe/trunk/lib/Sema/DeclSpec.cpp (original)
>         +++ cfe/trunk/lib/Sema/DeclSpec.cpp Fri Oct 31 14:19:24 2014
>         @@ -18,6 +18,7 @@
>          #include "clang/AST/NestedNameSpecifier.h"
>          #include "clang/AST/TypeLoc.h"
>          #include "clang/Basic/LangOptions.h"
>         +#include "clang/Basic/TargetInfo.h"
>          #include "clang/Lex/Preprocessor.h"
>          #include "clang/Parse/ParseDiagnostic.h" // FIXME: remove
>         this back-dependency!
>          #include "clang/Sema/LocInfoType.h"
>         @@ -689,11 +690,6 @@ bool DeclSpec::SetTypeSpecType(TST T, So
>            }
>            TypeSpecType = T;
>            TypeSpecOwned = false;
>         -  if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType
>         == TST_double)) {
>         -    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType,
>         Policy);
>         -    DiagID = diag::err_invalid_vector_decl_spec;
>         -    return true;
>         -  }
>            return false;
>          }
>         
>         @@ -987,6 +983,13 @@ void DeclSpec::Finish(DiagnosticsEngine
>                if ((TypeSpecType == TST_char) || (TypeSpecType ==
>         TST_int) ||
>                    (TypeSpecWidth != TSW_unspecified))
>                  TypeSpecSign = TSS_unsigned;
>         +    } else if (TypeSpecType == TST_double) {
>         +      // vector long double and vector long long double are
>         never allowed.
>         +      // vector double is OK for Power7 and later.
>         +      if (TypeSpecWidth == TSW_long || TypeSpecWidth ==
>         TSW_longlong)
>         +        Diag(D, TSWLoc,
>         diag::err_invalid_vector_long_double_decl_spec);
>         +      else if (!PP.getTargetInfo().hasFeature("vsx"))
>         +        Diag(D, TSTLoc,
>         diag::err_invalid_vector_double_decl_spec);
>              } else if (TypeSpecWidth == TSW_long) {
>                Diag(D, TSWLoc,
>         diag::warn_vector_long_decl_spec_combination)
>                  << getSpecifierName((TST)TypeSpecType, Policy);
>         
>         Added: cfe/trunk/test/CodeGen/builtins-ppc-vsx.c
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-ppc-vsx.c?rev=220989&view=auto
>         ==============================================================================
>         --- cfe/trunk/test/CodeGen/builtins-ppc-vsx.c (added)
>         +++ cfe/trunk/test/CodeGen/builtins-ppc-vsx.c Fri Oct 31
>         14:19:24 2014
>         @@ -0,0 +1,40 @@
>         +// REQUIRES: powerpc-registered-target
>         +// RUN: %clang_cc1 -faltivec -target-feature +vsx -triple
>         powerpc64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
>         +
>         +vector float vf = { -1.5, 2.5, -3.5, 4.5 };
>         +vector double vd = { 3.5, -7.5 };
>         +double d = 23.4;
>         +
>         +vector float res_vf;
>         +vector double res_vd;
>         +double res_d;
>         +
>         +void test1() {
>         +// CHECK-LABEL: define void @test1
>         +
>         +  /* vec_max */
>         +  res_vf = vec_max(vf, vf);
>         +// CHECK: @llvm.ppc.vsx.xvmaxsp
>         +
>         +  res_vd = vec_max(vd, vd);
>         +// CHECK: @llvm.ppc.vsx.xvmaxdp
>         +
>         +  res_vf = vec_vmaxfp(vf, vf);
>         +// CHECK: @llvm.ppc.vsx.xvmaxsp
>         +
>         +  /* vec_min */
>         +  res_vf = vec_min(vf, vf);
>         +// CHECK: @llvm.ppc.vsx.xvminsp
>         +
>         +  res_vd = vec_min(vd, vd);
>         +// CHECK: @llvm.ppc.vsx.xvmindp
>         +
>         +  res_vf = vec_vminfp(vf, vf);
>         +// CHECK: @llvm.ppc.vsx.xvminsp
>         +
>         +  res_d = __builtin_vsx_xsmaxdp(d, d);
>         +// CHECK: @llvm.ppc.vsx.xsmaxdp
>         +
>         +  res_d = __builtin_vsx_xsmindp(d, d);
>         +// CHECK: @llvm.ppc.vsx.xsmindp
>         +}
>         
>         Modified: cfe/trunk/test/Parser/altivec.c
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/altivec.c?rev=220989&r1=220988&r2=220989&view=diff
>         ==============================================================================
>         --- cfe/trunk/test/Parser/altivec.c (original)
>         +++ cfe/trunk/test/Parser/altivec.c Fri Oct 31 14:19:24 2014
>         @@ -61,15 +61,15 @@ vector unsigned long v_ul;          // e
>          vector long int v_li;               // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>          vector signed long int v_sli;       // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>          vector unsigned long int v_uli;     // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>         -__vector long double  vv_ld;        // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector long double  v_ld;           // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         +__vector long double  vv_ld;        // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         +vector long double  v_ld;           // expected-error
>         {{cannot use 'long double' with '__vector'}}
>          vector bool v_b;                    // expected-warning
>         {{type specifier missing, defaults to 'int'}}
>         
>          // These should have errors.
>         -__vector double vv_d1;               // expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector double v_d2;                  // expected-error
>         {{cannot use 'double' with '__vector'}}
>         -__vector long double  vv_ld3;        // expected-warning
>         {{Use of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector long double  v_ld4;           // expected-warning
>         {{Use of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         +__vector double vv_d1;               // expected-error {{use
>         of 'double' with '__vector' requires VSX support to be enabled
>         (available on the POWER7 or later)}}
>         +vector double v_d2;                  // expected-error {{use
>         of 'double' with '__vector' requires VSX support to be enabled
>         (available on the POWER7 or later)}}
>         +__vector long double  vv_ld3;        // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         +vector long double  v_ld4;           // expected-error
>         {{cannot use 'long double' with '__vector'}}
>          vector bool float v_bf;              // expected-error
>         {{cannot use 'float' with '__vector bool'}}
>          vector bool double v_bd;             // expected-error
>         {{cannot use 'double' with '__vector bool'}}
>          vector bool pixel v_bp;              // expected-error
>         {{cannot use '__pixel' with '__vector bool'}}
>         
>         Modified: cfe/trunk/test/Parser/cxx-altivec.cpp
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-altivec.cpp?rev=220989&r1=220988&r2=220989&view=diff
>         ==============================================================================
>         --- cfe/trunk/test/Parser/cxx-altivec.cpp (original)
>         +++ cfe/trunk/test/Parser/cxx-altivec.cpp Fri Oct 31 14:19:24
>         2014
>         @@ -61,14 +61,14 @@ vector unsigned long v_ul;          // e
>          vector long int v_li;               // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>          vector signed long int v_sli;       // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>          vector unsigned long int v_uli;     // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}}
>         -__vector long double  vv_ld;        // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector long double  v_ld;           // expected-warning {{Use
>         of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         +__vector long double  vv_ld;        // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         +vector long double  v_ld;           // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         
>          // These should have errors.
>         -__vector double vv_d1;               // expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector double v_d2;                  // expected-error
>         {{cannot use 'double' with '__vector'}}
>         -__vector long double  vv_ld3;        // expected-warning
>         {{Use of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         -vector long double  v_ld4;           // expected-warning
>         {{Use of 'long' with '__vector' is deprecated}} expected-error
>         {{cannot use 'double' with '__vector'}}
>         +__vector double vv_d1;               // expected-error {{use
>         of 'double' with '__vector' requires VSX support to be enabled
>         (available on the POWER7 or later)}}
>         +vector double v_d2;                  // expected-error {{use
>         of 'double' with '__vector' requires VSX support to be enabled
>         (available on the POWER7 or later)}}
>         +__vector long double  vv_ld3;        // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         +vector long double  v_ld4;           // expected-error
>         {{cannot use 'long double' with '__vector'}}
>          vector bool v_b;                     // expected-error {{C++
>         requires a type specifier for all declarations}}
>          vector bool float v_bf;              // expected-error
>         {{cannot use 'float' with '__vector bool'}}
>          vector bool double v_bd;             // expected-error
>         {{cannot use 'double' with '__vector bool'}}
>         
>         Added: cfe/trunk/test/Parser/vsx.c
>         URL:
>         http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/vsx.c?rev=220989&view=auto
>         ==============================================================================
>         --- cfe/trunk/test/Parser/vsx.c (added)
>         +++ cfe/trunk/test/Parser/vsx.c Fri Oct 31 14:19:24 2014
>         @@ -0,0 +1,10 @@
>         +// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu
>         -faltivec -target-feature +vsx -fsyntax-only -verify %s
>         +// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu
>         -faltivec -target-feature +vsx -fsyntax-only -verify %s
>         +
>         +// Legitimate for VSX.
>         +__vector double vv_d1;
>         +vector double v_d2;
>         +
>         +// These should have errors.
>         +__vector long double  vv_ld3;        // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         +vector long double  v_ld4;           // expected-error
>         {{cannot use 'long double' with '__vector'}}
>         
>         
>         _______________________________________________
>         cfe-commits mailing list
>         cfe-commits at cs.uiuc.edu
>         http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list