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

            Bug ID: 89523
           Summary: Incorrect AVX instructions with VSIB address
           Product: gcc
           Version: 7.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
                CC: ubizjak at gmail dot com
  Target Milestone: ---
            Target: x32

32-bit indices in VSIB address are sign-extended to 64 bits. In x32,
when 32-bit indices are used as addresses, like

%ymm7, 0(,%ymm6,1), %ymm0

0xf7fa3010 is sign-extended to 0xfffffffff7fa3010 which leads to
invalid address in x32.
Testcase:

[hjl@gnu-4 00000001]$ cat foo.i
void foo (void);

extern float *ncost;

float
bar (int type, int num)
{
  int i;
  float cost;

  cost = 0;
  for (i = 0; i < num; i++)
    if (type)
      cost += ncost[i];
    else
      foo ();
  return (cost);
}
[hjl@gnu-4 00000001]$ gcc -S -mx32 -Ofast -funroll-loops -march=haswell foo.i 
[hjl@gnu-4 00000001]$ grep gather foo.s
        vgatherdps      %ymm7, 0(,%ymm6,1), %ymm0
        vgatherdps      %ymm11, 0(,%ymm10,1), %ymm12
        vgatherdps      %ymm15, 0(,%ymm14,1), %ymm5
        vgatherdps      %ymm7, 0(,%ymm9,1), %ymm6
        vgatherdps      %ymm12, 0(,%ymm11,1), %ymm13
        vgatherdps      %ymm5, 0(,%ymm15,1), %ymm2
        vgatherdps      %ymm7, 0(,%ymm10,1), %ymm6
        vgatherdps      %ymm14, 0(,%ymm13,1), %ymm15
        vgatherdps      %ymm7, 0(,%ymm10,1), %ymm6
        vgatherdps      %ymm13, 0(,%ymm12,1), %ymm14
        vgatherdps      %ymm10, 0(,%ymm9,1), %ymm7
        vgatherdps      %ymm12, 0(,%ymm11,1), %ymm13
        vgatherdps      %ymm9, 0(,%ymm2,1), %ymm10
        vgatherdps      %ymm12, 0(,%ymm11,1), %ymm6
        vgatherdps      %ymm5, 0(,%ymm15,1), %ymm2
[hjl@gnu-4 00000001]$

Reply via email to