]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386-common.c (OPTION_MASK_ISA_RDSEED_SET): New.
authorKirill Yukhin <kirill.yukhin@intel.com>
Mon, 30 Jul 2012 13:40:25 +0000 (13:40 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Mon, 30 Jul 2012 13:40:25 +0000 (13:40 +0000)
/
        * common/config/i386/i386-common.c (OPTION_MASK_ISA_RDSEED_SET): New.
        (OPTION_MASK_ISA_RDSEED_UNSET): Likewise.
        (ix86_handle_option): Handle mrdseed option.
        * config.gcc (i[34567]86-*-*): Add rdseedintrin.h.
        (x86_64-*-*): Likewise.
        * config/i386/prfchwintrin.h: New header.
        * config/i386/cpuid.h (bit_RDSEED): New.
        * config/i386/driver-i386.c (host_detect_local_cpu): Detect
        RDSEED support.
        * config/i386/i386-c.c: Define __RDSEED__ if needed.
        * config/i386/i386.c (ix86_target_string): Define
        -mrdseed option.
        (PTA_RDSEED): New.
        (ix86_option_override_internal): Handle new option.
        (ix86_valid_target_attribute_inner_p): Add OPT_mrdseed.
        (ix86_builtins): Add enum entries for RDSEED* builtins.
        (ix86_init_mmx_sse_builtins): Define new builtins.
        (ix86_expand_builtin): Expand RDSEED* builtins.
        * config/i386/i386.h (TARGET_RDSEED): New.
        * config/i386/i386.md (rdseed<mode>_1): New.
        * config/i386/i386.opt (mrdseed): New.
        * config/i386/x86intrin.h: Include rdseedintrin.h.

testsuite/
        * gcc.target/i386/rdseed16-1.c: New.
        * gcc.target/i386/rdseed32-1.c: Ditto
        * gcc.target/i386/rdseed64-1.c: Ditto
        * gcc.target/i386/sse-12.c: Add -mrdseed.
        * gcc.target/i386/sse-13.c: Ditto.
        * gcc.target/i386/sse-14.c: Ditto.
        * g++.dg/other/i386-2.C: Ditto.
        * g++.dg/other/i386-3.C: Ditto.

Co-Authored-By: Michael Zolotukhin <michael.v.zolotukhin@intel.com>
From-SVN: r189973

22 files changed:
gcc/ChangeLog
gcc/common/config/i386/i386-common.c
gcc/config.gcc
gcc/config/i386/driver-i386.c
gcc/config/i386/i386-c.c
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md
gcc/config/i386/i386.opt
gcc/config/i386/rdseedintrin.h [new file with mode: 0644]
gcc/config/i386/x86intrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/i386-2.C
gcc/testsuite/g++.dg/other/i386-3.C
gcc/testsuite/gcc.target/i386/rdseed16-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/rdseed32-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/rdseed64-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/sse-12.c
gcc/testsuite/gcc.target/i386/sse-13.c
gcc/testsuite/gcc.target/i386/sse-14.c
gcc/testsuite/gcc.target/i386/sse-22.c
gcc/testsuite/gcc.target/i386/sse-23.c

index 2b445f8cc9ef764714336fb61ec19affe54a2f71..f73410d12d5a4eac42b92d5443daade5b62372bc 100644 (file)
@@ -1,3 +1,29 @@
+2012-07-30  Kirill Yukhin  <kirill.yukhin@intel.com>
+           Michael Zolotukhin  <michael.v.zolotukhin@intel.com>
+
+       * common/config/i386/i386-common.c (OPTION_MASK_ISA_RDSEED_SET): New.
+       (OPTION_MASK_ISA_RDSEED_UNSET): Likewise.
+       (ix86_handle_option): Handle mrdseed option.
+       * config.gcc (i[34567]86-*-*): Add rdseedintrin.h.
+       (x86_64-*-*): Likewise.
+       * config/i386/prfchwintrin.h: New header.
+       * config/i386/cpuid.h (bit_RDSEED): New.
+       * config/i386/driver-i386.c (host_detect_local_cpu): Detect
+       RDSEED support.
+       * config/i386/i386-c.c: Define __RDSEED__ if needed.
+       * config/i386/i386.c (ix86_target_string): Define
+       -mrdseed option.
+       (PTA_RDSEED): New.
+       (ix86_option_override_internal): Handle new option.
+       (ix86_valid_target_attribute_inner_p): Add OPT_mrdseed.
+       (ix86_builtins): Add enum entries for RDSEED* builtins.
+       (ix86_init_mmx_sse_builtins): Define new builtins.
+       (ix86_expand_builtin): Expand RDSEED* builtins.
+       * config/i386/i386.h (TARGET_RDSEED): New.
+       * config/i386/i386.md (rdseed<mode>_1): New.
+       * config/i386/i386.opt (mrdseed): New.
+       * config/i386/x86intrin.h: Include rdseedintrin.h.
+
 2012-07-30  Richard Guenther  <rguenther@suse.de>
 
        * tree-into-ssa.c (mark_def_sites): Also process virtual operands.
index e2e4814e808172d31d46367da5237981c56154b7..70dcae07a33edbcbd3005a866dcf10c409bfb89e 100644 (file)
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3.  If not see
   (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET)
 #define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM
 #define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW
+#define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED
 
 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
    as -msse4.2.  */
@@ -125,6 +126,7 @@ along with GCC; see the file COPYING3.  If not see
 #define OPTION_MASK_ISA_AVX2_UNSET OPTION_MASK_ISA_AVX2
 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
+#define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED
 
 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
    as -mno-sse4.1. */
@@ -570,6 +572,19 @@ ix86_handle_option (struct gcc_options *opts,
        }
       return true;
 
+    case OPT_mrdseed:
+      if (value)
+       {
+         opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDSEED_SET;
+         opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_SET;
+       }
+      else
+       {
+         opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDSEED_UNSET;
+         opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_UNSET;
+       }
+      return true;
+
     case OPT_mprfchw:
       if (value)
        {
index 1a28f37923466dd55e185f0df7255bfde9b8b636..dad4c3aa8ed58dc7ea9690747907b702e0468d7c 100644 (file)
@@ -361,7 +361,7 @@ i[34567]86-*-*)
                       ia32intrin.h cross-stdarg.h lwpintrin.h popcntintrin.h
                       lzcntintrin.h bmiintrin.h bmi2intrin.h tbmintrin.h
                       avx2intrin.h fmaintrin.h f16cintrin.h rtmintrin.h
-                      xtestintrin.h prfchwintrin.h"
+                      xtestintrin.h rdseedintrin.h prfchwintrin.h"
        ;;
 x86_64-*-*)
        cpu_type=i386
