Retry rdrand if the carry flag isn't valid.
gcc/ 2010-07-07 H.J. Lu <hongjiu.lu@intel.com> PR target/44844 * config/i386/i386.md (rdrand<mode>): Changed to expand to retry if the carry flag isn't valid. (rdrand<mode>_1): New. gcc/testsuite/ 2010-07-07 H.J. Lu <hongjiu.lu@intel.com> PR target/44844 * gcc.target/i386/rdrand-1.c: Scan "jnc". * gcc.target/i386/rdrand-2.c: Likewise. * gcc.target/i386/rdrand-3.c: Likewise. From-SVN: r161910
This commit is contained in:
parent
0ee95c437f
commit
5e86e54057
6 changed files with 43 additions and 1 deletions
|
@ -1,3 +1,10 @@
|
|||
2010-07-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/44844
|
||||
* config/i386/i386.md (rdrand<mode>): Changed to expand to
|
||||
retry if the carry flag isn't valid.
|
||||
(rdrand<mode>_1): New.
|
||||
|
||||
2010-07-07 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/44790
|
||||
|
|
|
@ -18494,7 +18494,32 @@
|
|||
[(set_attr "type" "other")
|
||||
(set_attr "prefix_extra" "2")])
|
||||
|
||||
(define_insn "rdrand<mode>"
|
||||
(define_expand "rdrand<mode>"
|
||||
[(set (match_operand:SWI248 0 "register_operand" "=r")
|
||||
(unspec_volatile:SWI248 [(const_int 0)] UNSPECV_RDRAND))]
|
||||
"TARGET_RDRND"
|
||||
{
|
||||
rtx retry_label, insn, ccc;
|
||||
|
||||
retry_label = gen_label_rtx ();
|
||||
|
||||
emit_label (retry_label);
|
||||
|
||||
/* Generate rdrand. */
|
||||
emit_insn (gen_rdrand<mode>_1 (operands[0]));
|
||||
|
||||
/* Retry if the carry flag isn't valid. */
|
||||
ccc = gen_rtx_REG (CCCmode, FLAGS_REG);
|
||||
ccc = gen_rtx_EQ (VOIDmode, ccc, const0_rtx);
|
||||
ccc = gen_rtx_IF_THEN_ELSE (VOIDmode, ccc, pc_rtx,
|
||||
gen_rtx_LABEL_REF (VOIDmode, retry_label));
|
||||
insn = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, ccc));
|
||||
JUMP_LABEL (insn) = retry_label;
|
||||
|
||||
DONE;
|
||||
})
|
||||
|
||||
(define_insn "rdrand<mode>_1"
|
||||
[(set (match_operand:SWI248 0 "register_operand" "=r")
|
||||
(unspec_volatile:SWI248 [(const_int 0)] UNSPECV_RDRAND))]
|
||||
"TARGET_RDRND"
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2010-07-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/44844
|
||||
* gcc.target/i386/rdrand-1.c: Scan "jnc".
|
||||
* gcc.target/i386/rdrand-2.c: Likewise.
|
||||
* gcc.target/i386/rdrand-3.c: Likewise.
|
||||
|
||||
2010-07-07 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR middle-end/44813
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mrdrnd " } */
|
||||
/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)ax" } } */
|
||||
/* { dg-final { scan-assembler "jnc\[ \t]+" } } */
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mrdrnd " } */
|
||||
/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)eax" } } */
|
||||
/* { dg-final { scan-assembler "jnc\[ \t]+" } } */
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
/* { dg-require-effective-target lp64 } */
|
||||
/* { dg-options "-O2 -mrdrnd " } */
|
||||
/* { dg-final { scan-assembler "rdrand\[ \t]+(%|)rax" } } */
|
||||
/* { dg-final { scan-assembler "jnc\[ \t]+" } } */
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue