From: Craig Topper Date: Sun, 10 Jun 2012 07:47:32 +0000 (+0000) Subject: Add XOP vprot* instruction intrinsics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3335eb7f7c5b82f109c585fb4009ff8240b11a84;p=clang Add XOP vprot* instruction intrinsics git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158292 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 35739e9649..5d1175fa93 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -676,4 +676,13 @@ BUILTIN(__builtin_ia32_vpcmov_256, "V4LLiV4LLiV4LLiV4LLi", "") BUILTIN(__builtin_ia32_vpperm, "V16cV16cV16cV16c", "") +BUILTIN(__builtin_ia32_vprotb, "V16cV16cV16c", "") +BUILTIN(__builtin_ia32_vprotw, "V8sV8sV8s", "") +BUILTIN(__builtin_ia32_vprotd, "V4iV4iV4i", "") +BUILTIN(__builtin_ia32_vprotq, "V2LLiV2LLiV2LLi", "") +BUILTIN(__builtin_ia32_vprotbi, "V16cV16cIc", "") +BUILTIN(__builtin_ia32_vprotwi, "V8sV8sIc", "") +BUILTIN(__builtin_ia32_vprotdi, "V4iV4iIc", "") +BUILTIN(__builtin_ia32_vprotqi, "V2LLiV2LLiIc", "") + #undef BUILTIN diff --git a/lib/Headers/xopintrin.h b/lib/Headers/xopintrin.h index 099fca995f..108f123ca5 100644 --- a/lib/Headers/xopintrin.h +++ b/lib/Headers/xopintrin.h @@ -214,6 +214,46 @@ _mm_perm_epi8(__m128i __A, __m128i __B, __m128i __C) return (__m128i)__builtin_ia32_vpperm((__v16qi)__A, (__v16qi)__B, (__v16qi)__C); } +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_rot_epi8(__m128i __A, __m128 __B) +{ + return (__m128i)__builtin_ia32_vprotb((__v16qi)__A, (__v16qi)__B); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_rot_epi16(__m128i __A, __m128 __B) +{ + return (__m128i)__builtin_ia32_vprotw((__v8hi)__A, (__v8hi)__B); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_rot_epi32(__m128i __A, __m128 __B) +{ + return (__m128i)__builtin_ia32_vprotd((__v4si)__A, (__v4si)__B); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_rot_epi64(__m128i __A, __m128 __B) +{ + return (__m128i)__builtin_ia32_vprotq((__v2di)__A, (__v2di)__B); +} + +#define _mm_roti_epi8(A, N) __extension__ ({ \ + __m128i __A = (A); \ + (__m128i)__builtin_ia32_vprotbi((__v16qi)__A, (N)); }) + +#define _mm_roti_epi16(A, N) __extension__ ({ \ + __m128i __A = (A); \ + (__m128i)__builtin_ia32_vprotwi((__v8hi)__A, (N)); }) + +#define _mm_roti_epi32(A, N) __extension__ ({ \ + __m128i __A = (A); \ + (__m128i)__builtin_ia32_vprotdi((__v4si)__A, (N)); }) + +#define _mm_roti_epi64(A, N) __extension__ ({ \ + __m128i __A = (A); \ + (__m128i)__builtin_ia32_vprotqi((__v2di)__A, (N)); }) + #endif /* __XOP__ */ #endif /* __XOPINTRIN_H */ diff --git a/test/CodeGen/xop-builtins.c b/test/CodeGen/xop-builtins.c index 28708ab9cf..af7734809f 100644 --- a/test/CodeGen/xop-builtins.c +++ b/test/CodeGen/xop-builtins.c @@ -154,3 +154,43 @@ __m128i test_mm_perm_epi8(__m128i a, __m128i b, __m128i c) { // CHECK: @llvm.x86.xop.vpperm return _mm_perm_epi8(a, b, c); } + +__m128i test_mm_rot_epi8(__m128i a, __m128i b) { + // CHECK: @llvm.x86.xop.vprotb + return _mm_rot_epi8(a, b); +} + +__m128i test_mm_rot_epi16(__m128i a, __m128i b) { + // CHECK: @llvm.x86.xop.vprotw + return _mm_rot_epi16(a, b); +} + +__m128i test_mm_rot_epi32(__m128i a, __m128i b) { + // CHECK: @llvm.x86.xop.vprotd + return _mm_rot_epi32(a, b); +} + +__m128i test_mm_rot_epi64(__m128i a, __m128i b) { + // CHECK: @llvm.x86.xop.vprotq + return _mm_rot_epi64(a, b); +} + +__m128i test_mm_roti_epi8(__m128i a) { + // CHECK: @llvm.x86.xop.vprotbi + return _mm_roti_epi8(a, 1); +} + +__m128i test_mm_roti_epi16(__m128i a) { + // CHECK: @llvm.x86.xop.vprotwi + return _mm_roti_epi16(a, 50); +} + +__m128i test_mm_roti_epi32(__m128i a) { + // CHECK: @llvm.x86.xop.vprotdi + return _mm_roti_epi32(a, -30); +} + +__m128i test_mm_roti_epi64(__m128i a) { + // CHECK: @llvm.x86.xop.vprotqi + return _mm_roti_epi64(a, 100); +}