Hi Sudi,
On 24/11/17 14:57, Sudi Das wrote:
Hi
For the following test case:
__fp16
test_select (__fp16 a, __fp16 b, __fp16 c)
{
return (a < b) ? b : c;
}
when compiled with -mfpu=fp-armv8 -march=armv8.2-a+fp16 -marm
-mfloat-abi=hard trunk generates wrong code:
test_select:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
vcvtb.f32.f16 s0, s0
vcvtb.f32.f16 s15, s1
vcmpe.f32 s0, s15
vmrs APSR_nzcv, FPSCR
// <------ No conditional branch!
vmov s1, s2 @ __fp16
.L2:
vmov s0, s1 @ __fp16
bx lr
There should have been a conditional branch there to skip one of the
VMOVs.
This patch fixes this problem by making *movhf_vfp_fp16 unconditional
wherever needed.
Testing done: Add a new test case and checked for regressions
arm-none-linux-gnueabihf.
Is this ok for trunk?
This is ok after assuming a bootstrap on arm-none-linux-gnueabihf passes
as well.
Does this bug appear on the GCC 7 branch?
If so, could you please test this patch on that branch as well if so?
Thanks,
Kyrill
Sudi
ChangeLog entry are as follow:
*** gcc/ChangeLog ***
2017-11-24 Sudakshina Das <sudi....@arm.com>
* config/arm/vfp.md (*movhf_vfp_fp16): Add conds attribute.
*** gcc/testsuite/ChangeLog ***
2017-11-24 Sudakshina Das <sudi....@arm.com>
* gcc.target/arm/armv8_2-fp16-move-2.c: New test.