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