[Bug target/29314] New: SPARC V9 uses bad FP register for VIS instructions

jfc at mit dot edu gcc-bugzilla@gcc.gnu.org
Mon Oct 2 01:59:00 GMT 2006


This code sample generates incorrect code on 64 bit SPARC when compiled -O2
-mvis -mcpu=ultrasparc.

typedef short v16_2_t __attribute__((vector_size(4)));

void vis_mul_block(const v16_2_t * __restrict in1,
                   const v16_2_t * __restrict in2,
                   v16_2_t * __restrict out)
{
  /* assumes caller set GSR */

  out[0] = __builtin_vis_fpackfix(__builtin_vis_fmuld8ulx16(in1[0], in2[0]));
  out[1] = __builtin_vis_fpackfix(__builtin_vis_fmuld8ulx16(in1[1], in2[1]));
}

The function body is

        ld      [%o0+4], %f9
        ld      [%o1+4], %f11
        ld      [%o0], %f8
        fmuld8ulx16     %f9, %f11, %f9
        fmuld8ulx16     %f8, %f10, %f8
        fpackfix        %f9, %f9
        fpackfix        %f8, %f8
        st      %f9, [%o2+4]
        jmp     %o7+8
         st     %f8, [%o2]

The compiler does not realize that 64 bit floating point registers are even+odd
pairs of 32 bit floating point registers when the register number is less than
32.  Odd numbered 32 bit registers can not be used as 64 bit output registers,
such as the output of fmuld8ulx16.

Perhaps the definition of HARD_REGNO_MODE_OK or HARD_REGNO_NREGS needs revision
for vector-integer types.


-- 
           Summary: SPARC V9 uses bad FP register for VIS instructions
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jfc at mit dot edu
 GCC build triplet: sparc64-sun-solaris2.9
  GCC host triplet: sparc64-sun-solaris2.9
GCC target triplet: sparc64-sun-solaris2.9


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29314



More information about the Gcc-bugs mailing list