[PATCH] Implement __readeflags and __writeeflags intrinsics

Eric Christopher echristo at gmail.com
Mon Dec 30 08:12:24 PST 2013


So why are you wanting to make Intrin.h non-windows? Is there a
version of Intrin.h that's cross platform?

-eric

On Mon, Dec 30, 2013 at 5:35 AM, Alexey Volkov <avolkov.intel at gmail.com> wrote:
>   I moved intrinsics to Intrin.h into non-Windows section since Windows part of header cannot be compiled on Linux.
>   I also removed include_next directive for Linux.
>
> http://llvm-reviews.chandlerc.com/D2468
>
> CHANGE SINCE LAST DIFF
>   http://llvm-reviews.chandlerc.com/D2468?vs=6263&id=6313#toc
>
> Files:
>   lib/Headers/Intrin.h
>
> Index: lib/Headers/Intrin.h
> ===================================================================
> --- lib/Headers/Intrin.h
> +++ lib/Headers/Intrin.h
> @@ -21,17 +21,65 @@
>   *===-----------------------------------------------------------------------===
>   */
>
> -/* Only include this if we're compiling for the windows platform. */
> -#ifndef _MSC_VER
> -#include_next <Intrin.h>
> -#else
> -
>  #ifndef __INTRIN_H
>  #define __INTRIN_H
>
>  /* First include the standard intrinsics. */
>  #include <x86intrin.h>
>
> +#ifndef _MSC_VER
> +#ifdef __x86_64__
> +static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
> +__readeflags(void)
> +{
> +  unsigned long long res = 0;
> +  __asm__ __volatile__ ("pushf\n\t"
> +                        "popq %0\n"
> +                        :"=r"(res)
> +                        :
> +                        :
> +                       );
> +  return res;
> +}
> +
> +static __inline__ void __attribute__((__always_inline__, __nodebug__))
> +__writeeflags(unsigned long long __f)
> +{
> +  __asm__ __volatile__ ("pushq %0\n\t"
> +                        "popf\n"
> +                        :
> +                        :"r"(__f)
> +                        :"flags"
> +                       );
> +}
> +
> +#else
> +static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
> +__readeflags(void)
> +{
> +  unsigned int res = 0;
> +  __asm__ __volatile__ ("pushf\n\t"
> +                        "popl %0\n"
> +                        :"=r"(res)
> +                        :
> +                        :
> +                       );
> +  return res;
> +}
> +
> +static __inline__ void __attribute__((__always_inline__, __nodebug__))
> +__writeeflags(unsigned int __f)
> +{
> +  __asm__ __volatile__ ("pushl %0\n\t"
> +                        "popf\n"
> +                        :
> +                        :"r"(__f)
> +                        :"flags"
> +                       );
> +}
> +#endif
> +#else
> +
>  #ifdef __cplusplus
>  extern "C" {
>  #endif
> @@ -780,5 +828,5 @@
>  }
>  #endif
>
> -#endif /* __INTRIN_H */
>  #endif /* _MSC_VER */
> +#endif /* __INTRIN_H */



More information about the cfe-commits mailing list