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