@@ -375,7 +375,7 @@ x86_64-*-*)
                       ia32intrin.h cross-stdarg.h lwpintrin.h popcntintrin.h
                       lzcntintrin.h bmiintrin.h tbmintrin.h bmi2intrin.h
                       avx2intrin.h fmaintrin.h f16cintrin.h rtmintrin.h
-                      xtestintrin.h prfchwintrin.h"
+                      xtestintrin.h rdseedintrin.h prfchwintrin.h"
        need_64bit_hwint=yes
        ;;
 ia64-*-*)
index 1529810c78fc42f8dd4ebc1ac41e74fcaabfca33..46161087e906dbd3b99e054191b9fb8b29e5f9d9 100644 (file)
@@ -399,7 +399,7 @@ const char *host_detect_local_cpu (int argc, const char **argv)
   unsigned int has_bmi = 0, has_bmi2 = 0, has_tbm = 0, has_lzcnt = 0;
   unsigned int has_hle = 0, has_rtm = 0;
   unsigned int has_rdrnd = 0, has_f16c = 0, has_fsgsbase = 0;
-  unsigned int has_prfchw = 0;
+  unsigned int has_rdseed = 0, has_prfchw = 0;
 
   bool arch;
 
@@ -466,6 +466,7 @@ const char *host_detect_local_cpu (int argc, const char **argv)
       has_avx2 = ebx & bit_AVX2;
       has_bmi2 = ebx & bit_BMI2;
       has_fsgsbase = ebx & bit_FSGSBASE;
