1285163Sdim/* US Software GOFAST floating point library support. 2285163Sdim Copyright (C) 1994, 1998, 1999, 2002, 2003, 2004 3353358Sdim Free Software Foundation, Inc. 4353358Sdim 5353358SdimThis file is part of GCC. 6285163Sdim 7285163SdimGCC is free software; you can redistribute it and/or modify 8285163Sdimit under the terms of the GNU General Public License as published by 9285163Sdimthe Free Software Foundation; either version 2, or (at your option) 10285163Sdimany later version. 11285163Sdim 12285163SdimGCC is distributed in the hope that it will be useful, 13285163Sdimbut WITHOUT ANY WARRANTY; without even the implied warranty of 14285163SdimMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15285163SdimGNU General Public License for more details. 16285163Sdim 17341825SdimYou should have received a copy of the GNU General Public License 18285163Sdimalong with GCC; see the file COPYING. If not, write to 19285163Sdimthe Free Software Foundation, 51 Franklin Street, Fifth Floor, 20285163SdimBoston, MA 02110-1301, USA. */ 21285163Sdim 22285163Sdim/* The US Software GOFAST library requires special optabs support. 23341825Sdim This file is intended to be included by config/ARCH/ARCH.c. It 24341825Sdim defines one function, gofast_maybe_init_libfuncs, which should be 25344779Sdim called from the TARGET_INIT_LIBFUNCS hook. When tm.h has defined 26341825Sdim US_SOFTWARE_GOFAST, this function will adjust all the optabs and 27341825Sdim libfuncs appropriately. Otherwise it will do nothing. */ 28344779Sdim 29341825Sdimstatic void 30341825Sdimgofast_maybe_init_libfuncs (void) 31285163Sdim{ 32285163Sdim#ifdef US_SOFTWARE_GOFAST 33341825Sdim int mode; 34285163Sdim 35314564Sdim set_optab_libfunc (add_optab, SFmode, "fpadd"); 36285163Sdim set_optab_libfunc (add_optab, DFmode, "dpadd"); 37314564Sdim set_optab_libfunc (sub_optab, SFmode, "fpsub"); 38285163Sdim set_optab_libfunc (sub_optab, DFmode, "dpsub"); 39285163Sdim set_optab_libfunc (smul_optab, SFmode, "fpmul"); 40285163Sdim set_optab_libfunc (smul_optab, DFmode, "dpmul"); 41285163Sdim set_optab_libfunc (sdiv_optab, SFmode, "fpdiv"); 42285163Sdim set_optab_libfunc (sdiv_optab, DFmode, "dpdiv"); 43285163Sdim set_optab_libfunc (cmp_optab, SFmode, "fpcmp"); 44 set_optab_libfunc (cmp_optab, DFmode, "dpcmp"); 45 46 /* GOFAST does not provide libfuncs for negation, so we use the 47 standard names. */ 48 49 /* GCC does not use fpcmp/dpcmp for gt or ge because its own 50 FP-emulation library returns +1 for both > and unord. So we 51 leave gt and ge unset, such that, instead of fpcmp(a,b) >[=], we 52 generate fpcmp(b,a) <[=] 0, which is unambiguous. For unord 53 libfuncs, we use our own functions, since GOFAST doesn't supply 54 them. */ 55 56 set_optab_libfunc (eq_optab, SFmode, "fpcmp"); 57 set_optab_libfunc (ne_optab, SFmode, "fpcmp"); 58 set_optab_libfunc (gt_optab, SFmode, 0); 59 set_optab_libfunc (ge_optab, SFmode, 0); 60 set_optab_libfunc (lt_optab, SFmode, "fpcmp"); 61 set_optab_libfunc (le_optab, SFmode, "fpcmp"); 62 63 set_optab_libfunc (eq_optab, DFmode, "dpcmp"); 64 set_optab_libfunc (ne_optab, DFmode, "dpcmp"); 65 set_optab_libfunc (gt_optab, DFmode, 0); 66 set_optab_libfunc (ge_optab, DFmode, 0); 67 set_optab_libfunc (lt_optab, DFmode, "dpcmp"); 68 set_optab_libfunc (le_optab, DFmode, "dpcmp"); 69 70 set_conv_libfunc (sext_optab, DFmode, SFmode, "fptodp"); 71 set_conv_libfunc (trunc_optab, SFmode, DFmode, "dptofp"); 72 73 set_conv_libfunc (sfix_optab, SImode, SFmode, "fptosi"); 74 set_conv_libfunc (sfix_optab, SImode, DFmode, "dptoli"); 75 set_conv_libfunc (ufix_optab, SImode, SFmode, "fptoui"); 76 set_conv_libfunc (ufix_optab, SImode, DFmode, "dptoul"); 77 78 set_conv_libfunc (sfloat_optab, SFmode, SImode, "sitofp"); 79 set_conv_libfunc (sfloat_optab, DFmode, SImode, "litodp"); 80#endif 81} 82