OSDN Git Service

More MIPS vector cleanup work.
[pf3gnuchains/gcc-fork.git] / gcc / config / gofast.h
index dd09ea1..81dd9f6 100644 (file)
@@ -1,96 +1,80 @@
 /* US Software GOFAST floating point library support.
-   Copyright (C) 1994, 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1994, 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
+along with GCC; see the file COPYING.  If not, write to
 the Free Software Foundation, 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* This is used by fp-bit.c.  */
-#define US_SOFTWARE_GOFAST
-
 /* The US Software GOFAST library requires special optabs support.
-   There is no negation libcall, and several others have names different
-   from gcc.  This file consolidates the support in one place.
+   This file is intended to be included by config/ARCH/ARCH.c.  It
+   defines one function, gofast_maybe_init_libfuncs, which should be
+   called from the TARGET_INIT_LIBFUNCS hook.  When tm.h has defined
+   US_SOFTWARE_GOFAST, this function will adjust all the optabs and
+   libfuncs appropriately.  Otherwise it will do nothing.  */
+
+static void
+gofast_maybe_init_libfuncs (void)
+{
+#ifdef US_SOFTWARE_GOFAST
+  int mode;
+
+  set_optab_libfunc (add_optab, SFmode, "fpadd");
+  set_optab_libfunc (add_optab, DFmode, "dpadd");
+  set_optab_libfunc (sub_optab, SFmode, "fpsub");
+  set_optab_libfunc (sub_optab, DFmode, "dpsub");
+  set_optab_libfunc (smul_optab, SFmode, "fpmul");
+  set_optab_libfunc (smul_optab, DFmode, "dpmul");
+  set_optab_libfunc (sdiv_optab, SFmode, "fpdiv");
+  set_optab_libfunc (sdiv_optab, DFmode, "dpdiv");
+  set_optab_libfunc (cmp_optab, SFmode, "fpcmp");
+  set_optab_libfunc (cmp_optab, DFmode, "dpcmp");
+
+  /* GOFAST does not provide libfuncs for negation, so we use the
+     standard names.  */
+
+  /* GCC does not use fpcmp/dpcmp for gt or ge because its own
+     FP-emulation library returns +1 for both > and unord.  So we
+     leave gt and ge unset, such that, instead of fpcmp(a,b) >[=], we
+     generate fpcmp(b,a) <[=] 0, which is unambiguous.  For unord
+     libfuncs, we use our own functions, since GOFAST doesn't supply
+     them.  */
 
-   The basic plan is to leave gcc proper alone and via some hook fix things
-   after the optabs have been set up.  Our main entry point is
-   INIT_GOFAST_OPTABS.  */
+  set_optab_libfunc (eq_optab, SFmode, "fpcmp");
+  set_optab_libfunc (ne_optab, SFmode, "fpcmp");
+  set_optab_libfunc (gt_optab, SFmode, 0);
+  set_optab_libfunc (ge_optab, SFmode, 0);
+  set_optab_libfunc (lt_optab, SFmode, "fpcmp");
+  set_optab_libfunc (le_optab, SFmode, "fpcmp");
 
-#define INIT_GOFAST_OPTABS \
-  do { \
-    GOFAST_CLEAR_NEG_FLOAT_OPTAB; \
-    GOFAST_RENAME_LIBCALLS; \
-  } while (0)
+  set_optab_libfunc (eq_optab, DFmode, "dpcmp");
+  set_optab_libfunc (ne_optab, DFmode, "dpcmp");
+  set_optab_libfunc (gt_optab, DFmode, 0);
+  set_optab_libfunc (ge_optab, DFmode, 0);
+  set_optab_libfunc (lt_optab, DFmode, "dpcmp");
+  set_optab_libfunc (le_optab, DFmode, "dpcmp");
 
-#define GOFAST_CLEAR_NEG_FLOAT_OPTAB \
-  do { \
-    int mode; \
-    for (mode = SFmode; (int) mode <= (int) TFmode; \
-        mode = (enum machine_mode) ((int) mode + 1)) \
-      neg_optab->handlers[(int) mode].libfunc = NULL_RTX; \
-  } while (0)
+  set_conv_libfunc (sext_optab,   DFmode, SFmode, "fptodp");
+  set_conv_libfunc (trunc_optab,  SFmode, DFmode, "dptofp");
 
-#define GOFAST_RENAME_LIBCALLS \
-  add_optab->handlers[(int) SFmode].libfunc = init_one_libfunc ("fpadd"); \
-  add_optab->handlers[(int) DFmode].libfunc = init_one_libfunc ("dpadd"); \
-  sub_optab->handlers[(int) SFmode].libfunc = init_one_libfunc ("fpsub"); \
-  sub_optab->handlers[(int) DFmode].libfunc = init_one_libfunc ("dpsub"); \
-  smul_optab->handlers[(int) SFmode].libfunc = init_one_libfunc ("fpmul"); \
-  smul_optab->handlers[(int) DFmode].libfunc = init_one_libfunc ("dpmul"); \
-  flodiv_optab->handlers[(int) SFmode].libfunc = init_one_libfunc ("fpdiv"); \
-  flodiv_optab->handlers[(int) DFmode].libfunc = init_one_libfunc ("dpdiv"); \
-  cmp_optab->handlers[(int) SFmode].libfunc = init_one_libfunc ("fpcmp"); \
-  cmp_optab->handlers[(int) DFmode].libfunc = init_one_libfunc ("dpcmp"); \
-\
-  extendsfdf2_libfunc = init_one_libfunc ("fptodp"); \
-  truncdfsf2_libfunc = init_one_libfunc ("dptofp"); \
-\
-  eqsf2_libfunc = init_one_libfunc ("fpcmp"); \
-  nesf2_libfunc = init_one_libfunc ("fpcmp"); \
-  gtsf2_libfunc = init_one_libfunc ("fpcmp"); \
-  gesf2_libfunc = init_one_libfunc ("fpcmp"); \
-  ltsf2_libfunc = init_one_libfunc ("fpcmp"); \
-  lesf2_libfunc = init_one_libfunc ("fpcmp"); \
-\
-  eqdf2_libfunc = init_one_libfunc ("dpcmp"); \
-  nedf2_libfunc = init_one_libfunc ("dpcmp"); \
-  gtdf2_libfunc = init_one_libfunc ("dpcmp"); \
-  gedf2_libfunc = init_one_libfunc ("dpcmp"); \
-  ltdf2_libfunc = init_one_libfunc ("dpcmp"); \
-  ledf2_libfunc = init_one_libfunc ("dpcmp"); \
-\
-  eqxf2_libfunc = NULL_RTX; \
-  nexf2_libfunc = NULL_RTX; \
-  gtxf2_libfunc = NULL_RTX; \
-  gexf2_libfunc = NULL_RTX; \
-  ltxf2_libfunc = NULL_RTX; \
-  lexf2_libfunc = NULL_RTX; \
-\
-  eqtf2_libfunc = NULL_RTX; \
-  netf2_libfunc = NULL_RTX; \
-  gttf2_libfunc = NULL_RTX; \
-  getf2_libfunc = NULL_RTX; \
-  lttf2_libfunc = NULL_RTX; \
-  letf2_libfunc = NULL_RTX; \
-\
-  floatsisf_libfunc = init_one_libfunc ("sitofp"); \
-  floatsidf_libfunc = init_one_libfunc ("litodp"); \
-  fixsfsi_libfunc = init_one_libfunc ("fptosi"); \
-  fixdfsi_libfunc = init_one_libfunc ("dptoli"); \
-  fixunssfsi_libfunc = init_one_libfunc ("fptoui"); \
-  fixunsdfsi_libfunc = init_one_libfunc ("dptoul"); \
+  set_conv_libfunc (sfix_optab,   SImode, SFmode, "fptosi");
+  set_conv_libfunc (sfix_optab,   SImode, DFmode, "dptoli");
+  set_conv_libfunc (ufix_optab,   SImode, SFmode, "fptoui");
+  set_conv_libfunc (ufix_optab,   SImode, DFmode, "dptoul");
 
-/* End of GOFAST_RENAME_LIBCALLS */
+  set_conv_libfunc (sfloat_optab, SFmode, SImode, "sitofp");
+  set_conv_libfunc (sfloat_optab, DFmode, SImode, "litodp");
+#endif
+}