# Copyright (C) 2006 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 2, 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 COPYING.  If not, write to
# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
# Boston MA 02110-1301, USA.

# Targets using soft-fp should define the following variables:
#
# softfp_float_modes: a list of soft-float floating-point modes,
#                     e.g. sf df
# softfp_int_modes: a list of integer modes for which to define conversions,
#                   e.g. si di
# softfp_extensions: a list of extensions between floating-point modes,
#                    e.g. sfdf
# softfp_truncations: a list of truncations between floating-point modes,
#                     e.g. dfsf
# softfp_machine_header: the target sfp-machine.h file (relative to config/),
#                        e.g. rs6000/sfp-machine.h
#
# Extensions and truncations should include those where only one mode
# is a soft-float mode; for example, sftf where sf is hard-float and
# tf is soft-float.
#
# If the libgcc2.c functions should not be replaced, also define:
#
# softfp_exclude_libgcc2 := y
#
# Avoiding replacing the libgcc2.c functions is a temporary measure
# for targets with both hard-float and soft-float multilibs, since
# these variables apply for all multilibs.  With toplevel libgcc,
# soft-fp can be used conditionally on the multilib instead.
#
# If the code should not be compiled at all for some multilibs, define:
#
# softfp_wrap_start: text to put at the start of wrapper source files,
#                    output with echo
#                    e.g. '#ifndef __powerpc64__'
# softfp_wrap_end: text to put at the end of wrapper source files,
#                  e.g. '#endif'
#
# This is another temporary measure.

softfp_float_funcs = add$(m)3 div$(m)3 eq$(m)2 ge$(m)2 le$(m)2 mul$(m)3 \
  neg$(m)2 sub$(m)3 unord$(m)2
softfp_floatint_funcs = fix$(m)$(i) fixuns$(m)$(i) \
  float$(i)$(m) floatun$(i)$(m)

softfp_func_list := \
  $(foreach m,$(softfp_float_modes), \
              $(softfp_float_funcs) \
              $(foreach i,$(softfp_int_modes), \
                          $(softfp_floatint_funcs))) \
  $(foreach e,$(softfp_extensions),extend$(e)2) \
  $(foreach t,$(softfp_truncations),trunc$(t)2)

ifeq ($(softfp_exclude_libgcc2),y)
# This list is taken from mklibgcc.in and doesn't presently allow for
# 64-bit targets where si should become di and di should become ti.
softfp_func_list := $(filter-out floatdidf floatdisf fixunsdfsi fixunssfsi \
  fixunsdfdi fixdfdi fixunssfdi fixsfdi fixxfdi fixunsxfdi \
  floatdixf fixunsxfsi fixtfdi fixunstfdi floatditf \
  floatundidf floatundisf floatundixf floatunditf,$(softfp_func_list))
endif

ifeq ($(softfp_wrap_start),)
softfp_file_list := \
  $(addsuffix .c,$(addprefix $(srcdir)/config/soft-fp/,$(softfp_func_list)))
else
softfp_file_list := $(addsuffix .c,$(softfp_func_list))

$(softfp_file_list):
	echo $(softfp_wrap_start) > $@
	echo '#include "config/soft-fp/$@"' >> $@
	echo $(softfp_wrap_end) >> $@
endif

LIB2FUNCS_EXTRA += $(softfp_file_list)

ifneq ($(softfp_exclude_libgcc2),y)
# Functions in libgcc2.c are excluded for each soft-float mode (a
# target may have both soft-float and hard-float modes), for the fixed
# list of integer modes (si and di) for which libgcc2.c defines any
# such functions.  Depending on the target, the si and di symbols may
# in fact define di and ti functions.

LIB2FUNCS_EXCLUDE += \
  $(addprefix _,$(foreach m,$(softfp_float_modes), \
                            $(foreach i,si di, \
                                        $(softfp_floatint_funcs))))
endif

SFP_MACHINE := sfp-machine.h

$(SFP_MACHINE): $(srcdir)/config/$(softfp_machine_header)
	cp $(srcdir)/config/$(softfp_machine_header) $(SFP_MACHINE)
