https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101609
Bug ID: 101609 Summary: no right shift pattern for vector(2) long long on aarch64 Product: gcc Version: 12.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Target: aarch64*-*-* Take: #define SIZE 16 typedef long long veci __attribute__((vector_size(SIZE))); void f(veci &a, veci &b, veci &c){ c= a>>b; } ----- CUT ---- We currently produce: ldr q1, [x1] ldr q0, [x0] fmov d3, d1 dup d1, v1.d[1] fmov d2, d0 dup d0, v0.d[1] neg d4, d3 sshl d4, d2, d4 neg d2, d1 sshl d2, d0, d2 fmov x1, d4 fmov x0, d2 stp x1, x0, [x2] ret ----- CUT ---- But we should be able to do: ldr q0, [x1] ldr q1, [x0] neg v0.2d, v0.2d sshl v0.2d, v1.2d, v0.2d str q0, [x2]