SPARC V9 backend generates bad fmovd instrunction.

Casper Dik casper@holland.Sun.COM
Mon Nov 2 04:08:00 GMT 1998


In snaphot 19981101, the SPARC backend generates invalid assembly
instructions (this is using SPARC_BI_ARCH on Solaris 7),
the error message are this:

/export/data/src/tmp/egcs-19981101-obj/gcc/xgcc -B/export/data/src/tmp/egcs-19981101-obj/gcc/ -B/usr/local/gnu/sparc-sun-solaris2/bin/ -c -g -O2 -fno-implicit-templates  -m64 -I/export/data/src/tmp/egcs-19981101-dev/libstdc++ -I/export/data/src/tmp/egcs-19981101-dev/libstdc++/stl -I../libio -I/export/data/src/tmp/egcs-19981101-dev/libstdc++/../libio -nostdinc++  -DLD `for N in MAIN ADDCC ADDCF ADDFC SUBCC SUBCF SUBFC MULCC MULCF MULFC DIVCC DIVCF DIVFC PLUS MINUS EQCC EQCF EQFC NECC NECF NEFC ABS ARG POLAR CONJ NORM COS COSH EXP LOG POWCC POWCF POWCI POWFC SIN SINH SQRT; do echo " -D${N}"; done` \
  /export/data/src/tmp/egcs-19981101-dev/libstdc++/cinst.cc -o ldcomplex.o
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 245: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 310: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 681: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 801: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 1170: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 1356: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 1412: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 2040: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 4364: error: invalid (misaligned) register
/usr/ccs/bin/as: "/tmp/ccmW3yVB.s", line 6802: error: invalid (misaligned) register
gmake[3]: *** [bigstmp-complx] Error 1
gmake[3]: Leaving directory `/export/data/src/tmp/egcs-19981101-obj/sparc-sun-solaris2/sparcv9/libstdc++'


The invalid code is:

   245          fmovd   %f1, %f6
   310          fmovd   %f1, %f6
   681          fmovd   %f1, %f6
   801          fmovd   %f1, %f6
  1170          fmovd   %f1, %f6
  1356          fmovd   %f1, %f6
  1412          fmovd   %f9, %f2
  2040          fmovd   %f5, %f2
  4364          fmovd   %f9, %f2
  6802          fmovd   %f5, %f2

These are move double instructions; they require double width alignment
in SPARC v9.

In SPARC v8, these intructions don't exist either.  Instead, they're
implemented as series of fmovs and fmovd (unaligned) is a pseudo op.

It would appear, though, that these instructions are indicative of a more
serious error.

Casper



More information about the Gcc-bugs mailing list