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); }