From: Uros Bizjak Date: Sat, 25 Mar 2017 19:47:14 +0000 (+0100) Subject: re PR target/80180 (Incorrect codegen from rdseed intrinsic use (CVE-2017-11671)) X-Git-Tag: releases/gcc-5.5.0~436 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48c4871167426df67abe42d6b94451995f996bae;p=thirdparty%2Fgcc.git re PR target/80180 (Incorrect codegen from rdseed intrinsic use (CVE-2017-11671)) PR target/80180 * config/i386/i386.c (ix86_expand_builtin) : Do not expand arg0 between flags reg setting and flags reg using instructions. : Ditto. Use non-flags reg clobbering instructions to zero extend op2. From-SVN: r246479 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab774eb27e85..817e50261085 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-03-25 Uros Bizjak + + PR target/80180 + * config/i386/i386.c (ix86_expand_builtin) + : Do not expand arg0 between + flags reg setting and flags reg using instructions. + : Ditto. Use non-flags reg + clobbering instructions to zero extend op2. + 2017-03-22 Martin Liska Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index f878a79b9240..d3baf5011405 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -39533,9 +39533,6 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget, mode0 = DImode; rdrand_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)) @@ -39543,6 +39540,10 @@ rdrand_step: op1 = convert_memory_address (Pmode, op1); op1 = copy_addr_to_reg (op1); } + + op0 = gen_reg_rtx (mode0); + emit_insn (GEN_FCN (icode) (op0)); + emit_move_insn (gen_rtx_MEM (mode0, op1), op0); op1 = gen_reg_rtx (SImode); @@ -39551,8 +39552,20 @@ rdrand_step: /* Emit SImode conditional move. */ if (mode0 == HImode) { - op2 = gen_reg_rtx (SImode); - emit_insn (gen_zero_extendhisi2 (op2, op0)); + if (TARGET_ZERO_EXTEND_WITH_AND + && optimize_function_for_speed_p (cfun)) + { + op2 = force_reg (SImode, const0_rtx); + + emit_insn (gen_movstricthi + (gen_lowpart (HImode, op2), op0)); + } + else + { + op2 = gen_reg_rtx (SImode); + + emit_insn (gen_zero_extendhisi2 (op2, op0)); + } } else if (mode0 == SImode) op2 = op0; @@ -39584,9 +39597,6 @@ rdrand_step: 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)) @@ -39594,6 +39604,10 @@ rdseed_step: op1 = convert_memory_address (Pmode, op1); op1 = copy_addr_to_reg (op1); } + + op0 = gen_reg_rtx (mode0); + emit_insn (GEN_FCN (icode) (op0)); + emit_move_insn (gen_rtx_MEM (mode0, op1), op0); op2 = gen_reg_rtx (QImode);