[cfe-dev] __attribute__((enable_if(...))) for de-macroifying the builtin headers

Sean Silva chisophugis at gmail.com
Wed Apr 15 10:27:09 PDT 2015


In the post-commit of r231792, I suggested the idea of using
__attribute__((enable_if(...))) for avoiding the mess of the macros in the
builtin headers. AFAIK, the macros are currently used to make sure that the
"immediates" are constant expressions, piggybacking on the constant
expression check in the __builtin_* call.

I've attached a file with a proof-of-concept for using
__attribute__((enable_if(...))) for this purpose. I originally though using
__builtin_constant_p in the enable_if, but that turns out to not be
necessary (see the docs:
http://clang.llvm.org/docs/AttributeReference.html#enable-if ; the
enable_if condition fails for non-constant expressions anyway). The core is:

// Current builtin headers:
//
//#define _mm256_insertf128_si256(V1, V2, M) __extension__ ({ \
//  (__m256i)__builtin_shufflevector( \
//    (__v4di)(V1), \
//    (__v4di)_mm256_castsi128_si256((__m128i)(V2)), \
//    (((M) & 1) ? 0 : 4), \
//    (((M) & 1) ? 1 : 5), \
//    (((M) & 1) ? 4 : 2), \
//    (((M) & 1) ? 5 : 3) );})

// A bit cleaner.
static __inline __attribute__((__always_inline__, __nodebug__))
__m256i _mm256_insertf128_si256(__m256i __a, __m128i __b, int __imm8)
__attribute__((enable_if(__imm8, "'__imm8' must be a constant")))
{
  if (__imm8 & 1)
    return __builtin_shufflevector(__a, _mm256_castsi128_si256(__b), 0, 1,
4, 5);
  else
    return __builtin_shufflevector(__a, _mm256_castsi128_si256(__b), 4, 5,
2, 3);
}



Nick, are you okay using enable_if for this? It's sort of a hack but if we
are going to be carrying this attribute around forever (has it reached that
level of compatibility guarantee yet?), we might as well use it to solve
this problem for us.


-- Sean Silva
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150415/78518b96/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: testenableif.cpp
Type: text/x-c++src
Size: 1651 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150415/78518b96/attachment.cpp>


More information about the cfe-dev mailing list