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

Eric Christopher echristo at gmail.com
Fri Oct 31 17:55:53 PDT 2014


>
>
>
>  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?

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

-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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141101/b4ea364e/attachment.html>


More information about the cfe-commits mailing list