1 /* ===-------- ia32intrin.h ---------------------------------------------------===
2 *
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 *
7 *===-----------------------------------------------------------------------===
8 */
9
10 #ifndef __X86INTRIN_H
11 #error "Never use <ia32intrin.h> directly; include <x86intrin.h> instead."
12 #endif
13
14 #ifndef __IA32INTRIN_H
15 #define __IA32INTRIN_H
16
17 /* Define the default attributes for the functions in this file. */
18 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
19 #define __DEFAULT_FN_ATTRS_CRC32 __attribute__((__always_inline__, __nodebug__, __target__("crc32")))
20
21 #if defined(__cplusplus) && (__cplusplus >= 201103L)
22 #define __DEFAULT_FN_ATTRS_CAST __attribute__((__always_inline__)) constexpr
23 #define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
24 #else
25 #define __DEFAULT_FN_ATTRS_CAST __attribute__((__always_inline__))
26 #define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
27 #endif
28
29 /// Finds the first set bit starting from the least significant bit. The result
30 /// is undefined if the input is 0.
31 ///
32 /// \headerfile <x86intrin.h>
33 ///
34 /// This intrinsic corresponds to the \c BSF instruction or the
35 /// \c TZCNT instruction.
36 ///
37 /// \param __A
38 /// A 32-bit integer operand.
39 /// \returns A 32-bit integer containing the bit number.
40 /// \see _bit_scan_forward
41 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bsfd(int __A)42 __bsfd(int __A) {
43 return __builtin_ctz((unsigned int)__A);
44 }
45
46 /// Finds the first set bit starting from the most significant bit. The result
47 /// is undefined if the input is 0.
48 ///
49 /// \headerfile <x86intrin.h>
50 ///
51 /// This intrinsic corresponds to the \c BSR instruction or the
52 /// \c LZCNT instruction and an \c XOR.
53 ///
54 /// \param __A
55 /// A 32-bit integer operand.
56 /// \returns A 32-bit integer containing the bit number.
57 /// \see _bit_scan_reverse
58 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bsrd(int __A)59 __bsrd(int __A) {
60 return 31 - __builtin_clz((unsigned int)__A);
61 }
62
63 /// Swaps the bytes in the input, converting little endian to big endian or
64 /// vice versa.
65 ///
66 /// \headerfile <x86intrin.h>
67 ///
68 /// This intrinsic corresponds to the \c BSWAP instruction.
69 ///
70 /// \param __A
71 /// A 32-bit integer operand.
72 /// \returns A 32-bit integer containing the swapped bytes.
73 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bswapd(int __A)74 __bswapd(int __A) {
75 return (int)__builtin_bswap32((unsigned int)__A);
76 }
77
78 /// Swaps the bytes in the input, converting little endian to big endian or
79 /// vice versa.
80 ///
81 /// \headerfile <x86intrin.h>
82 ///
83 /// This intrinsic corresponds to the \c BSWAP instruction.
84 ///
85 /// \param __A
86 /// A 32-bit integer operand.
87 /// \returns A 32-bit integer containing the swapped bytes.
88 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
_bswap(int __A)89 _bswap(int __A) {
90 return (int)__builtin_bswap32((unsigned int)__A);
91 }
92
93 /// Finds the first set bit starting from the least significant bit. The result
94 /// is undefined if the input is 0.
95 ///
96 /// \headerfile <x86intrin.h>
97 ///
98 /// \code
99 /// int _bit_scan_forward(int A);
100 /// \endcode
101 ///
102 /// This intrinsic corresponds to the \c BSF instruction or the
103 /// \c TZCNT instruction.
104 ///
105 /// \param A
106 /// A 32-bit integer operand.
107 /// \returns A 32-bit integer containing the bit number.
108 /// \see __bsfd
109 #define _bit_scan_forward(A) __bsfd((A))
110
111 /// Finds the first set bit starting from the most significant bit. The result
112 /// is undefined if the input is 0.
113 ///
114 /// \headerfile <x86intrin.h>
115 ///
116 /// \code
117 /// int _bit_scan_reverse(int A);
118 /// \endcode
119 ///
120 /// This intrinsic corresponds to the \c BSR instruction or the
121 /// \c LZCNT instruction and an \c XOR.
122 ///
123 /// \param A
124 /// A 32-bit integer operand.
125 /// \returns A 32-bit integer containing the bit number.
126 /// \see __bsrd
127 #define _bit_scan_reverse(A) __bsrd((A))
128
129 #ifdef __x86_64__
130 /// Finds the first set bit starting from the least significant bit. The result
131 /// is undefined if the input is 0.
132 ///
133 /// \headerfile <x86intrin.h>
134 ///
135 /// This intrinsic corresponds to the \c BSF instruction or the
136 /// \c TZCNT instruction.
137 ///
138 /// \param __A
139 /// A 64-bit integer operand.
140 /// \returns A 32-bit integer containing the bit number.
141 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bsfq(long long __A)142 __bsfq(long long __A) {
143 return (long long)__builtin_ctzll((unsigned long long)__A);
144 }
145
146 /// Finds the first set bit starting from the most significant bit. The result
147 /// is undefined if input is 0.
148 ///
149 /// \headerfile <x86intrin.h>
150 ///
151 /// This intrinsic corresponds to the \c BSR instruction or the
152 /// \c LZCNT instruction and an \c XOR.
153 ///
154 /// \param __A
155 /// A 64-bit integer operand.
156 /// \returns A 32-bit integer containing the bit number.
157 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__bsrq(long long __A)158 __bsrq(long long __A) {
159 return 63 - __builtin_clzll((unsigned long long)__A);
160 }
161
162 /// Swaps the bytes in the input, converting little endian to big endian or
163 /// vice versa.
164 ///
165 /// \headerfile <x86intrin.h>
166 ///
167 /// This intrinsic corresponds to the \c BSWAP instruction.
168 ///
169 /// \param __A
170 /// A 64-bit integer operand.
171 /// \returns A 64-bit integer containing the swapped bytes.
172 /// \see _bswap64
173 static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
__bswapq(long long __A)174 __bswapq(long long __A) {
175 return (long long)__builtin_bswap64((unsigned long long)__A);
176 }
177
178 /// Swaps the bytes in the input, converting little endian to big endian or
179 /// vice versa.
180 ///
181 /// \headerfile <x86intrin.h>
182 ///
183 /// \code
184 /// long long _bswap64(long long A);
185 /// \endcode
186 ///
187 /// This intrinsic corresponds to the \c BSWAP instruction.
188 ///
189 /// \param A
190 /// A 64-bit integer operand.
191 /// \returns A 64-bit integer containing the swapped bytes.
192 /// \see __bswapq
193 #define _bswap64(A) __bswapq((A))
194 #endif /* __x86_64__ */
195
196 /// Counts the number of bits in the source operand having a value of 1.
197 ///
198 /// \headerfile <x86intrin.h>
199 ///
200 /// This intrinsic corresponds to the \c POPCNT instruction or a
201 /// sequence of arithmetic and logic operations to calculate it.
202 ///
203 /// \param __A
204 /// An unsigned 32-bit integer operand.
205 /// \returns A 32-bit integer containing the number of bits with value 1 in the
206 /// source operand.
207 /// \see _popcnt32
208 static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
__popcntd(unsigned int __A)209 __popcntd(unsigned int __A)
210 {
211 return __builtin_popcount(__A);
212 }
213
214 /// Counts the number of bits in the source operand having a value of 1.
215 ///
216 /// \headerfile <x86intrin.h>
217 ///
218 /// \code
219 /// int _popcnt32(int A);
220 /// \endcode
221 ///
222 /// This intrinsic corresponds to the \c POPCNT instruction or a
223 /// sequence of arithmetic and logic operations to calculate it.
224 ///
225 /// \param A
226 /// An unsigned 32-bit integer operand.
227 /// \returns A 32-bit integer containing the number of bits with value 1 in the
228 /// source operand.
229 /// \see __popcntd
230 #define _popcnt32(A) __popcntd((A))
231
232 #ifdef __x86_64__
233 /// Counts the number of bits in the source operand having a value of 1.
234 ///
235 /// \headerfile <x86intrin.h>
236 ///
237 /// This intrinsic corresponds to the \c POPCNT instruction or a
238 /// sequence of arithmetic and logic operations to calculate it.
239 ///
240 /// \param __A
241 /// An unsigned 64-bit integer operand.
242 /// \returns A 64-bit integer containing the number of bits with value 1 in the
243 /// source operand.
244 /// \see _popcnt64
245 static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
__popcntq(unsigned long long __A)246 __popcntq(unsigned long long __A)
247 {
248 return __builtin_popcountll(__A);
249 }
250
251 /// Counts the number of bits in the source operand having a value of 1.
252 ///
253 /// \headerfile <x86intrin.h>
254 ///
255 /// \code
256 /// long long _popcnt64(unsigned long long A);
257 /// \endcode
258 ///
259 /// This intrinsic corresponds to the \c POPCNT instruction or a
260 /// sequence of arithmetic and logic operations to calculate it.
261 ///
262 /// \param A
263 /// An unsigned 64-bit integer operand.
264 /// \returns A 64-bit integer containing the number of bits with value 1 in the
265 /// source operand.
266 /// \see __popcntq
267 #define _popcnt64(A) __popcntq((A))
268 #endif /* __x86_64__ */
269
270 #ifdef __x86_64__
271 /// Returns the program status-and-control \c RFLAGS register with the \c VM
272 /// and \c RF flags cleared.
273 ///
274 /// \headerfile <x86intrin.h>
275 ///
276 /// This intrinsic corresponds to the \c PUSHFQ + \c POP instruction sequence.
277 ///
278 /// \returns The 64-bit value of the RFLAGS register.
279 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__readeflags(void)280 __readeflags(void)
281 {
282 return __builtin_ia32_readeflags_u64();
283 }
284
285 /// Writes the specified value to the program status-and-control \c RFLAGS
286 /// register. Reserved bits are not affected.
287 ///
288 /// \headerfile <x86intrin.h>
289 ///
290 /// This intrinsic corresponds to the \c PUSH + \c POPFQ instruction sequence.
291 ///
292 /// \param __f
293 /// The 64-bit value to write to \c RFLAGS.
294 static __inline__ void __DEFAULT_FN_ATTRS
__writeeflags(unsigned long long __f)295 __writeeflags(unsigned long long __f)
296 {
297 __builtin_ia32_writeeflags_u64(__f);
298 }
299
300 #else /* !__x86_64__ */
301 /// Returns the program status-and-control \c EFLAGS register with the \c VM
302 /// and \c RF flags cleared.
303 ///
304 /// \headerfile <x86intrin.h>
305 ///
306 /// This intrinsic corresponds to the \c PUSHFD + \c POP instruction sequence.
307 ///
308 /// \returns The 32-bit value of the EFLAGS register.
309 static __inline__ unsigned int __DEFAULT_FN_ATTRS
__readeflags(void)310 __readeflags(void)
311 {
312 return __builtin_ia32_readeflags_u32();
313 }
314
315 /// Writes the specified value to the program status-and-control \c EFLAGS
316 /// register. Reserved bits are not affected.
317 ///
318 /// \headerfile <x86intrin.h>
319 ///
320 /// This intrinsic corresponds to the \c PUSH + \c POPFD instruction sequence.
321 ///
322 /// \param __f
323 /// The 32-bit value to write to \c EFLAGS.
324 static __inline__ void __DEFAULT_FN_ATTRS
__writeeflags(unsigned int __f)325 __writeeflags(unsigned int __f)
326 {
327 __builtin_ia32_writeeflags_u32(__f);
328 }
329 #endif /* !__x86_64__ */
330
331 /// Casts a 32-bit float value to a 32-bit unsigned integer value.
332 ///
333 /// \headerfile <x86intrin.h>
334 ///
335 /// This intrinsic corresponds to the \c VMOVD / \c MOVD instruction in x86_64,
336 /// and corresponds to the \c VMOVL / \c MOVL instruction in ia32.
337 ///
338 /// \param __A
339 /// A 32-bit float value.
340 /// \returns A 32-bit unsigned integer containing the converted value.
341 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CAST
_castf32_u32(float __A)342 _castf32_u32(float __A) {
343 return __builtin_bit_cast(unsigned int, __A);
344 }
345
346 /// Casts a 64-bit float value to a 64-bit unsigned integer value.
347 ///
348 /// \headerfile <x86intrin.h>
349 ///
350 /// This intrinsic corresponds to the \c VMOVQ / \c MOVQ instruction in x86_64,
351 /// and corresponds to the \c VMOVL / \c MOVL instruction in ia32.
352 ///
353 /// \param __A
354 /// A 64-bit float value.
355 /// \returns A 64-bit unsigned integer containing the converted value.
356 static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CAST
_castf64_u64(double __A)357 _castf64_u64(double __A) {
358 return __builtin_bit_cast(unsigned long long, __A);
359 }
360
361 /// Casts a 32-bit unsigned integer value to a 32-bit float value.
362 ///
363 /// \headerfile <x86intrin.h>
364 ///
365 /// This intrinsic corresponds to the \c VMOVQ / \c MOVQ instruction in x86_64,
366 /// and corresponds to the \c FLDS instruction in ia32.
367 ///
368 /// \param __A
369 /// A 32-bit unsigned integer value.
370 /// \returns A 32-bit float value containing the converted value.
371 static __inline__ float __DEFAULT_FN_ATTRS_CAST
_castu32_f32(unsigned int __A)372 _castu32_f32(unsigned int __A) {
373 return __builtin_bit_cast(float, __A);
374 }
375
376 /// Casts a 64-bit unsigned integer value to a 64-bit float value.
377 ///
378 /// \headerfile <x86intrin.h>
379 ///
380 /// This intrinsic corresponds to the \c VMOVQ / \c MOVQ instruction in x86_64,
381 /// and corresponds to the \c FLDL instruction in ia32.
382 ///
383 /// \param __A
384 /// A 64-bit unsigned integer value.
385 /// \returns A 64-bit float value containing the converted value.
386 static __inline__ double __DEFAULT_FN_ATTRS_CAST
_castu64_f64(unsigned long long __A)387 _castu64_f64(unsigned long long __A) {
388 return __builtin_bit_cast(double, __A);
389 }
390
391 /// Adds the unsigned integer operand to the CRC-32C checksum of the
392 /// unsigned char operand.
393 ///
394 /// \headerfile <x86intrin.h>
395 ///
396 /// This intrinsic corresponds to the \c CRC32B instruction.
397 ///
398 /// \param __C
399 /// An unsigned integer operand to add to the CRC-32C checksum of operand
400 /// \a __D.
401 /// \param __D
402 /// An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
403 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
404 /// operand \a __D.
405 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CRC32
__crc32b(unsigned int __C,unsigned char __D)406 __crc32b(unsigned int __C, unsigned char __D)
407 {
408 return __builtin_ia32_crc32qi(__C, __D);
409 }
410
411 /// Adds the unsigned integer operand to the CRC-32C checksum of the
412 /// unsigned short operand.
413 ///
414 /// \headerfile <x86intrin.h>
415 ///
416 /// This intrinsic corresponds to the \c CRC32W instruction.
417 ///
418 /// \param __C
419 /// An unsigned integer operand to add to the CRC-32C checksum of operand
420 /// \a __D.
421 /// \param __D
422 /// An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
423 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
424 /// operand \a __D.
425 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CRC32
__crc32w(unsigned int __C,unsigned short __D)426 __crc32w(unsigned int __C, unsigned short __D)
427 {
428 return __builtin_ia32_crc32hi(__C, __D);
429 }
430
431 /// Adds the unsigned integer operand to the CRC-32C checksum of the
432 /// second unsigned integer operand.
433 ///
434 /// \headerfile <x86intrin.h>
435 ///
436 /// This intrinsic corresponds to the \c CRC32D instruction.
437 ///
438 /// \param __C
439 /// An unsigned integer operand to add to the CRC-32C checksum of operand
440 /// \a __D.
441 /// \param __D
442 /// An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
443 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
444 /// operand \a __D.
445 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CRC32
__crc32d(unsigned int __C,unsigned int __D)446 __crc32d(unsigned int __C, unsigned int __D)
447 {
448 return __builtin_ia32_crc32si(__C, __D);
449 }
450
451 #ifdef __x86_64__
452 /// Adds the unsigned integer operand to the CRC-32C checksum of the
453 /// unsigned 64-bit integer operand.
454 ///
455 /// \headerfile <x86intrin.h>
456 ///
457 /// This intrinsic corresponds to the \c CRC32Q instruction.
458 ///
459 /// \param __C
460 /// An unsigned integer operand to add to the CRC-32C checksum of operand
461 /// \a __D.
462 /// \param __D
463 /// An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
464 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
465 /// operand \a __D.
466 static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CRC32
__crc32q(unsigned long long __C,unsigned long long __D)467 __crc32q(unsigned long long __C, unsigned long long __D)
468 {
469 return __builtin_ia32_crc32di(__C, __D);
470 }
471 #endif /* __x86_64__ */
472
473 /// Reads the specified performance-monitoring counter. Refer to your
474 /// processor's documentation to determine which performance counters are
475 /// supported.
476 ///
477 /// \headerfile <x86intrin.h>
478 ///
479 /// This intrinsic corresponds to the \c RDPMC instruction.
480 ///
481 /// \param __A
482 /// The performance counter to read.
483 /// \returns The 64-bit value read from the performance counter.
484 /// \see _rdpmc
485 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__rdpmc(int __A)486 __rdpmc(int __A) {
487 return __builtin_ia32_rdpmc(__A);
488 }
489
490 /// Reads the processor's time-stamp counter and the \c IA32_TSC_AUX MSR
491 /// \c (0xc0000103).
492 ///
493 /// \headerfile <x86intrin.h>
494 ///
495 /// This intrinsic corresponds to the \c RDTSCP instruction.
496 ///
497 /// \param __A
498 /// The address of where to store the 32-bit \c IA32_TSC_AUX value.
499 /// \returns The 64-bit value of the time-stamp counter.
500 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
__rdtscp(unsigned int * __A)501 __rdtscp(unsigned int *__A) {
502 return __builtin_ia32_rdtscp(__A);
503 }
504
505 /// Reads the processor's time-stamp counter.
506 ///
507 /// \headerfile <x86intrin.h>
508 ///
509 /// \code
510 /// unsigned long long _rdtsc();
511 /// \endcode
512 ///
513 /// This intrinsic corresponds to the \c RDTSC instruction.
514 ///
515 /// \returns The 64-bit value of the time-stamp counter.
516 #define _rdtsc() __rdtsc()
517
518 /// Reads the specified performance monitoring counter. Refer to your
519 /// processor's documentation to determine which performance counters are
520 /// supported.
521 ///
522 /// \headerfile <x86intrin.h>
523 ///
524 /// \code
525 /// unsigned long long _rdpmc(int A);
526 /// \endcode
527 ///
528 /// This intrinsic corresponds to the \c RDPMC instruction.
529 ///
530 /// \param A
531 /// The performance counter to read.
532 /// \returns The 64-bit value read from the performance counter.
533 /// \see __rdpmc
534 #define _rdpmc(A) __rdpmc(A)
535
536 static __inline__ void __DEFAULT_FN_ATTRS
_wbinvd(void)537 _wbinvd(void) {
538 __builtin_ia32_wbinvd();
539 }
540
541 /// Rotates an 8-bit value to the left by the specified number of bits.
542 /// This operation is undefined if the number of bits exceeds the size of
543 /// the value.
544 ///
545 /// \headerfile <x86intrin.h>
546 ///
547 /// This intrinsic corresponds to the \c ROL instruction.
548 ///
549 /// \param __X
550 /// The unsigned 8-bit value to be rotated.
551 /// \param __C
552 /// The number of bits to rotate the value.
553 /// \returns The rotated value.
554 static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
__rolb(unsigned char __X,int __C)555 __rolb(unsigned char __X, int __C) {
556 return __builtin_rotateleft8(__X, __C);
557 }
558
559 /// Rotates an 8-bit value to the right by the specified number of bits.
560 /// This operation is undefined if the number of bits exceeds the size of
561 /// the value.
562 ///
563 /// \headerfile <x86intrin.h>
564 ///
565 /// This intrinsic corresponds to the \c ROR instruction.
566 ///
567 /// \param __X
568 /// The unsigned 8-bit value to be rotated.
569 /// \param __C
570 /// The number of bits to rotate the value.
571 /// \returns The rotated value.
572 static __inline__ unsigned char __DEFAULT_FN_ATTRS_CONSTEXPR
__rorb(unsigned char __X,int __C)573 __rorb(unsigned char __X, int __C) {
574 return __builtin_rotateright8(__X, __C);
575 }
576
577 /// Rotates a 16-bit value to the left by the specified number of bits.
578 /// This operation is undefined if the number of bits exceeds the size of
579 /// the value.
580 ///
581 /// \headerfile <x86intrin.h>
582 ///
583 /// This intrinsic corresponds to the \c ROL instruction.
584 ///
585 /// \param __X
586 /// The unsigned 16-bit value to be rotated.
587 /// \param __C
588 /// The number of bits to rotate the value.
589 /// \returns The rotated value.
590 /// \see _rotwl
591 static __inline__ unsigned short __DEFAULT_FN_ATTRS_CONSTEXPR
__rolw(unsigned short __X,int __C)592 __rolw(unsigned short __X, int __C) {
593 return __builtin_rotateleft16(__X, __C);
594 }
595
596 /// Rotates a 16-bit value to the right by the specified number of bits.
597 /// This operation is undefined if the number of bits exceeds the size of
598 /// the value.
599 ///
600 /// \headerfile <x86intrin.h>
601 ///
602 /// This intrinsic corresponds to the \c ROR instruction.
603 ///
604 /// \param __X
605 /// The unsigned 16-bit value to be rotated.
606 /// \param __C
607 /// The number of bits to rotate the value.
608 /// \returns The rotated value.
609 /// \see _rotwr
610 static __inline__ unsigned short __DEFAULT_FN_ATTRS_CONSTEXPR
__rorw(unsigned short __X,int __C)611 __rorw(unsigned short __X, int __C) {
612 return __builtin_rotateright16(__X, __C);
613 }
614
615 /// Rotates a 32-bit value to the left by the specified number of bits.
616 /// This operation is undefined if the number of bits exceeds the size of
617 /// the value.
618 ///
619 /// \headerfile <x86intrin.h>
620 ///
621 /// This intrinsic corresponds to the \c ROL instruction.
622 ///
623 /// \param __X
624 /// The unsigned 32-bit value to be rotated.
625 /// \param __C
626 /// The number of bits to rotate the value.
627 /// \returns The rotated value.
628 /// \see _rotl
629 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR
__rold(unsigned int __X,int __C)630 __rold(unsigned int __X, int __C) {
631 return __builtin_rotateleft32(__X, (unsigned int)__C);
632 }
633
634 /// Rotates a 32-bit value to the right by the specified number of bits.
635 /// This operation is undefined if the number of bits exceeds the size of
636 /// the value.
637 ///
638 /// \headerfile <x86intrin.h>
639 ///
640 /// This intrinsic corresponds to the \c ROR instruction.
641 ///
642 /// \param __X
643 /// The unsigned 32-bit value to be rotated.
644 /// \param __C
645 /// The number of bits to rotate the value.
646 /// \returns The rotated value.
647 /// \see _rotr
648 static __inline__ unsigned int __DEFAULT_FN_ATTRS_CONSTEXPR
__rord(unsigned int __X,int __C)649 __rord(unsigned int __X, int __C) {
650 return __builtin_rotateright32(__X, (unsigned int)__C);
651 }
652
653 #ifdef __x86_64__
654 /// Rotates a 64-bit value to the left by the specified number of bits.
655 /// This operation is undefined if the number of bits exceeds the size of
656 /// the value.
657 ///
658 /// \headerfile <x86intrin.h>
659 ///
660 /// This intrinsic corresponds to the \c ROL instruction.
661 ///
662 /// \param __X
663 /// The unsigned 64-bit value to be rotated.
664 /// \param __C
665 /// The number of bits to rotate the value.
666 /// \returns The rotated value.
667 static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CONSTEXPR
__rolq(unsigned long long __X,int __C)668 __rolq(unsigned long long __X, int __C) {
669 return __builtin_rotateleft64(__X, (unsigned long long)__C);
670 }
671
672 /// Rotates a 64-bit value to the right by the specified number of bits.
673 /// This operation is undefined if the number of bits exceeds the size of
674 /// the value.
675 ///
676 /// \headerfile <x86intrin.h>
677 ///
678 /// This intrinsic corresponds to the \c ROR instruction.
679 ///
680 /// \param __X
681 /// The unsigned 64-bit value to be rotated.
682 /// \param __C
683 /// The number of bits to rotate the value.
684 /// \returns The rotated value.
685 static __inline__ unsigned long long __DEFAULT_FN_ATTRS_CONSTEXPR
__rorq(unsigned long long __X,int __C)686 __rorq(unsigned long long __X, int __C) {
687 return __builtin_rotateright64(__X, (unsigned long long)__C);
688 }
689 #endif /* __x86_64__ */
690
691 #ifndef _MSC_VER
692 /* These are already provided as builtins for MSVC. */
693 /* Select the correct function based on the size of long. */
694 #ifdef __LP64__
695 /// Rotates a 64-bit value to the left by the specified number of bits.
696 /// This operation is undefined if the number of bits exceeds the size of
697 /// the value.
698 ///
699 /// \headerfile <x86intrin.h>
700 ///
701 /// \code
702 /// unsigned long long _lrotl(unsigned long long a, int b);
703 /// \endcode
704 ///
705 /// This intrinsic corresponds to the \c ROL instruction.
706 ///
707 /// \param a
708 /// The unsigned 64-bit value to be rotated.
709 /// \param b
710 /// The number of bits to rotate the value.
711 /// \returns The rotated value.
712 /// \see __rolq
713 #define _lrotl(a,b) __rolq((a), (b))
714
715 /// Rotates a 64-bit value to the right by the specified number of bits.
716 /// This operation is undefined if the number of bits exceeds the size of
717 /// the value.
718 ///
719 /// \headerfile <x86intrin.h>
720 ///
721 /// \code
722 /// unsigned long long _lrotr(unsigned long long a, int b);
723 /// \endcode
724 ///
725 /// This intrinsic corresponds to the \c ROR instruction.
726 ///
727 /// \param a
728 /// The unsigned 64-bit value to be rotated.
729 /// \param b
730 /// The number of bits to rotate the value.
731 /// \returns The rotated value.
732 /// \see __rorq
733 #define _lrotr(a,b) __rorq((a), (b))
734 #else // __LP64__
735 /// Rotates a 32-bit value to the left by the specified number of bits.
736 /// This operation is undefined if the number of bits exceeds the size of
737 /// the value.
738 ///
739 /// \headerfile <x86intrin.h>
740 ///
741 /// \code
742 /// unsigned int _lrotl(unsigned int a, int b);
743 /// \endcode
744 ///
745 /// This intrinsic corresponds to the \c ROL instruction.
746 ///
747 /// \param a
748 /// The unsigned 32-bit value to be rotated.
749 /// \param b
750 /// The number of bits to rotate the value.
751 /// \returns The rotated value.
752 /// \see __rold
753 #define _lrotl(a,b) __rold((a), (b))
754
755 /// Rotates a 32-bit value to the right by the specified number of bits.
756 /// This operation is undefined if the number of bits exceeds the size of
757 /// the value.
758 ///
759 /// \headerfile <x86intrin.h>
760 ///
761 /// \code
762 /// unsigned int _lrotr(unsigned int a, int b);
763 /// \endcode
764 ///
765 /// This intrinsic corresponds to the \c ROR instruction.
766 ///
767 /// \param a
768 /// The unsigned 32-bit value to be rotated.
769 /// \param b
770 /// The number of bits to rotate the value.
771 /// \returns The rotated value.
772 /// \see __rord
773 #define _lrotr(a,b) __rord((a), (b))
774 #endif // __LP64__
775
776 /// Rotates a 32-bit value to the left by the specified number of bits.
777 /// This operation is undefined if the number of bits exceeds the size of
778 /// the value.
779 ///
780 /// \headerfile <x86intrin.h>
781 ///
782 /// \code
783 /// unsigned int _rotl(unsigned int a, int b);
784 /// \endcode
785 ///
786 /// This intrinsic corresponds to the \c ROL instruction.
787 ///
788 /// \param a
789 /// The unsigned 32-bit value to be rotated.
790 /// \param b
791 /// The number of bits to rotate the value.
792 /// \returns The rotated value.
793 /// \see __rold
794 #define _rotl(a,b) __rold((a), (b))
795
796 /// Rotates a 32-bit value to the right by the specified number of bits.
797 /// This operation is undefined if the number of bits exceeds the size of
798 /// the value.
799 ///
800 /// \headerfile <x86intrin.h>
801 ///
802 /// \code
803 /// unsigned int _rotr(unsigned int a, int b);
804 /// \endcode
805 ///
806 /// This intrinsic corresponds to the \c ROR instruction.
807 ///
808 /// \param a
809 /// The unsigned 32-bit value to be rotated.
810 /// \param b
811 /// The number of bits to rotate the value.
812 /// \returns The rotated value.
813 /// \see __rord
814 #define _rotr(a,b) __rord((a), (b))
815 #endif // _MSC_VER
816
817 /* These are not builtins so need to be provided in all modes. */
818 /// Rotates a 16-bit value to the left by the specified number of bits.
819 /// This operation is undefined if the number of bits exceeds the size of
820 /// the value.
821 ///
822 /// \headerfile <x86intrin.h>
823 ///
824 /// \code
825 /// unsigned short _rotwl(unsigned short a, int b);
826 /// \endcode
827 ///
828 /// This intrinsic corresponds to the \c ROL instruction.
829 ///
830 /// \param a
831 /// The unsigned 16-bit value to be rotated.
832 /// \param b
833 /// The number of bits to rotate the value.
834 /// \returns The rotated value.
835 /// \see __rolw
836 #define _rotwl(a,b) __rolw((a), (b))
837
838 /// Rotates a 16-bit value to the right by the specified number of bits.
839 /// This operation is undefined if the number of bits exceeds the size of
840 /// the value.
841 ///
842 /// \headerfile <x86intrin.h>
843 ///
844 /// \code
845 /// unsigned short _rotwr(unsigned short a, int b);
846 /// \endcode
847 ///
848 /// This intrinsic corresponds to the \c ROR instruction.
849 ///
850 /// \param a
851 /// The unsigned 16-bit value to be rotated.
852 /// \param b
853 /// The number of bits to rotate the value.
854 /// \returns The rotated value.
855 /// \see __rorw
856 #define _rotwr(a,b) __rorw((a), (b))
857
858 #undef __DEFAULT_FN_ATTRS
859 #undef __DEFAULT_FN_ATTRS_CAST
860 #undef __DEFAULT_FN_ATTRS_CRC32
861 #undef __DEFAULT_FN_ATTRS_CONSTEXPR
862
863 #endif /* __IA32INTRIN_H */
864