Hi!
On Thu, Jul 20, 2017 at 02:46:41PM +0200, Sebastian Huber wrote:
> xgcc -B/build/git-build/b-gcc-git-powerpc-rtems4.12/./gcc/ -mcpu=e6500
> -m64 -O2 -fpreprocessed -S test-v0.i -o /dev/null 2>&1
> test-v0.i: In function 'f':
> test-v0.i:8:1: error: unrecognizable insn:
> }
> ^
> (insn 12 11 13 2 (set (reg:CCFP 126)
> (compare:CCFP (reg:TF 123)
> (reg:TF 124))) "test-v0.i":5 -1
> (nil))
> during RTL pass: vregs
> test-v0.i:8:1: internal compiler error: in extract_insn, at recog.c:2311
> 0x40a233 _fatal_insn(char const*, rtx_def const*, char const*, int, char
> const*)
So, this instruction is what was expanded, but it is not a valid
instruction for your configuration.
> So, I looked for " __gcc_qsub" in the GCC sources. It seems this is
> generated by rs6000_init_libfuncs() for some "sub_optab" stuff.
It ends up in libgcc.a, from ibm-ldouble.c .
> I don't know how I can figure out the corresponding GCC sources that are
> involved here.
In your testcase you use TFmode directly. This either is the
"double-double" ("IBM128") format, or IEEE 128-bit format (another
option for "long double" is to make it the same as "double").
Using a 64-bit long double has as downside that it is not bigger than
double.
Using double-double has as downsides that we are trying to move away
from it, it has funny rounding, historically it has had quite a few
bugs.
IEEE 128-bit is currently only supported on systems with VSX. If you
want to use it on other systems you'll have to make emulation support
for it in libgcc -- which then will work on *all* systems. Maybe
this is a bit much work.
Segher