]> granicus.if.org Git - clang/commit
[X86] Add gcc rotate intrinsics to ia32intrin.h
authorCraig Topper <craig.topper@intel.com>
Mon, 18 Mar 2019 22:25:57 +0000 (22:25 +0000)
committerCraig Topper <craig.topper@intel.com>
Mon, 18 Mar 2019 22:25:57 +0000 (22:25 +0000)
commit0ef5288535ee3984d3c297bf9f8341a7594e68ef
tree71c7191a1cfdb5ed3695eac346e731d5a27dec76
parent25d062ee4f1b683ccfeefb177d289eac901851cc
[X86] Add gcc rotate intrinsics to ia32intrin.h

This is another attempt at what Erich Keane tried to do in r355322.

This adds rolb, rolw, rold, rolq and their ror equivalent as always_inline wrappers around __builtin_rotate* which will lower to funnel shift intrinsics in IR.

Additionally, when _MSC_VER is not defined we will define _rotl, _lrotl, _rotr, _lrotr as macros to one of the always_inline intrinsics mentioned above. Making sure that _lrotl/_lrotr use either 32 or 64 bit based on the size of long. These need to be macros because we have builtins with the same name for MS compatibility, but _MSC_VER isn't always defined when those builtins are enabled.

We also define _rotwl and _rotwr as macros aliasing to rolw/rorw just like gcc to complete the set. These don't need to be gated with _MSC_VER because these aren't MS builtins.

I've added tests both for non-MS and -ms-extensions with and without _MSC_VER being defined.

Differential Revision: https://reviews.llvm.org/D59346

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@356423 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Headers/ia32intrin.h
test/CodeGen/rot-intrinsics.c [new file with mode: 0644]