> On Apr 22, 2014, at 2:36 AM, Zhenqiang Chen <zhenqiang.c...@linaro.org> wrote:
> 
> Ping?
> 
> Rebase and test. Bootstrap and no make check regression with qemu.
> 
> OK for trunk?

This is the exact same patch we (Cavium) came up with for this missed 
optimization. 

Thanks,
Andrew

> 
> Thanks!
> -Zhenqiang
> 
>> On 18 March 2014 16:16, Zhenqiang Chen <zhenqiang.c...@linaro.org> wrote:
>> Hi,
>> 
>> For float value, movsfcc/movdfcc is required by emit_conditional_move
>> called in ifcvt pass to expand if-then-else to "fcsel" insn.
>> 
>> Bootstrap and no make check regression with qemu-aarch64.
>> 
>> Is it OK for next stage1?
>> 
>> Thanks!
>> -Zhenqiang
>> 
>> ChangeLog:
>> 2014-03-18  Zhenqiang Chen  <zhenqiang.c...@linaro.org>
>> 
>>    * config/aarch64/aarch64.md (mov<mode>cc): New for GPF.
>> 
>> testsuite/ChangeLog:
>> 2014-03-18  Zhenqiang Chen  <zhenqiang.c...@linaro.org>
>> 
>>    * gcc.target/aarch64/fcsel.c: New test case.
>> 
>> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
>> index 99a6ac8..0f4b8ebf 100644
>> --- a/gcc/config/aarch64/aarch64.md
>> +++ b/gcc/config/aarch64/aarch64.md
>> @@ -2344,6 +2344,25 @@
>>   }
>> )
>> 
>> +(define_expand "mov<mode>cc"
>> +  [(set (match_operand:GPF 0 "register_operand" "")
>> +    (if_then_else:GPF (match_operand 1 "aarch64_comparison_operator" "")
>> +              (match_operand:GPF 2 "register_operand" "")
>> +              (match_operand:GPF 3 "register_operand" "")))]
>> +  ""
>> +  {
>> +    rtx ccreg;
>> +    enum rtx_code code = GET_CODE (operands[1]);
>> +
>> +    if (code == UNEQ || code == LTGT)
>> +      FAIL;
>> +
>> +    ccreg = aarch64_gen_compare_reg (code, XEXP (operands[1], 0),
>> +                  XEXP (operands[1], 1));
>> +    operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx);
>> +  }
>> +)
>> +
>> (define_insn "*csinc2<mode>_insn"
>>   [(set (match_operand:GPI 0 "register_operand" "=r")
>>         (plus:GPI (match_operator:GPI 2 "aarch64_comparison_operator"
>> diff --git a/gcc/testsuite/gcc.target/aarch64/fcsel.c
>> b/gcc/testsuite/gcc.target/aarch64/fcsel.c
>> new file mode 100644
>> index 0000000..9c5431a
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/aarch64/fcsel.c
>> @@ -0,0 +1,20 @@
>> +/* { dg-do compile } */
>> +/* { dg-options " -O2 " } */
>> +
>> +float f1 (float a, float b, float c, float d)
>> +{
>> +  if (a > 0.0)
>> +    return c;
>> +  else
>> +    return 2.0;
>> +}
>> +
>> +double f2 (double a, double b, double c, double d)
>> +{
>> +  if (a > b)
>> +    return c;
>> +  else
>> +    return d;
>> +}
>> +
>> +/* { dg-final { scan-assembler-times "\tfcsel" 2 } } */

Reply via email to