[cfe-dev] [PROPOSAL] Reintroduce guards for Intel intrinsic headers

Vedant Kumar vsk at apple.com
Thu Jul 30 08:53:57 PDT 2015


I've run into some code which no longer compiles because of two recent changes:

  41885d3 Update the intel intrinsic headers to use the target attribute support.
  695aff1 Use a define for per-file function attributes for the Intel intrinsic headers.

Specifically, one project defines its own SSE4.1 emulation routines when the real intrinsics aren't available. This is a problem because they've reused the names of the intrinsics. E.g;

> #ifndef __SSE4_1__
> #define _mm_extract_epi8(a_, ndx) ({ ... })
> static inline __m128i _mm_blendv_epi8(__m128i a, __m128i b, __m128i mask) { ... }
> ...
> #endif

SSE4.1 intrinsics now leak into the project when it's being compiled for targets without SSE4.1 support. Compilation fails with "error: redefinition ...".

When these changes were initially being discussed, I think our stance was that we shouldn't support code like this [1]. However, we should reconsider for the sake of avoiding breakage. AFAICT, we would need to revert just two types of changes:

In lib/Headers/__wmmintrin_aes.h:

> -#if defined (__SSE4_2__) || defined (__SSE4_1__)
>  #include <smmintrin.h>
> -#endif


In lib/Headers/smmintrin.h:

> -#ifndef __SSE4_1__
> -#error "SSE4.1 instruction set not enabled"
> -#else

I don't see any downsides to reintroducing these guards. If everyone's OK with this, I can mail a patch in. The alternative is to have clients rewrite their emulation layers like this:

> #ifdef __SSE4_1__
> #define compat_mm_extract_epi8 _mm_extract_epi8
> static inline __m128i combat_mm_blendv_epi8(__m128i a, __m128i b, __m128i mask) __attribute__((__target__(("sse4.1")))) {
>   return _mm_blendv_epi8(a, b, mask);
> }
> ...
> #else /* OK, no native SSE 4.1. Define our own. */
> #define compat_mm_extract_epi8(a_, ndx) ({ ... })
> static inline __m128i compat_mm_blendv_epi8(__m128i a, __m128i b, __m128i mask) { ... }
> ...
> #endif

... and then replace all calls to intrinsics with calls to the new compatibility routines. This seems like a lot of tedious work, and I'd love to help people avoid it :).

Let me know what you think!

vedant

[1] http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20150615/131192.html



More information about the cfe-dev mailing list