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