diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 23 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/rdpid.c | 2 |
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> |