123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- # Copyright (C) 2014-2022 Free Software Foundation, Inc.
- # This file is part of GCC.
- # 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 3, or (at your option)
- # any later version.
- # 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 GCC; see the file COPYING3. If not see
- # <http://www.gnu.org/licenses/>.
- # For historical reasons, some targets provide a full set of FP routines
- # even if there is native hardware support for some of them. This file
- # is used to define functions that can be implemented directly in hardware.
- # For example, an __adddf3 defined by this file will use an FPU addition.
- #
- # The following variables should be set up before including this file:
- #
- # hardfp_float_modes: a list of hardware floating-point modes.
- # e.g. sf df
- # hardfp_int_modes: a list of integer modes for which to define conversions;
- # usually this is "si", since libgcc2.c provides routines
- # for wider modes
- # hardfp_extensions: a list of extensions between hardware floating-point modes,
- # e.g. sfdf
- # hardfp_truncations: a list of truncations between hardware floating-point
- # modes, e.g. dfsf
- #
- # If some functions that would otherwise be defined should not be
- # defined by this file (typically because the target would compile
- # certain operations into a call to the libgcc function, which thus
- # needs to be defined elsewhere to use software floating point), also
- # define hardfp_exclusions to be a list of those functions,
- # e.g. unorddf2.
- # Functions parameterized by a floating-point mode M.
- hardfp_func_bases := addM3 subM3 negM2 mulM3 divM3
- hardfp_func_bases += eqM2 neM2 geM2 gtM2 leM2 ltM2 unordM2
- # Functions parameterized by both a floating-point mode M and an integer mode N.
- hardfp_int_func_bases := fixMN floatNM floatunNM
- hardfp_func_bases += $(foreach n, $(hardfp_int_modes), \
- $(subst N,$(n),$(hardfp_int_func_bases)))
- # Get the full list of functions.
- hardfp_func_list := $(foreach m, $(hardfp_float_modes), \
- $(subst M,$(m),$(hardfp_func_bases)))
- hardfp_func_list += $(foreach pair, $(hardfp_extensions), \
- $(subst M,$(pair),extendM2))
- hardfp_func_list += $(foreach pair, $(hardfp_truncations), \
- $(subst M,$(pair),truncM2))
- hardfp_func_list := $(filter-out $(hardfp_exclusions),$(hardfp_func_list))
- # Regexp for matching a floating-point mode.
- hardfp_mode_regexp := $(shell echo $(hardfp_float_modes) | sed 's/ /\\|/g')
- # Regexp for matching the end of a function name, after the last
- # floating-point mode.
- hardfp_suffix_regexp := $(shell echo $(hardfp_int_modes) 2 3 | sed 's/ /\\|/g')
- # Add -D options to define:
- # FUNC: the function name (e.g. __addsf3)
- # OP: the function name without the leading __ and with the last
- # floating-point mode removed (e.g. add3)
- # TYPE: the last floating-point mode (e.g. sf)
- hardfp_defines_for = \
- $(shell echo $1 | \
- sed 's/\(.*\)\($(hardfp_mode_regexp)\)\($(hardfp_suffix_regexp)\|\)$$/-DFUNC=__& -DOP_\1\3 -DTYPE=\2/')
- hardfp-o = $(patsubst %,%$(objext),$(hardfp_func_list))
- $(hardfp-o): %$(objext): $(srcdir)/config/hardfp.c
- @echo "Mode = $(hardfp_mode_regexp)"
- @echo "Suffix = $(hardfp_suffix_regexp)"
- $(gcc_compile) $(call hardfp_defines_for, $*) -c $< $(vis_hide) -Wno-missing-prototypes
- libgcc-objects += $(hardfp-o)
- ifeq ($(enable_shared),yes)
- hardfp-s-o = $(patsubst %,%_s$(objext),$(hardfp_func_list))
- $(hardfp-s-o): %_s$(objext): $(srcdir)/config/hardfp.c
- $(gcc_s_compile) $(call hardfp_defines_for, $*) -c $< -Wno-missing-prototypes
- libgcc-s-objects += $(hardfp-s-o)
- endif
|