https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106763

--- Comment #9 from George Pee <georgepee at gmail dot com> ---
Thank you for following up even after I closed the ticket.

Unfortunately, I'm unable to switch to a 64-bit kernel at the moment.

Using this works around the issue by treating it via a neon path and enabling
the vfp bit and retrying the instruction.

@@ -824,6 +824,9 @@ call_fpe:
        .align  6

 .LCneon_arm_opcodes:
+       .word   0xee000000                      @ mask
+       .word   0xee000000                      @ opcode
+
        .word   0xfe000000                      @ mask
        .word   0xf2000000                      @ opcode



I am now using this simplified case, which fails somewhere between 100,000 and
1,000,000 iterations:

    int c = 0;
    while(1)
    {
        c++;
        asm ( 
            "vmov.f16    r6, s18\n"
        );
        if (c % 100 == 0)
            printf("%d\n",c);
    }

It's quite odd that it is intermittent.  After instrumenting vfp enable/disable
in the kernel, it seems as though there is something disabling the vfp bit in
the fpexc register, but it doesn't seem to be the kernel.

I am able to reproduce this with other FP16 instructions, but not other
non-FP16 VFP instructions.

Reply via email to