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

            Bug ID: 114499
           Summary: MVE: scatter base offset constraints incorrect
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kevin.bracey at alifsemi dot com
  Target Milestone: ---

An attempt to use

uint32x4_t base;
float32x4_t value;
vstrwq_scatter_base_wb_f32(&base, -sizeof(float), value);

Generates an "unsupported" error. It does not accept -4 as a valid offset, but
it should. It's looking for a multiple of 8 from -1016 to +1016, not a multiple
of 4 from -508 to +508 as it should.

Looking at mve.md, I see a number of scatter/gather_base operations have
incorrect constraints; they're rather random.

Offsets for VLDRW/VSTRW are always 7-bit with a sign bit, representing +/-0 to
+/-127*memory size. So the W and D base forms all take -508 to 508 multiples of
4 ("O"?) or -1016 to +1016 multiples of 8 ("Ri").

The "Rl" constraint was wrongly added for just
mve_vstrwq_scatter_base_wb_p_fv4sf
(https://github.com/gcc-mirror/gcc/commit/ae180f26109bfaebb4ab0f4d45035fd075cf02c8),
and it is not required. If it was really needed for a halfword instruction its
range should be -254 to +254. It seems that mve_vector_mem_operand() handles
this range correctly for non-scatter/gather.

Some corrections I think are needed are:

mve_vldrwq_gather_base_<supf>v4si i -> O
mve_vldrwq_gather_base_<supf>v2di i -> Ri
mve_vldrwq_gather_base_z_<supf>v2di i -> Ri
mve_vldrwq_gather_base_fv4sf i -> O
mve_vldrwq_gather_base_z_fv4sf i -> O
mve_vldrwq_gather_base_wb_<supf>v4si Ri -> O
mve_vldrwq_gather_base_wb_z_<supf>v4si Ri -> O
mve_vldrwq_gather_base_wb_fv4sf  Ri -> O
mve_vldrwq_gather_base_wb_z_fv4sf  Ri -> O

mve_vstrwq_scatter_base_<supf>v4si i -> O
mve_vstrwq_scatter_base_fv4sf i -> O
mve_vstrwq_scatter_base_wb_<supf>v4si Ri -> O
mve_vstrwq_scatter_base_wb_p_<supf>v4si Ri -> O
mve_vstrwq_scatter_base_wb_fv4sf Ri -> O
mve_vstrwq_scatter_base_wb_p_fv4sf Rl -> O

But I don't know that that's exhaustive.

Reply via email to