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