+      has_rdseed = ebx & bit_RDSEED;
       has_prfchw = ecx & bit_PRFCHW;
     }
 
@@ -747,12 +748,13 @@ const char *host_detect_local_cpu (int argc, const char **argv)
       const char *rdrnd = has_rdrnd ? " -mrdrnd" : " -mno-rdrnd";
       const char *f16c = has_f16c ? " -mf16c" : " -mno-f16c";
       const char *fsgsbase = has_fsgsbase ? " -mfsgsbase" : " -mno-fsgsbase";
+      const char *rdseed = has_rdseed ? " -mrdseed" : " -mno-rdseed";
       const char *prfchw = has_prfchw ? " -mprfchw" : " -mno-prfchw";
 
       options = concat (options, cx16, sahf, movbe, ase, pclmul,
                        popcnt, abm, lwp, fma, fma4, xop, bmi, bmi2,
                        tbm, avx, avx2, sse4_2, sse4_1, lzcnt, rtm,
-                       hle, rdrnd, f16c, fsgsbase, prfchw, NULL);
+                       hle, rdrnd, f16c, fsgsbase, rdseed, prfchw, NULL);
     }
 
 done:
index c803c509a1e040dc49e6d41ec965fbb2726d72b6..a4c947ace26cdc3f862754fdb41ca99b9edb48fb 100644 (file)
@@ -296,6 +296,8 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
     def_or_undef (parse_in, "__RDRND__");
   if (isa_flag & OPTION_MASK_ISA_F16C)
     def_or_undef (parse_in, "__F16C__");
+  if (isa_flag & OPTION_MASK_ISA_RDSEED)
+    def_or_undef (parse_in, "__RDSEED__");
   if (isa_flag & OPTION_MASK_ISA_PRFCHW)
     def_or_undef (parse_in, "__PRFCHW__");
   if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
index a733aa863b75c19a66c4e6e8bc6cb353b3ecfb60..f7a927edaf11755881924fc6cc19aa31bfced84a 100644 (file)
@@ -2767,6 +2767,7 @@ ix86_target_string (HOST_WIDE_INT isa, int flags, const char *arch,
     { "-mbmi2",        OPTION_MASK_ISA_BMI2 },
     { "-mlzcnt",       OPTION_MASK_ISA_LZCNT },
     { "-mhle",         OPTION_MASK_ISA_HLE },
+    { "-mrdseed",      OPTION_MASK_ISA_RDSEED },
     { "-mprfchw",      OPTION_MASK_ISA_PRFCHW },
     { "-mtbm",         OPTION_MASK_ISA_TBM },
     { "-mpopcnt",      OPTION_MASK_ISA_POPCNT },
@@ -3045,6 +3046,7 @@ ix86_option_override_internal (bool main_args_p)
 #define PTA_RTM                        (HOST_WIDE_INT_1 << 32)
 #define PTA_HLE                        (HOST_WIDE_INT_1 << 33)
 #define PTA_PRFCHW             (HOST_WIDE_INT_1 << 34)
+#define PTA_RDSEED             (HOST_WIDE_INT_1 << 35)
 /* if this reaches 64, need to widen struct pta flags below */
 
   static struct pta
@@ -3533,6 +3535,9 @@ ix86_option_override_internal (bool main_args_p)
        if (processor_alias_table[i].flags & PTA_PRFCHW
            && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PRFCHW))
          ix86_isa_flags |= OPTION_MASK_ISA_PRFCHW;
+       if (processor_alias_table[i].flags & PTA_RDSEED
+           && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_RDSEED))
+         ix86_isa_flags |= OPTION_MASK_ISA_RDSEED;
        if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
          x86_prefetch_sse = true;
 
@@ -4355,6 +4360,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[],
     IX86_ATTR_ISA ("rtm",      OPT_mrtm),
     IX86_ATTR_ISA ("hle",      OPT_mhle),
     IX86_ATTR_ISA ("prfchw",   OPT_mprfchw),
+    IX86_ATTR_ISA ("rdseed",   OPT_mrdseed),
 
     /* enum options */
     IX86_ATTR_ENUM ("fpmath=", OPT_mfpmath_),
