[Bug target/100572] New: arm: Assemble failures with MVE vcreateq intrinsic

acoplan at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed May 12 19:51:00 GMT 2021


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

            Bug ID: 100572
           Summary: arm: Assemble failures with MVE vcreateq intrinsic
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acoplan at gcc dot gnu.org
  Target Milestone: ---

GCC's output fails to assemble for the following:

$ cat test.c
#include <arm_mve.h>
uint64x2_t v;
void f(void) { v = vcreateq_u64(0, 0); }
$ ./arm-eabi-gcc -c test.c -march=armv8.1-m.main+mve -mfloat-abi=hard -O
/tmp/ccXeZkHP.s: Assembler messages:
/tmp/ccXeZkHP.s:31: Error: General purpose registers may not be the same --
`vmov q3[2],q3[0],r2,r2'
/tmp/ccXeZkHP.s:32: Error: General purpose registers may not be the same --
`vmov q3[3],q3[1],r3,r3'

The code generated for f here is:
f:
        movs    r2, #0
        movs    r3, #0
        vmov q3[2], q3[0], r2, r2
        vmov q3[3], q3[1], r3, r3
        ldr     r3, .L2
        vstrw.32        q3, [r3]
        bx      lr

The problem also occurs for other types when used with vcreateq, e.g. for:

#include <arm_mve.h>
uint32x4_t v;
void f(void) { v = vcreateq_u32(0, 0); }

Here is a preprocessed testcase (not for the testsuite, but for testing with a
cc1):

__simd128_uint64_t v;
void f(void) { v = __builtin_mve_vcreateq_uv2di(0, 0); }


More information about the Gcc-bugs mailing list