aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c23
-rw-r--r--gcc/config/i386/i386.md9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/rdpid.c2
5 files changed, 44 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b9a1c3..8368986 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-01-31 Julia Koval <julia.koval@intel.com>
+
+ PR target/83618
+ * config/i386/i386.c (ix86_expand_builtin): Handle IX86_BUILTIN_RDPID.
+ * config/i386/i386.md (rdpid_rex64) New.
+ (rdpid): Make 32bit only.
+
2018-01-29 Aldy Hernandez <aldyh@redhat.com>
PR lto/84105
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index fef34a1..deb7e8f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -36736,6 +36736,29 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
case IX86_BUILTIN_NANSQ:
return expand_call (exp, target, ignore);
+ case IX86_BUILTIN_RDPID:
+
+ op0 = gen_reg_rtx (TARGET_64BIT ? DImode : SImode);
+
+ if (TARGET_64BIT)
+ {
+ insn = gen_rdpid_rex64 (op0);
+ op0 = convert_to_mode (SImode, op0, 1);
+ }
+ else
+ insn = gen_rdpid (op0);
+ emit_insn (insn);
+
+ if (target == 0)
+ {
+ /* mode is VOIDmode if __builtin_rdpid has been called
+ without lhs. */
+ if (mode == VOIDmode)
+ return target;
+ target = gen_reg_rtx (mode);
+ }
+ emit_move_insn (target, op0);
+ return target;
case IX86_BUILTIN_RDPMC:
case IX86_BUILTIN_RDTSC:
case IX86_BUILTIN_RDTSCP:
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index fe9649d..c08e4f5 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -20559,7 +20559,14 @@
(define_insn "rdpid"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec_volatile:SI [(const_int 0)] UNSPECV_RDPID))]
- "TARGET_RDPID"
+ "!TARGET_64BIT && TARGET_RDPID"
+ "rdpid\t%0"
+ [(set_attr "type" "other")])
+
+(define_insn "rdpid_rex64"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (unspec_volatile:DI [(const_int 0)] UNSPECV_RDPID))]
+ "TARGET_64BIT && TARGET_RDPID"
"rdpid\t%0"
[(set_attr "type" "other")])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5220da1..0ff502a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-31 Julia Koval <julia.koval@intel.com>
+
+ PR target/83618
+ * gcc.target/i386/rdpid.c: Remove "eax".
+
2018-01-31 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR tree-optimization/64946
diff --git a/gcc/testsuite/gcc.target/i386/rdpid.c b/gcc/testsuite/gcc.target/i386/rdpid.c
index 286c297..7bba988 100644
--- a/gcc/testsuite/gcc.target/i386/rdpid.c
+++ b/gcc/testsuite/gcc.target/i386/rdpid.c
@@ -1,6 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mrdpid" } */
-/* { dg-final { scan-assembler "rdpid\[ \t]+(%|)eax" } } */
+/* { dg-final { scan-assembler "rdpid" } } */
#include <x86intrin.h>