@@ -26110,6 +26116,11 @@ enum ix86_builtins
   IX86_BUILTIN_RDRAND32_STEP,
   IX86_BUILTIN_RDRAND64_STEP,
 
+  /* RDSEED instructions.  */
+  IX86_BUILTIN_RDSEED16_STEP,
+  IX86_BUILTIN_RDSEED32_STEP,
+  IX86_BUILTIN_RDSEED64_STEP,
+
   /* F16C instructions.  */
   IX86_BUILTIN_CVTPH2PS,
   IX86_BUILTIN_CVTPH2PS256,
@@ -27931,6 +27942,15 @@ ix86_init_mmx_sse_builtins (void)
   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi",
                     V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
 
+  /* RDSEED */
+  def_builtin (OPTION_MASK_ISA_RDSEED, "__builtin_ia32_rdseed_hi_step",
+              INT_FTYPE_PUSHORT, IX86_BUILTIN_RDSEED16_STEP);
+  def_builtin (OPTION_MASK_ISA_RDSEED, "__builtin_ia32_rdseed_si_step",
+              INT_FTYPE_PUNSIGNED, IX86_BUILTIN_RDSEED32_STEP);
+  def_builtin (OPTION_MASK_ISA_RDSEED && OPTION_MASK_ISA_64BIT,
+              "__builtin_ia32_rdseed_di_step",
+              INT_FTYPE_PULONGLONG, IX86_BUILTIN_RDSEED64_STEP);
+
   /* Add FMA4 multi-arg argument instructions */
   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
     {
@@ -30255,6 +30275,46 @@ rdrand_step:
                              gen_rtx_IF_THEN_ELSE (SImode, pat, op2, op1)));
       return target;
 
+    case IX86_BUILTIN_RDSEED16_STEP:
+      icode = CODE_FOR_rdseedhi_1;
+      mode0 = HImode;
+      goto rdseed_step;
+
+    case IX86_BUILTIN_RDSEED32_STEP:
+      icode = CODE_FOR_rdseedsi_1;
+      mode0 = SImode;
+      goto rdseed_step;
+
+    case IX86_BUILTIN_RDSEED64_STEP:
+      icode = CODE_FOR_rdseeddi_1;
+      mode0 = DImode;
+
+rdseed_step:
+      op0 = gen_reg_rtx (mode0);
+      emit_insn (GEN_FCN (icode) (op0));
+
+      arg0 = CALL_EXPR_ARG (exp, 0);
+      op1 = expand_normal (arg0);
+      if (!address_operand (op1, VOIDmode))
+       {
+         op1 = convert_memory_address (Pmode, op1);
+         op1 = copy_addr_to_reg (op1);
+       }
+      emit_move_insn (gen_rtx_MEM (mode0, op1), op0);
+
+      op2 = gen_reg_rtx (QImode);
+
+      pat = gen_rtx_LTU (QImode, gen_rtx_REG (CCCmode, FLAGS_REG),
+                         const0_rtx);
+      emit_insn (gen_rtx_SET (VOIDmode, op2, pat));
+
+      if (target == 0)
+        target = gen_reg_rtx (SImode);
+
+      emit_insn (gen_zero_extendqisi2 (target, op2));
+
+      return target;
+
     case IX86_BUILTIN_GATHERSIV2DF:
       icode = CODE_FOR_avx2_gathersiv2df;
       goto gather_gen;
index 8f87f1276d8b26ddfd5d923b523a489c0c8414de..a6ce0ceb31233985848968943e90e1466f65d0e4 100644 (file)
@@ -76,6 +76,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define TARGET_F16C    OPTION_ISA_F16C
 #define TARGET_RTM      OPTION_ISA_RTM
 #define TARGET_HLE     OPTION_ISA_HLE
+#define TARGET_RDSEED  OPTION_ISA_RDSEED
 #define TARGET_PRFCHW  OPTION_ISA_PRFCHW
 
 #define TARGET_LP64    OPTION_ABI_64
index f8a6c3ad73c240886ec4acff520252291fd36e1c..ace3b6e250db3284ef03664ac566122c859eb38a 100644 (file)
   ;; For RDRAND support
   UNSPECV_RDRAND
 
