diff options
author | Julia Koval <julia.koval@intel.com> | 2018-01-31 12:06:20 +0100 |
---|---|---|
committer | Julia Koval <jkoval@gcc.gnu.org> | 2018-01-31 12:06:20 +0100 |
commit | e6c7bfdbf3db35b471dd67100cb482c14dab4077 (patch) | |
tree | 8052e5d628ed1e126bd07b0d8e1bb9eb3faf6c89 /gcc/config/i386 | |
parent | 7aec1b82097e03a40f8d6818d0321cea5883abdb (diff) | |
download | gcc-e6c7bfdbf3db35b471dd67100cb482c14dab4077.zip gcc-e6c7bfdbf3db35b471dd67100cb482c14dab4077.tar.gz gcc-e6c7bfdbf3db35b471dd67100cb482c14dab4077.tar.bz2 |
re PR target/83618 (_rdpid_u32 doesn't work on 64-bit targets as gas expects the 64-bit register)
PR target/83618
gcc/
* config/i386/i386.c (ix86_expand_builtin): Handle IX86_BUILTIN_RDPID.
* config/i386/i386.md (rdpid_rex64) New.
(rdpid): Make 32bit only.
gcc/testsuite/
* gcc.target/i386/rdpid.c: Remove "eax".
From-SVN: r257229
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/i386.c | 23 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 9 |
2 files changed, 31 insertions, 1 deletions
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")]) |