[PATCH] D111529: Specify Clang vector builtins.

Florian Hahn via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 11 03:12:42 PDT 2021


fhahn created this revision.
fhahn added reviewers: scanon, erichkeane, rjmccall, aaron.ballman, dexonsmith, rsmith, craig.topper.
fhahn requested review of this revision.
Herald added a project: clang.

This patch specifies a set of vector builtins for Clang, as discussed on
cfe-dev:
https://lists.llvm.org/pipermail/cfe-dev/2021-September/068999.html
https://lists.llvm.org/pipermail/cfe-dev/2021-October/069070.html


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111529

Files:
  clang/docs/LanguageExtensions.rst


Index: clang/docs/LanguageExtensions.rst
===================================================================
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -506,6 +506,68 @@
   If it's an extension (OpenCL) vector, it's only available in C and OpenCL C.
   And it selects base on signedness of the condition operands (OpenCL v1.1 s6.3.9).
 
+Vector Builtins
+---------------
+
+In addition to the operators mentioned above, Clang provides a set of builtins
+to perform additional operations on certain scalar and vector types.
+
+Let ``T`` be one of the following types:
+
+* an integer type (as in C2x 6.2.5p19), but excluding enumerated types and _Bool
+* the standard floating types float or double
+* a half-precision floating point type, if one is supported on the target
+* a vector type.
+
+For scalar types, consider the operation applied to a vector with a single element.
+
+*Elementwise Builtins*
+
+Each builtin returns a vector equivalent to applying the specified operation
+elementwise to the input.
+
+Unless specified otherwise operation(±0) = ±0 and operation(±infinity) = ±infinity
+
+======================================= ================================================================ ==================================
+         Name                            Operation                                                        Supported element types
+======================================= ================================================================ ==================================
+ T __builtin_elementwise_abs(T x)       return the absolute value of a number x                           integer and floating point types
+ T __builtin_elementwise_ceil(T x)      return the smallest integral value greater than or equal to x     floating point types
+ T __builtin_elementwise_floor(T x)     return the largest integral value less than or equal to x         floating point types
+ T __builtin_elementwise_rint(T x)      return the integral value nearest to x (according to the          floating point types
+                                        prevailing rounding mode) in floating-point format
+ T __builtin_elementwise_round(T x)     return the integral value nearest to x rounding half-way cases    floating point types
+                                        away from zero, regardless of the current rounding direction
+ T__builtin_elementwise_trunc(T x)      return the integral value nearest to but no larger in             floating point types
+                                        magnitude than x
+ T __builtin_elementwise_max(T x, T y)  return x or y, whichever is larger                                integer and floating point types
+ T __builtin_elementwise_min(T x, T y)  return x or y, whichever is smaller                               integer and floating point types
+======================================= ================================================================ ==================================
+
+
+*Reduction Builtins*
+
+Each builtin returns a scalar equivalent to applying the specified
+operation(x, y) as pairwise tree reduction to the input. The pairs are formed
+by concatenating both inputs and pairing adjacent elements.
+
+Let ``VT`` be a vector type and ``ET`` the element type of ``VT``.
+
+======================================= ================================================================ ==================================
+         Name                            Operation                                                        Supported element types
+======================================= ================================================================ ==================================
+ ET __builtin_reduce_max(VT a)           return x or y, whichever is larger; If exactly one argument is   integer and floating point types
+                                         a NaN, return the other argument. If both arguments are NaNs,
+                                         fmax() return a NaN.
+ ET __builtin_reduce_min(VT a)           return x or y, whichever is smaller; If exactly one argument     integer and floating point types
+                                         is a NaN, return the other argument. If both arguments are
+                                         NaNs, fmax() return a NaN.
+ ET __builtin_reduce_add(VT a)           \+                                                               integer and floating point types
+ ET __builtin_reduce_and(VT a)           &                                                                integer types
+ ET __builtin_reduce_or(VT a)            \|                                                               integer types
+ ET __builtin_reduce_xor(VT a)           ^                                                                integer types
+======================================= ================================================================ ==================================
+
 Matrix Types
 ============
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111529.378601.patch
Type: text/x-patch
Size: 5019 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211011/4143f2c2/attachment.bin>


More information about the cfe-commits mailing list