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