11188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/*===---- lzcntintrin.h - LZCNT intrinsics ---------------------------------===
21188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
31188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * Permission is hereby granted, free of charge, to any person obtaining a copy
41188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * of this software and associated documentation files (the "Software"), to deal
51188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * in the Software without restriction, including without limitation the rights
61188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
71188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * copies of the Software, and to permit persons to whom the Software is
81188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * furnished to do so, subject to the following conditions:
91188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * The above copyright notice and this permission notice shall be included in
111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * all copies or substantial portions of the Software.
121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
171188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
181188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker * THE SOFTWARE.
201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *
211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker *===-----------------------------------------------------------------------===
221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker */
231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#error "Never use <lzcntintrin.h> directly; include <x86intrin.h> instead."
261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif
271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#ifndef __LZCNTINTRIN_H
291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define __LZCNTINTRIN_H
301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker/* Define the default attributes for the functions in this file. */
321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("lzcnt")))
331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
341188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned short __DEFAULT_FN_ATTRS
351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__lzcnt16(unsigned short __X)
361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
371188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_clzs(__X) : 16;
381188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
391188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
401188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
411188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__lzcnt32(unsigned int __X)
421188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
431188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_clz(__X) : 32;
441188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
451188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
461188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned int __DEFAULT_FN_ATTRS
471188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_lzcnt_u32(unsigned int __X)
481188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
491188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_clz(__X) : 32;
501188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
511188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
521188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#ifdef __x86_64__
531188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
541188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker__lzcnt64(unsigned long long __X)
551188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
561188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_clzll(__X) : 64;
571188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
581188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
591188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS
601188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker_lzcnt_u64(unsigned long long __X)
611188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker{
621188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  return __X ? __builtin_clzll(__X) : 64;
631188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}
641188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif
651188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
661188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#undef __DEFAULT_FN_ATTRS
671188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
681188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif /* __LZCNTINTRIN_H */
69