Home | History | Annotate | Line # | Download | only in i386
ia32intrin.h revision 1.3
      1  1.3  mrg /* Copyright (C) 2009-2013 Free Software Foundation, Inc.
      2  1.1  mrg 
      3  1.1  mrg    This file is part of GCC.
      4  1.1  mrg 
      5  1.1  mrg    GCC is free software; you can redistribute it and/or modify
      6  1.1  mrg    it under the terms of the GNU General Public License as published by
      7  1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
      8  1.1  mrg    any later version.
      9  1.1  mrg 
     10  1.1  mrg    GCC is distributed in the hope that it will be useful,
     11  1.1  mrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1  mrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1  mrg    GNU General Public License for more details.
     14  1.1  mrg 
     15  1.1  mrg    Under Section 7 of GPL version 3, you are granted additional
     16  1.1  mrg    permissions described in the GCC Runtime Library Exception, version
     17  1.1  mrg    3.1, as published by the Free Software Foundation.
     18  1.1  mrg 
     19  1.1  mrg    You should have received a copy of the GNU General Public License and
     20  1.1  mrg    a copy of the GCC Runtime Library Exception along with this program;
     21  1.1  mrg    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     22  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     23  1.1  mrg 
     24  1.1  mrg #ifndef _X86INTRIN_H_INCLUDED
     25  1.1  mrg # error "Never use <ia32intrin.h> directly; include <x86intrin.h> instead."
     26  1.1  mrg #endif
     27  1.1  mrg 
     28  1.1  mrg /* 32bit bsf */
     29  1.1  mrg extern __inline int
     30  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     31  1.1  mrg __bsfd (int __X)
     32  1.1  mrg {
     33  1.1  mrg   return __builtin_ctz (__X);
     34  1.1  mrg }
     35  1.1  mrg 
     36  1.1  mrg /* 32bit bsr */
     37  1.1  mrg extern __inline int
     38  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     39  1.1  mrg __bsrd (int __X)
     40  1.1  mrg {
     41  1.1  mrg   return __builtin_ia32_bsrsi (__X);
     42  1.1  mrg }
     43  1.1  mrg 
     44  1.1  mrg /* 32bit bswap */
     45  1.1  mrg extern __inline int
     46  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     47  1.1  mrg __bswapd (int __X)
     48  1.1  mrg {
     49  1.1  mrg   return __builtin_bswap32 (__X);
     50  1.1  mrg }
     51  1.1  mrg 
     52  1.1  mrg #ifdef __SSE4_2__
     53  1.1  mrg /* 32bit accumulate CRC32 (polynomial 0x11EDC6F41) value.  */
     54  1.1  mrg extern __inline unsigned int
     55  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     56  1.1  mrg __crc32b (unsigned int __C, unsigned char __V)
     57  1.1  mrg {
     58  1.1  mrg   return __builtin_ia32_crc32qi (__C, __V);
     59  1.1  mrg }
     60  1.1  mrg 
     61  1.1  mrg extern __inline unsigned int
     62  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     63  1.1  mrg __crc32w (unsigned int __C, unsigned short __V)
     64  1.1  mrg {
     65  1.1  mrg   return __builtin_ia32_crc32hi (__C, __V);
     66  1.1  mrg }
     67  1.1  mrg 
     68  1.1  mrg extern __inline unsigned int
     69  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     70  1.1  mrg __crc32d (unsigned int __C, unsigned int __V)
     71  1.1  mrg {
     72  1.1  mrg   return __builtin_ia32_crc32si (__C, __V);
     73  1.1  mrg }
     74  1.1  mrg #endif /* SSE4.2 */
     75  1.1  mrg 
     76  1.1  mrg /* 32bit popcnt */
     77  1.1  mrg extern __inline int
     78  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     79  1.1  mrg __popcntd (unsigned int __X)
     80  1.1  mrg {
     81  1.1  mrg   return __builtin_popcount (__X);
     82  1.1  mrg }
     83  1.1  mrg 
     84  1.1  mrg /* rdpmc */
     85  1.1  mrg extern __inline unsigned long long
     86  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     87  1.1  mrg __rdpmc (int __S)
     88  1.1  mrg {
     89  1.1  mrg   return __builtin_ia32_rdpmc (__S);
     90  1.1  mrg }
     91  1.1  mrg 
     92  1.1  mrg /* rdtsc */
     93  1.1  mrg extern __inline unsigned long long
     94  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
     95  1.1  mrg __rdtsc (void)
     96  1.1  mrg {
     97  1.1  mrg   return __builtin_ia32_rdtsc ();
     98  1.1  mrg }
     99  1.1  mrg 
    100  1.1  mrg /* rdtscp */
    101  1.1  mrg extern __inline unsigned long long
    102  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    103  1.1  mrg __rdtscp (unsigned int *__A)
    104  1.1  mrg {
    105  1.1  mrg   return __builtin_ia32_rdtscp (__A);
    106  1.1  mrg }
    107  1.1  mrg 
    108  1.1  mrg /* 8bit rol */
    109  1.1  mrg extern __inline unsigned char
    110  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    111  1.1  mrg __rolb (unsigned char __X, int __C)
    112  1.1  mrg {
    113  1.1  mrg   return __builtin_ia32_rolqi (__X, __C);
    114  1.1  mrg }
    115  1.1  mrg 
    116  1.1  mrg /* 16bit rol */
    117  1.1  mrg extern __inline unsigned short
    118  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    119  1.1  mrg __rolw (unsigned short __X, int __C)
    120  1.1  mrg {
    121  1.1  mrg   return __builtin_ia32_rolhi (__X, __C);
    122  1.1  mrg }
    123  1.1  mrg 
    124  1.1  mrg /* 32bit rol */
    125  1.1  mrg extern __inline unsigned int
    126  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    127  1.1  mrg __rold (unsigned int __X, int __C)
    128  1.1  mrg {
    129  1.1  mrg   return (__X << __C) | (__X >> (32 - __C));
    130  1.1  mrg }
    131  1.1  mrg 
    132  1.1  mrg /* 8bit ror */
    133  1.1  mrg extern __inline unsigned char
    134  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    135  1.1  mrg __rorb (unsigned char __X, int __C)
    136  1.1  mrg {
    137  1.1  mrg   return __builtin_ia32_rorqi (__X, __C);
    138  1.1  mrg }
    139  1.1  mrg 
    140  1.1  mrg /* 16bit ror */
    141  1.1  mrg extern __inline unsigned short
    142  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    143  1.1  mrg __rorw (unsigned short __X, int __C)
    144  1.1  mrg {
    145  1.1  mrg   return __builtin_ia32_rorhi (__X, __C);
    146  1.1  mrg }
    147  1.1  mrg 
    148  1.1  mrg /* 32bit ror */
    149  1.1  mrg extern __inline unsigned int
    150  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    151  1.1  mrg __rord (unsigned int __X, int __C)
    152  1.1  mrg {
    153  1.1  mrg   return (__X >> __C) | (__X << (32 - __C));
    154  1.1  mrg }
    155  1.1  mrg 
    156  1.3  mrg /* Pause */
    157  1.3  mrg extern __inline void
    158  1.3  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    159  1.3  mrg __pause (void)
    160  1.3  mrg {
    161  1.3  mrg   __builtin_ia32_pause ();
    162  1.3  mrg }
    163  1.3  mrg 
    164  1.1  mrg #ifdef __x86_64__
    165  1.1  mrg /* 64bit bsf */
    166  1.1  mrg extern __inline int
    167  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    168  1.1  mrg __bsfq (long long __X)
    169  1.1  mrg {
    170  1.1  mrg   return __builtin_ctzll (__X);
    171  1.1  mrg }
    172  1.1  mrg 
    173  1.1  mrg /* 64bit bsr */
    174  1.1  mrg extern __inline int
    175  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    176  1.1  mrg __bsrq (long long __X)
    177  1.1  mrg {
    178  1.1  mrg   return __builtin_ia32_bsrdi (__X);
    179  1.1  mrg }
    180  1.1  mrg 
    181  1.1  mrg /* 64bit bswap */
    182  1.1  mrg extern __inline long long
    183  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    184  1.1  mrg __bswapq (long long __X)
    185  1.1  mrg {
    186  1.1  mrg   return __builtin_bswap64 (__X);
    187  1.1  mrg }
    188  1.1  mrg 
    189  1.1  mrg #ifdef __SSE4_2__
    190  1.1  mrg /* 64bit accumulate CRC32 (polynomial 0x11EDC6F41) value.  */
    191  1.1  mrg extern __inline unsigned long long
    192  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    193  1.1  mrg __crc32q (unsigned long long __C, unsigned long long __V)
    194  1.1  mrg {
    195  1.1  mrg   return __builtin_ia32_crc32di (__C, __V);
    196  1.1  mrg }
    197  1.1  mrg #endif
    198  1.1  mrg 
    199  1.1  mrg /* 64bit popcnt */
    200  1.1  mrg extern __inline long long
    201  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    202  1.1  mrg __popcntq (unsigned long long __X)
    203  1.1  mrg {
    204  1.1  mrg   return __builtin_popcountll (__X);
    205  1.1  mrg }
    206  1.1  mrg 
    207  1.1  mrg /* 64bit rol */
    208  1.1  mrg extern __inline unsigned long long
    209  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    210  1.1  mrg __rolq (unsigned long long __X, int __C)
    211  1.1  mrg {
    212  1.1  mrg   return (__X << __C) | (__X >> (64 - __C));
    213  1.1  mrg }
    214  1.1  mrg 
    215  1.1  mrg /* 64bit ror */
    216  1.1  mrg extern __inline unsigned long long
    217  1.1  mrg __attribute__((__gnu_inline__, __always_inline__, __artificial__))
    218  1.1  mrg __rorq (unsigned long long __X, int __C)
    219  1.1  mrg {
    220  1.1  mrg   return (__X >> __C) | (__X << (64 - __C));
    221  1.1  mrg }
    222  1.1  mrg 
    223  1.1  mrg #define _bswap64(a)		__bswapq(a)
    224  1.1  mrg #define _popcnt64(a)		__popcntq(a)
    225  1.1  mrg #define _lrotl(a,b)		__rolq((a), (b))
    226  1.1  mrg #define _lrotr(a,b)		__rorq((a), (b))
    227  1.1  mrg #else
    228  1.1  mrg #define _lrotl(a,b)		__rold((a), (b))
    229  1.1  mrg #define _lrotr(a,b)		__rord((a), (b))
    230  1.1  mrg #endif
    231  1.1  mrg 
    232  1.1  mrg #define _bit_scan_forward(a)	__bsfd(a)
    233  1.1  mrg #define _bit_scan_reverse(a)	__bsrd(a)
    234  1.1  mrg #define _bswap(a)		__bswapd(a)
    235  1.1  mrg #define _popcnt32(a)		__popcntd(a)
    236  1.1  mrg #define _rdpmc(a)		__rdpmc(a)
    237  1.1  mrg #define _rdtsc()		__rdtsc()
    238  1.1  mrg #define _rdtscp(a)		__rdtscp(a)
    239  1.1  mrg #define _rotwl(a,b)		__rolw((a), (b))
    240  1.1  mrg #define _rotwr(a,b)		__rorw((a), (b))
    241  1.1  mrg #define _rotl(a,b)		__rold((a), (b))
    242  1.1  mrg #define _rotr(a,b)		__rord((a), (b))
    243