https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117048
ktkachov at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |ASSIGNED Resolution|FIXED |--- --- Comment #6 from ktkachov at gcc dot gnu.org --- There are more cases where we fail to match XAR: #include <arm_neon.h> uint64x2_t func_shl_eor (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return veorq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63)); } uint64x2_t func_add_eor (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return veorq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63)); } uint64x2_t func_shl_orr (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return vorrq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63)); } uint64x2_t func_add_orr (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return vorrq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63)); } uint64x2_t func_shl_add (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return vaddq_u64(vshlq_n_u64(c, 1), vshrq_n_u64(c, 63)); } uint64x2_t func_add_add (uint64x2_t a, uint64x2_t b) { uint64x2_t c = veorq_u64 (a, b); return vaddq_u64(vaddq_u64(c, c), vshrq_n_u64(c, 63)); } I'll handle them in follow-up patches.