1 /*===---- bmiintrin.h - Implementation of BMI intrinsics on PowerPC --------=== 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 #if !defined X86GPRINTRIN_H_ 11 #error "Never use <bmiintrin.h> directly; include <x86gprintrin.h> instead." 12 #endif 13 14 #ifndef BMIINTRIN_H_ 15 #define BMIINTRIN_H_ 16 17 extern __inline unsigned short 18 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 19 __tzcnt_u16(unsigned short __X) { 20 return __builtin_ctz(__X); 21 } 22 23 extern __inline unsigned int 24 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 25 __andn_u32(unsigned int __X, unsigned int __Y) { 26 return (~__X & __Y); 27 } 28 29 extern __inline unsigned int 30 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 31 _bextr_u32(unsigned int __X, unsigned int __P, unsigned int __L) { 32 return ((__X << (32 - (__L + __P))) >> (32 - __L)); 33 } 34 35 extern __inline unsigned int 36 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 37 __bextr_u32(unsigned int __X, unsigned int __Y) { 38 unsigned int __P, __L; 39 __P = __Y & 0xFF; 40 __L = (__Y >> 8) & 0xFF; 41 return (_bextr_u32(__X, __P, __L)); 42 } 43 44 extern __inline unsigned int 45 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 46 __blsi_u32(unsigned int __X) { 47 return (__X & -__X); 48 } 49 50 extern __inline unsigned int 51 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 52 _blsi_u32(unsigned int __X) { 53 return __blsi_u32(__X); 54 } 55 56 extern __inline unsigned int 57 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 58 __blsmsk_u32(unsigned int __X) { 59 return (__X ^ (__X - 1)); 60 } 61 62 extern __inline unsigned int 63 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 64 _blsmsk_u32(unsigned int __X) { 65 return __blsmsk_u32(__X); 66 } 67 68 extern __inline unsigned int 69 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 70 __blsr_u32(unsigned int __X) { 71 return (__X & (__X - 1)); 72 } 73 74 extern __inline unsigned int 75 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 76 _blsr_u32(unsigned int __X) { 77 return __blsr_u32(__X); 78 } 79 80 extern __inline unsigned int 81 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 82 __tzcnt_u32(unsigned int __X) { 83 return __builtin_ctz(__X); 84 } 85 86 extern __inline unsigned int 87 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 88 _tzcnt_u32(unsigned int __X) { 89 return __builtin_ctz(__X); 90 } 91 92 /* use the 64-bit shift, rotate, and count leading zeros instructions 93 for long long. */ 94 #ifdef __PPC64__ 95 extern __inline unsigned long long 96 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 97 __andn_u64(unsigned long long __X, unsigned long long __Y) { 98 return (~__X & __Y); 99 } 100 101 extern __inline unsigned long long 102 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 103 _bextr_u64(unsigned long long __X, unsigned int __P, unsigned int __L) { 104 return ((__X << (64 - (__L + __P))) >> (64 - __L)); 105 } 106 107 extern __inline unsigned long long 108 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 109 __bextr_u64(unsigned long long __X, unsigned long long __Y) { 110 unsigned int __P, __L; 111 __P = __Y & 0xFF; 112 __L = (__Y & 0xFF00) >> 8; 113 return (_bextr_u64(__X, __P, __L)); 114 } 115 116 extern __inline unsigned long long 117 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 118 __blsi_u64(unsigned long long __X) { 119 return __X & -__X; 120 } 121 122 extern __inline unsigned long long 123 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 124 _blsi_u64(unsigned long long __X) { 125 return __blsi_u64(__X); 126 } 127 128 extern __inline unsigned long long 129 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 130 __blsmsk_u64(unsigned long long __X) { 131 return (__X ^ (__X - 1)); 132 } 133 134 extern __inline unsigned long long 135 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 136 _blsmsk_u64(unsigned long long __X) { 137 return __blsmsk_u64(__X); 138 } 139 140 extern __inline unsigned long long 141 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 142 __blsr_u64(unsigned long long __X) { 143 return (__X & (__X - 1)); 144 } 145 146 extern __inline unsigned long long 147 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 148 _blsr_u64(unsigned long long __X) { 149 return __blsr_u64(__X); 150 } 151 152 extern __inline unsigned long long 153 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 154 __tzcnt_u64(unsigned long long __X) { 155 return __builtin_ctzll(__X); 156 } 157 158 extern __inline unsigned long long 159 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 160 _tzcnt_u64(unsigned long long __X) { 161 return __builtin_ctzll(__X); 162 } 163 #endif /* __PPC64__ */ 164 165 #endif /* BMIINTRIN_H_ */ 166