Andi Kleen <a...@firstfloor.org> writes:

Ping!

> From: Andi Kleen <a...@linux.intel.com>
>
> Add builtins/intrinsics for PTWRITE. PTWRITE is a new instruction on Intel 
> Gemini Lake/
> Goldmont Plus that allows to write values into the Processor Trace log. This 
> allows
> very light weight instrumentation of programs.
>
> The intrinsics are compatible to icc. Automatically enabled for Goldmont Plus.
>
> gcc/:
>
> 2018-11-03  Andi Kleen  <a...@linux.intel.com>
>
>       * common/config/i386/i386-common.c (OPTION_MASK_ISA_PTWRITE_SET): New.
>       (OPTION_MASK_ISA_PTWRITE_UNSET): New.
>       (ix86_handle_option): Handle OPT_mptwrite.
>       * config/i386/cpuid.h (bit_PTWRITE): Add.
>       * config/i386/driver-i386.c (host_detect_local_cpu): Detect ptwrite.
>       * config/i386/i386-builtin.def (BDESC): Add ptwrite32/64.
>       * config/i386/i386-c.c (ix86_target_macros_internal): Define 
> __PTWRITE__.
>       * config/i386/i386.c (ix86_target_string): Handle ptwrite.
>       (ix86_option_override_internal): Handle PTA_PTWRITE.
>       (ix86_valid_target_attribute_inner_p): Define ptwrite.
>       (def_builtin2): Force UINT64 to be 64bit only.
>       * config/i386/i386.h (TARGET_PTWRITE): Add.
>       (TARGET_PTWRITE_P): Add.
>       (PTA_PTWRITE): Add.
>       * config/i386/i386.md: Define ptwrite.
>       * config/i386/i386.opt: Add -mptwrite.
>       * config/i386/immintrin.h (_ptwrite64): Add.
>       (_ptwrite32): Add
>       * doc/extend.texi: Document __builtin_ia32_ptwrite*.
>       * doc/invoke.texi: Document -mptwrite.
>
> gcc/testsuite/ChangeLog:
>
> 2018-11-03  Andi Kleen  <a...@linux.intel.com>
>
>       * gcc.target/i386/ptwrite1.c: New test.
>       * gcc.target/i386/ptwrite2.c: New test.
> ---
>  gcc/common/config/i386/i386-common.c     | 15 ++++++++++++
>  gcc/config/i386/cpuid.h                  |  4 ++++
>  gcc/config/i386/driver-i386.c            | 12 ++++++++++
>  gcc/config/i386/i386-builtin.def         |  4 ++++
>  gcc/config/i386/i386-c.c                 |  2 ++
>  gcc/config/i386/i386.c                   |  9 ++++++-
>  gcc/config/i386/i386.h                   |  5 +++-
>  gcc/config/i386/i386.md                  | 10 ++++++++
>  gcc/config/i386/i386.opt                 |  4 ++++
>  gcc/config/i386/immintrin.h              | 26 ++++++++++++++++++++
>  gcc/doc/extend.texi                      |  9 +++++++
>  gcc/doc/invoke.texi                      |  7 ++++--
>  gcc/testsuite/gcc.target/i386/ptwrite1.c | 30 ++++++++++++++++++++++++
>  gcc/testsuite/gcc.target/i386/ptwrite2.c | 14 +++++++++++
>  14 files changed, 147 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/ptwrite1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/ptwrite2.c
>
> diff --git a/gcc/common/config/i386/i386-common.c 
> b/gcc/common/config/i386/i386-common.c
> index f12806ef3a9..f740995c1e4 100644
> --- a/gcc/common/config/i386/i386-common.c
> +++ b/gcc/common/config/i386/i386-common.c
> @@ -140,6 +140,7 @@ along with GCC; see the file COPYING3.  If not see
>  
>  #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
>  #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
> +#define OPTION_MASK_ISA_PTWRITE_SET OPTION_MASK_ISA_PTWRITE
>  #define OPTION_MASK_ISA_F16C_SET \
>    (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
>  #define OPTION_MASK_ISA_MWAITX_SET OPTION_MASK_ISA_MWAITX
> @@ -267,6 +268,7 @@ along with GCC; see the file COPYING3.  If not see
>  
>  #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
>  #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
> +#define OPTION_MASK_ISA_PTWRITE_UNSET OPTION_MASK_ISA_PTWRITE
>  #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
>  
>  #define OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET \
> @@ -1125,6 +1127,19 @@ ix86_handle_option (struct gcc_options *opts,
>       }
>        return true;
>  
> +    case OPT_mptwrite:
> +      if (value)
> +     {
> +       opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA_PTWRITE_SET;
> +       opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA_PTWRITE_SET;
> +     }
> +      else
> +     {
> +       opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA_PTWRITE_UNSET;
> +       opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA_PTWRITE_UNSET;
> +     }
> +      return true;
> +
>      case OPT_mf16c:
>        if (value)
>       {
> diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
> index 7e9e2d153dc..2e6d4a55602 100644
> --- a/gcc/config/i386/cpuid.h
> +++ b/gcc/config/i386/cpuid.h
> @@ -126,6 +126,10 @@
>  #define bit_XSAVEC   (1 << 1)
>  #define bit_XSAVES   (1 << 3)
>  
> +/* PT sub leaf (%eax == 14, %ecx == 0) */
> +/* %ebx */
> +#define bit_PTWRITE  (1 << 4)
> +
>  /* Signatures for different CPU implementations as returned in uses
>     of cpuid with level 0.  */
>  #define signature_AMD_ebx    0x68747541
> diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
> index 8c830bde1dd..423b1c3827f 100644
> --- a/gcc/config/i386/driver-i386.c
> +++ b/gcc/config/i386/driver-i386.c
> @@ -427,6 +427,8 @@ const char *host_detect_local_cpu (int argc, const char 
> **argv)
>    unsigned int has_waitpkg = 0;
>    unsigned int has_cldemote = 0;
>  
> +  unsigned int has_ptwrite = 0;
> +
>    bool arch;
>  
>    unsigned int l2sizekb = 0;
> @@ -542,6 +544,13 @@ const char *host_detect_local_cpu (int argc, const char 
> **argv)
>        has_xsaves = eax & bit_XSAVES;
>      }
>  
> +  if (max_level >= 0x14)
> +    {
> +      __cpuid_count (0x14, 0, eax, ebx, ecx, edx);
> +
> +      has_ptwrite = ebx & bit_PTWRITE;
> +    }
> +
>    /* Check cpuid level of extended features.  */
>    __cpuid (0x80000000, ext_level, ebx, ecx, edx);
>  
> @@ -1124,6 +1133,8 @@ const char *host_detect_local_cpu (int argc, const char 
> **argv)
>        const char *movdir64b = has_movdir64b ? " -mmovdir64b" : " 
> -mno-movdir64b";
>        const char *waitpkg = has_waitpkg ? " -mwaitpkg" : " -mno-waitpkg";
>        const char *cldemote = has_cldemote ? " -mcldemote" : " -mno-cldemote";
> +      const char *ptwrite = has_ptwrite ? " -mptwrite" : " -mno-ptwrite";
> +
>        options = concat (options, mmx, mmx3dnow, sse, sse2, sse3, ssse3,
>                       sse4a, cx16, sahf, movbe, aes, sha, pclmul,
>                       popcnt, abm, lwp, fma, fma4, xop, bmi, sgx, bmi2,
> @@ -1137,6 +1148,7 @@ const char *host_detect_local_cpu (int argc, const char 
> **argv)
>                       clwb, mwaitx, clzero, pku, rdpid, gfni, shstk,
>                       avx512vbmi2, avx512vnni, vaes, vpclmulqdq,
>                       avx512bitalg, movdiri, movdir64b, waitpkg, cldemote,
> +                     ptwrite,
>                       NULL);
>      }
>  
> diff --git a/gcc/config/i386/i386-builtin.def 
> b/gcc/config/i386/i386-builtin.def
> index df0f7e975ac..ca3f357228f 100644
> --- a/gcc/config/i386/i386-builtin.def
> +++ b/gcc/config/i386/i386-builtin.def
> @@ -2879,6 +2879,10 @@ BDESC_FIRST (special_args2, SPECIAL_ARGS2,
>       OPTION_MASK_ISA_WBNOINVD, CODE_FOR_wbnoinvd, "__builtin_ia32_wbnoinvd", 
> IX86_BUILTIN_WBNOINVD, UNKNOWN, (int) VOID_FTYPE_VOID)
>  BDESC (OPTION_MASK_ISA_MOVDIR64B, CODE_FOR_nothing, 
> "__builtin_ia32_movdir64b", IX86_BUILTIN_MOVDIR64B, UNKNOWN, (int) 
> VOID_FTYPE_PVOID_PCVOID)
>  
> +/* PTWRITE */
> +BDESC (OPTION_MASK_ISA_PTWRITE, CODE_FOR_ptwritesi, 
> "__builtin_ia32_ptwrite32", IX86_BUILTIN_PTWRITE32, UNKNOWN, (int) 
> VOID_FTYPE_UNSIGNED)
> +BDESC (OPTION_MASK_ISA_PTWRITE, CODE_FOR_ptwritedi, 
> "__builtin_ia32_ptwrite64", IX86_BUILTIN_PTWRITE64, UNKNOWN, (int) 
> VOID_FTYPE_UINT64)
> +
>  BDESC_END (SPECIAL_ARGS2, MULTI_ARG)
>  
>  /* FMA4 and XOP.  */
> diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
> index 005e1a5b308..4661d00f85d 100644
> --- a/gcc/config/i386/i386-c.c
> +++ b/gcc/config/i386/i386-c.c
> @@ -532,6 +532,8 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
>      def_or_undef (parse_in, "__WAITPKG__");
>    if (isa_flag2 & OPTION_MASK_ISA_CLDEMOTE)
>      def_or_undef (parse_in, "__CLDEMOTE__");
> +  if (isa_flag2 & OPTION_MASK_ISA_PTWRITE)
> +    def_or_undef (parse_in, "__PTWRITE__");
>    if (TARGET_IAMCU)
>      {
>        def_or_undef (parse_in, "__iamcu");
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 963c7fcbb34..490bb6292a8 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -2793,7 +2793,8 @@ ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT 
> isa2,
>      { "-mmwaitx",    OPTION_MASK_ISA_MWAITX },
>      { "-mmovdir64b", OPTION_MASK_ISA_MOVDIR64B },
>      { "-mwaitpkg",   OPTION_MASK_ISA_WAITPKG },
> -    { "-mcldemote",  OPTION_MASK_ISA_CLDEMOTE }
> +    { "-mcldemote",  OPTION_MASK_ISA_CLDEMOTE },
> +    { "-mptwrite",   OPTION_MASK_ISA_PTWRITE }
>    };
>    static struct ix86_target_opts isa_opts[] =
>    {
> @@ -3875,6 +3876,9 @@ ix86_option_override_internal (bool main_args_p,
>       if (((processor_alias_table[i].flags & PTA_WBNOINVD) != 0)
>           && !(opts->x_ix86_isa_flags2_explicit & OPTION_MASK_ISA_WBNOINVD))
>         opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA_WBNOINVD;
> +     if (((processor_alias_table[i].flags & PTA_PTWRITE) != 0)
> +         && !(opts->x_ix86_isa_flags2_explicit & OPTION_MASK_ISA_PTWRITE))
> +       opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA_PTWRITE;
>  
>       if ((processor_alias_table[i].flags
>          & (PTA_PREFETCH_SSE | PTA_SSE)) != 0)
> @@ -5077,6 +5081,7 @@ ix86_valid_target_attribute_inner_p (tree args, char 
> *p_strings[],
>      IX86_ATTR_ISA ("movdir64b", OPT_mmovdir64b),
>      IX86_ATTR_ISA ("waitpkg", OPT_mwaitpkg),
>      IX86_ATTR_ISA ("cldemote", OPT_mcldemote),
> +    IX86_ATTR_ISA ("ptwrite",   OPT_mptwrite),
>  
>      /* enum options */
>      IX86_ATTR_ENUM ("fpmath=",       OPT_mfpmath_),
> @@ -30180,6 +30185,8 @@ def_builtin2 (HOST_WIDE_INT mask, const char *name,
>    tree decl = NULL_TREE;
>  
>    ix86_builtins_isa[(int) code].isa2 = mask;
> +  if (tcode == VOID_FTYPE_UINT64)
> +    ix86_builtins_isa[(int) code].isa = OPTION_MASK_ISA_64BIT;
>  
>    if (mask == 0
>        || (mask & ix86_isa_flags2) != 0
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index 01d49a7263b..39d3e59c8dd 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -191,6 +191,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
> If not, see
>  #define TARGET_WAITPKG_P(x)  TARGET_ISA_WAITPKG_P(x)
>  #define TARGET_CLDEMOTE      TARGET_ISA_CLDEMOTE
>  #define TARGET_CLDEMOTE_P(x) TARGET_ISA_CLDEMOTE_P(x)
> +#define TARGET_PTWRITE       TARGET_ISA_PTWRITE
> +#define TARGET_PTWRITE_P(x)  TARGET_ISA_PTWRITE_P(x)
>  
>  #define TARGET_LP64  TARGET_ABI_64
>  #define TARGET_LP64_P(x)     TARGET_ABI_64_P(x)
> @@ -2354,6 +2356,7 @@ const wide_int_bitmask PTA_RDPID (0, HOST_WIDE_INT_1U 
> << 6);
>  const wide_int_bitmask PTA_PCONFIG (0, HOST_WIDE_INT_1U << 7);
>  const wide_int_bitmask PTA_WBNOINVD (0, HOST_WIDE_INT_1U << 8);
>  const wide_int_bitmask PTA_WAITPKG (0, HOST_WIDE_INT_1U << 9);
> +const wide_int_bitmask PTA_PTWRITE (0, HOST_WIDE_INT_1U << 10);
>  
>  const wide_int_bitmask PTA_CORE2 = PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2
>    | PTA_SSE3 | PTA_SSSE3 | PTA_CX16 | PTA_FXSR;
> @@ -2389,7 +2392,7 @@ const wide_int_bitmask PTA_GOLDMONT = PTA_SILVERMONT | 
> PTA_SHA | PTA_XSAVE
>    | PTA_RDSEED | PTA_XSAVEC | PTA_XSAVES | PTA_CLFLUSHOPT | PTA_XSAVEOPT
>    | PTA_FSGSBASE;
>  const wide_int_bitmask PTA_GOLDMONT_PLUS = PTA_GOLDMONT | PTA_RDPID
> -  | PTA_SGX;
> +  | PTA_SGX | PTA_PTWRITE;
>  const wide_int_bitmask PTA_TREMONT = PTA_GOLDMONT_PLUS | PTA_CLWB
>    | PTA_GFNI;
>  const wide_int_bitmask PTA_KNM = PTA_KNL | PTA_AVX5124VNNIW
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 7fb2b144f47..bdc39456106 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -292,6 +292,8 @@
>  
>    ;; For Speculation Barrier support
>    UNSPECV_SPECULATION_BARRIER
> +
> +  UNSPECV_PTWRITE
>  ])
>  
>  ;; Constants to represent rounding modes in the ROUND instruction
> @@ -19498,6 +19500,14 @@
>    [(set_attr "type" "other")
>     (set_attr "prefix_extra" "2")])
>  
> +(define_insn "ptwrite<mode>"
> +  [(unspec_volatile [(match_operand:SWI48 0 "register_operand" "r")]
> +                 UNSPECV_PTWRITE)]
> +  "TARGET_PTWRITE"
> +  "ptwrite\t%0"
> +  [(set_attr "type" "other")
> +   (set_attr "prefix_extra" "2")])
> +
>  (define_insn "rdrand<mode>_1"
>    [(set (match_operand:SWI248 0 "register_operand" "=r")
>       (unspec_volatile:SWI248 [(const_int 0)] UNSPECV_RDRAND))
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index e7fbf9b6f99..1705815a2ec 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -785,6 +785,10 @@ mwbnoinvd
>  Target Report Mask(ISA_WBNOINVD) Var(ix86_isa_flags2) Save
>  Support WBNOINVD built-in functions and code generation.
>  
> +mptwrite
> +Target Report Mask(ISA_PTWRITE) Var(ix86_isa_flags2) Save
> +Support PTWRITE built-in functions and code generation.
> +
>  msgx
>  Target Report Mask(ISA_SGX) Var(ix86_isa_flags2) Save
>  Support SGX built-in functions and code generation.
> diff --git a/gcc/config/i386/immintrin.h b/gcc/config/i386/immintrin.h
> index 344e92c745a..b52ab91b4d5 100644
> --- a/gcc/config/i386/immintrin.h
> +++ b/gcc/config/i386/immintrin.h
> @@ -251,4 +251,30 @@ _rdrand64_step (unsigned long long *__P)
>  
>  #endif /* __x86_64__  */
>  
> +#ifndef __PTWRITE__
> +#pragma GCC push_options
> +#pragma GCC target("ptwrite")
> +#define __DISABLE_PTWRITE__
> +#endif
> +
> +#ifdef __x86_64__
> +extern __inline void
> +__attribute__((__gnu_inline__, __always_inline__, __artificial__))
> +_ptwrite64 (unsigned long long __B)
> +{
> +  __builtin_ia32_ptwrite64 (__B);
> +}
> +#endif /* __x86_64__ */
> +
> +extern __inline void
> +__attribute__((__gnu_inline__, __always_inline__, __artificial__))
> +_ptwrite32 (unsigned __B)
> +{
> +  __builtin_ia32_ptwrite32 (__B);
> +}
> +#ifdef __DISABLE_PTWRITE__
> +#undef __DISABLE_PTWRITE__
> +#pragma GCC pop_options
> +#endif /* __DISABLE_PTWRITE__ */
> +
>  #endif /* _IMMINTRIN_H_INCLUDED */
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index e2b9ee11a54..1eca009e255 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -21331,6 +21331,15 @@ unsigned int __builtin_ia32_rdrand32_step (unsigned 
> int *)
>  unsigned int __builtin_ia32_rdrand64_step (unsigned long long *)
>  @end smallexample
>  
> +The following built-in function is available when @option{-mptwrite} is
> +used.  All of them generate the machine instruction that is part of the
> +name.
> +
> +@smallexample
> +void __builtin_ia32_ptwrite32 (unsigned)
> +void __builtin_ia32_ptwrite64 (unsigned long long)
> +@end smallexample
> +
>  The following built-in functions are available when @option{-msse4a} is used.
>  All of them generate the machine instruction that is part of the name.
>  
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index e290128f535..cb5bc7bafc5 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1281,7 +1281,7 @@ See RS/6000 and PowerPC Options.
>  -mmmx  -msse  -msse2  -msse3  -mssse3  -msse4.1  -msse4.2  -msse4  -mavx @gol
>  -mavx2  -mavx512f  -mavx512pf  -mavx512er  -mavx512cd  -mavx512vl @gol
>  -mavx512bw  -mavx512dq  -mavx512ifma  -mavx512vbmi  -msha  -maes @gol
> --mpclmul  -mfsgsbase  -mrdrnd  -mf16c  -mfma -mpconfig -mwbnoinvd @gol
> +-mpclmul  -mfsgsbase  -mrdrnd  -mf16c  -mfma -mpconfig -mwbnoinvd -mptwrite 
> @gol
>  -mprefetchwt1  -mclflushopt  -mxsavec  -mxsaves @gol
>  -msse4a  -m3dnow  -m3dnowa  -mpopcnt  -mabm  -mbmi  -mtbm  -mfma4  -mxop @gol
>  -mlzcnt  -mbmi2  -mfxsr  -mxsave  -mxsaveopt  -mrtm  -mlwp @gol
> @@ -27815,6 +27815,9 @@ preferred alignment to 
> @option{-mpreferred-stack-boundary=2}.
>  @itemx -mfsgsbase
>  @opindex mfsgsbase
>  @need 200
> +@itemx -mptwrite
> +@opindex mptwrite
> +@need 200
>  @itemx -mrdrnd
>  @opindex mrdrnd
>  @need 200
> @@ -27923,7 +27926,7 @@ preferred alignment to 
> @option{-mpreferred-stack-boundary=2}.
>  @opindex mcldemote
>  These switches enable the use of instructions in the MMX, SSE,
>  SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD,
> -SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM,
> +SHA, AES, PCLMUL, FSGSBASE, PTWRITE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, 
> LWP, ABM,
>  AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, BMI, BMI2, VAES, 
> WAITPKG,
>  FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MWAITX, PKU, IBT, SHSTK, AVX512VBMI2,
>  GFNI, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B,
> diff --git a/gcc/testsuite/gcc.target/i386/ptwrite1.c 
> b/gcc/testsuite/gcc.target/i386/ptwrite1.c
> new file mode 100644
> index 00000000000..e09028ed428
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/ptwrite1.c
> @@ -0,0 +1,30 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mptwrite" } */
> +/* { dg-final { scan-assembler "ptwrite" } } */
> +
> +void ptwrite1(int a)
> +{
> +  __builtin_ia32_ptwrite32 (a);
> +}
> +
> +#ifdef __x86_64__
> +void ptwrite2(unsigned long b)
> +{
> +  __builtin_ia32_ptwrite64 (b);
> +}
> +
> +void ptwrite3(unsigned char b)
> +{
> +  __builtin_ia32_ptwrite64 (b);
> +}
> +
> +void ptwrite4(unsigned short b)
> +{
> +  __builtin_ia32_ptwrite64 (b);
> +}
> +#endif
> +
> +void ptwrite5(unsigned short b)
> +{
> +  __builtin_ia32_ptwrite32 (b);
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/ptwrite2.c 
> b/gcc/testsuite/gcc.target/i386/ptwrite2.c
> new file mode 100644
> index 00000000000..299c6511ef4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/ptwrite2.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mptwrite " } */
> +/* { dg-final { scan-assembler "ptwrite.*r" } } */
> +/* { dg-final { scan-assembler "ptwrite.*e" } } */
> +
> +#include <x86intrin.h>
> +
> +void ptwrite1(void)
> +{
> +  _ptwrite32 (1);
> +#ifdef __x86_64__
> +  _ptwrite64 (2);
> +#endif
> +}

Reply via email to