+  ;; For RDSEED support
+  UNSPECV_RDSEED
+
   ;; For RTM support
   UNSPECV_XBEGIN
   UNSPECV_XEND
   [(set_attr "type" "other")
    (set_attr "prefix_extra" "1")])
 
+(define_insn "rdseed<mode>_1"
+  [(set (match_operand:SWI248 0 "register_operand" "=r")
+       (unspec_volatile:SWI248 [(const_int 0)] UNSPECV_RDSEED))
+   (set (reg:CCC FLAGS_REG)
+       (unspec_volatile:CCC [(const_int 0)] UNSPECV_RDSEED))]
+  "TARGET_RDSEED"
+  "rdseed\t%0"
+  [(set_attr "type" "other")
+   (set_attr "prefix_extra" "1")])
+
 (define_expand "pause"
   [(set (match_dup 0)
        (unspec:BLK [(match_dup 0)] UNSPEC_PAUSE))]
index 223a6468e56d36257336a9d911008f3043764009..ccada37e543d767327d84bfda17bd5c41bc36a21 100644 (file)
@@ -532,6 +532,10 @@ mhle
 Target Report Mask(ISA_HLE) Var(ix86_isa_flags) Save
 Support Hardware Lock Elision prefixes
 
+mrdseed
+Target Report Mask(ISA_RDSEED) Var(ix86_isa_flags) Save
+Support RDSEED instruction
+
 mprfchw
 Target Report Mask(ISA_PRFCHW) Var(ix86_isa_flags) Save
 Support PREFETCHW instruction
diff --git a/gcc/config/i386/rdseedintrin.h b/gcc/config/i386/rdseedintrin.h
new file mode 100644 (file)
index 0000000..afd6ce8
--- /dev/null
@@ -0,0 +1,58 @@
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#if !defined _X86INTRIN_H_INCLUDED
+# error "Never use <rdseedintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __RDSEED__
+# error "RDSEED instruction not enabled"
+#endif /* __RDSEED__ */
+
+#ifndef _RDSEEDINTRIN_H_INCLUDED
+#define _RDSEEDINTRIN_H_INCLUDED
+
+extern __inline int
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_rdseed16_step (unsigned short *p)
+{
+    return __builtin_ia32_rdseed_hi_step (p);
+}
+
+extern __inline int
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_rdseed32_step (unsigned int *p)
+{
+    return __builtin_ia32_rdseed_si_step (p);
+}
+
+#ifdef __x86_64__
+extern __inline int
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_rdseed64_step (unsigned long long *p)
+{
+    return __builtin_ia32_rdseed_di_step (p);
+}
+#endif
+
+#endif /* _RDSEEDINTRIN_H_INCLUDED */
index 70b23160ac1dd3e7490cda339a0939e079034a33..9dee9ef64ec0acb346a713a14cd7679dc9b8c411 100644 (file)
 #include <popcntintrin.h>
 #endif
 
+#ifdef __RDSEED__
+#include <rdseedintrin.h>
+#endif
+
 #ifdef __PRFCHW__
 #include <prfchwintrin.h>
 #endif
index 74af9650230cb234a51c7e0404f5f86f12861acf..f593cf066d7e41c476ec2c7fbc4e0ba2cfcc3839 100644 (file)
@@ -1,3 +1,15 @@
+2012-07-30  Kirill Yukhin  <kirill.yukhin@intel.com>
+           Michael Zolotukhin  <michael.v.zolotukhin@intel.com>
+
+       * gcc.target/i386/rdseed16-1.c: New.
+       * gcc.target/i386/rdseed32-1.c: Ditto
+       * gcc.target/i386/rdseed64-1.c: Ditto
+       * gcc.target/i386/sse-12.c: Add -mrdseed.
+       * gcc.target/i386/sse-13.c: Ditto.
+       * gcc.target/i386/sse-14.c: Ditto.
+       * g++.dg/other/i386-2.C: Ditto.
+       * g++.dg/other/i386-3.C: Ditto.
+
 2012-07-30  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/51244
index c40f3d326647f5166ecb13d30a76e58fe82963e8..47fda70bc90345951403266ad6882102a7dbfcd6 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mprfchw" } */
+/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw" } */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
    xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h,
index 03bdfd2bda398a498b1555b52ee02b2890b6687e..ad477fa7ec35fc67a9100e49ac3671da780c3581 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mprfchw" } */
+/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw" } */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
    xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h,
diff --git a/gcc/testsuite/gcc.target/i386/rdseed16-1.c b/gcc/testsuite/gcc.target/i386/rdseed16-1.c
new file mode 100644 (file)
index 0000000..fe637f1
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mrdseed -O2" } */
+/* { dg-final { scan-assembler "rdseed\[ \\t\]+" } } */
+
+#include <x86intrin.h>
+
+void extern
+rdseed_test (unsigned short *p)
+{
+    volatile int r;
+    r = _rdseed16_step (p);
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/rdseed32-1.c b/gcc/testsuite/gcc.target/i386/rdseed32-1.c
new file mode 100644 (file)
index 0000000..646dff2
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-mrdseed -O2" } */
+/* { dg-final { scan-assembler "rdseed\[ \\t\]+" } } */
+
+#include <x86intrin.h>
+
+void extern
+rdseed_test (unsigned int *p)
+{
+    volatile int r;
+    r = _rdseed32_step (p);
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/rdseed64-1.c b/gcc/testsuite/gcc.target/i386/rdseed64-1.c
new file mode 100644 (file)
index 0000000..bdacd7a
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mrdseed -O2" } */
+/* { dg-final { scan-assembler "rdseed\[ \\t\]+" } } */
+
+#include <x86intrin.h>
+
+void extern
+rdseed_test (unsigned long long *p)
+{
+    volatile int r;
+    r = _rdseed64_step (p);
+}
+
index 19e0071b297aa45f0cd6c185dc25e4b243153304..cb3ab18d5eb7de43eb9a6b690bad43c30047f98f 100644 (file)
@@ -3,7 +3,7 @@
    popcntintrin.h and mm_malloc.h are usable
    with -O -std=c89 -pedantic-errors.  */
 /* { dg-do compile } */
-/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mprfchw" } */
+/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw" } */
 
 #include <x86intrin.h>
 
index 7a2bdb3e437cf9cf29894b1ebc28f4b17cece129..fe2bf46042fcc2c21da17c2a767670299962c101 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mprfchw" } */
+/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw" } */
 
 #include <mm_malloc.h>
 
index 8b19a88bcefd28394609b3c9e55094afca09fc8d..8877e312d753d212a19fbdc53a5c7958234a886d 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mprfchw" } */
+/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw" } */
 
 #include <mm_malloc.h>
 
index 99dddfd7d8e5b2c924b261fe3e682dfd1c7d2b01..ec5ccb894591ced9057963193be6903d9f55ced1 100644 (file)
@@ -50,7 +50,7 @@
 
 
 #ifndef DIFFERENT_PRAGMAS
-#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,rtm,prfchw")
+#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,rtm,rdseed,prfchw")
 #endif
 
 /* Following intrinsics require immediate arguments.  They
@@ -264,7 +264,7 @@ test_2 (_mm_clmulepi64_si128, __m128i, __m128i, __m128i, 1)
 
 /* x86intrin.h (FMA4/XOP/LWP/BMI/BMI2/TBM/LZCNT/FMA). */
 #ifdef DIFFERENT_PRAGMAS
-#pragma GCC target ("fma4,xop,lwp,bmi,bmi2,tbm,lzcnt,fma,prfchw")
+#pragma GCC target ("fma4,xop,lwp,bmi,bmi2,tbm,lzcnt,fma,rdseed,prfchw")
 #endif
 #include <x86intrin.h>
 /* xopintrin.h */
index a06ee5e0d57602b1db826f903bbd1934e355de0c..3b26d99b0198931a6fdcf08ddd795fdfda428fee 100644 (file)
 /* rtmintrin.h */
 #define __builtin_ia32_xabort(M) __builtin_ia32_xabort(1)
 
-#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,fma,rtm,prfchw")
+#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw")
 #include <wmmintrin.h>
 #include <smmintrin.h>
 #include <mm3dnow.h>