118334Speter/* US Software GOFAST floating point library support.
2169689Skan   Copyright (C) 1994, 1998, 1999, 2002, 2003, 2004
3169689Skan   Free Software Foundation, Inc.
418334Speter
5132718SkanThis file is part of GCC.
618334Speter
7132718SkanGCC is free software; you can redistribute it and/or modify
818334Speterit under the terms of the GNU General Public License as published by
918334Speterthe Free Software Foundation; either version 2, or (at your option)
1018334Speterany later version.
1118334Speter
12132718SkanGCC is distributed in the hope that it will be useful,
1318334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1418334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1518334SpeterGNU General Public License for more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
18132718Skanalong with GCC; see the file COPYING.  If not, write to
19169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
20169689SkanBoston, MA 02110-1301, USA.  */
2118334Speter
2218334Speter/* The US Software GOFAST library requires special optabs support.
23132718Skan   This file is intended to be included by config/ARCH/ARCH.c.  It
24132718Skan   defines one function, gofast_maybe_init_libfuncs, which should be
25132718Skan   called from the TARGET_INIT_LIBFUNCS hook.  When tm.h has defined
26132718Skan   US_SOFTWARE_GOFAST, this function will adjust all the optabs and
27132718Skan   libfuncs appropriately.  Otherwise it will do nothing.  */
2818334Speter
29132718Skanstatic void
30132718Skangofast_maybe_init_libfuncs (void)
31132718Skan{
32132718Skan#ifdef US_SOFTWARE_GOFAST
33132718Skan  int mode;
3418334Speter
35132718Skan  set_optab_libfunc (add_optab, SFmode, "fpadd");
36132718Skan  set_optab_libfunc (add_optab, DFmode, "dpadd");
37132718Skan  set_optab_libfunc (sub_optab, SFmode, "fpsub");
38132718Skan  set_optab_libfunc (sub_optab, DFmode, "dpsub");
39132718Skan  set_optab_libfunc (smul_optab, SFmode, "fpmul");
40132718Skan  set_optab_libfunc (smul_optab, DFmode, "dpmul");
41132718Skan  set_optab_libfunc (sdiv_optab, SFmode, "fpdiv");
42132718Skan  set_optab_libfunc (sdiv_optab, DFmode, "dpdiv");
43132718Skan  set_optab_libfunc (cmp_optab, SFmode, "fpcmp");
44132718Skan  set_optab_libfunc (cmp_optab, DFmode, "dpcmp");
4518334Speter
46132718Skan  /* GOFAST does not provide libfuncs for negation, so we use the
47132718Skan     standard names.  */
4818334Speter
49132718Skan  /* GCC does not use fpcmp/dpcmp for gt or ge because its own
50132718Skan     FP-emulation library returns +1 for both > and unord.  So we
51132718Skan     leave gt and ge unset, such that, instead of fpcmp(a,b) >[=], we
52132718Skan     generate fpcmp(b,a) <[=] 0, which is unambiguous.  For unord
53132718Skan     libfuncs, we use our own functions, since GOFAST doesn't supply
54132718Skan     them.  */
5518334Speter
56132718Skan  set_optab_libfunc (eq_optab, SFmode, "fpcmp");
57132718Skan  set_optab_libfunc (ne_optab, SFmode, "fpcmp");
58132718Skan  set_optab_libfunc (gt_optab, SFmode, 0);
59132718Skan  set_optab_libfunc (ge_optab, SFmode, 0);
60132718Skan  set_optab_libfunc (lt_optab, SFmode, "fpcmp");
61132718Skan  set_optab_libfunc (le_optab, SFmode, "fpcmp");
62132718Skan
63132718Skan  set_optab_libfunc (eq_optab, DFmode, "dpcmp");
64132718Skan  set_optab_libfunc (ne_optab, DFmode, "dpcmp");
65132718Skan  set_optab_libfunc (gt_optab, DFmode, 0);
66132718Skan  set_optab_libfunc (ge_optab, DFmode, 0);
67132718Skan  set_optab_libfunc (lt_optab, DFmode, "dpcmp");
68132718Skan  set_optab_libfunc (le_optab, DFmode, "dpcmp");
69132718Skan
70132718Skan  set_conv_libfunc (sext_optab,   DFmode, SFmode, "fptodp");
71132718Skan  set_conv_libfunc (trunc_optab,  SFmode, DFmode, "dptofp");
72132718Skan
73132718Skan  set_conv_libfunc (sfix_optab,   SImode, SFmode, "fptosi");
74132718Skan  set_conv_libfunc (sfix_optab,   SImode, DFmode, "dptoli");
75132718Skan  set_conv_libfunc (ufix_optab,   SImode, SFmode, "fptoui");
76132718Skan  set_conv_libfunc (ufix_optab,   SImode, DFmode, "dptoul");
77132718Skan
78132718Skan  set_conv_libfunc (sfloat_optab, SFmode, SImode, "sitofp");
79132718Skan  set_conv_libfunc (sfloat_optab, DFmode, SImode, "litodp");
80132718Skan#endif
81132718Skan}
82