1 1.1 mrg # Support for adding __float128 to the powerpc. 2 1.1 mrg 3 1.1 mrg # The standard 128-bit floating point support functions are TFmode. Most 4 1.1 mrg # PowerPC targets use a long double format that has a pair of doubles to give 5 1.1 mrg # you more precision, but no extra expoenent range. This long double format is 6 1.1 mrg # mostly compatible with the format used by the IBM XL compilers. Some of the 7 1.1 mrg # names used by the IBM double-double format use TF in them, so we rename 8 1.1 mrg # all of the functions provided for the new IEEE 128-bit support. 9 1.1 mrg # 10 1.1 mrg # We use the TF functions in soft-fp for 128-bit floating point support, using 11 1.1 mrg # sed to transform the names in the files from TF names to KF names. 12 1.1 mrg 13 1.1 mrg # Emulator functions from the soft-fp directory 14 1.1 mrg fp128_softfp_funcs = addkf3 subkf3 mulkf3 divkf3 negkf2 \ 15 1.1 mrg unordkf2 eqkf2 gekf2 lekf2 \ 16 1.1 mrg extendsfkf2 extenddfkf2 trunckfsf2 trunckfdf2 \ 17 1.1 mrg fixkfsi fixkfdi fixunskfsi fixunskfdi \ 18 1.1 mrg floatsikf floatdikf floatunsikf floatundikf 19 1.1 mrg 20 1.1 mrg fp128_softfp_src = $(addsuffix -sw.c,$(fp128_softfp_funcs)) 21 1.1 mrg fp128_softfp_static_obj = $(addsuffix -sw$(objext),$(fp128_softfp_funcs)) 22 1.1 mrg fp128_softfp_shared_obj = $(addsuffix -sw_s$(objext),$(fp128_softfp_funcs)) 23 1.1 mrg fp128_softfp_obj = $(fp128_softfp_static_obj) $(fp128_softfp_shared_obj) 24 1.1 mrg 25 1.1.1.5 mrg # Decimal <-> _Float128 conversions 26 1.1.1.5 mrg fp128_dec_funcs = _kf_to_sd _kf_to_dd _kf_to_td \ 27 1.1.1.5 mrg _sd_to_kf _dd_to_kf _td_to_kf 28 1.1.1.5 mrg 29 1.1.1.5 mrg # Decimal <-> __ibm128 conversions 30 1.1.1.5 mrg ibm128_dec_funcs = _tf_to_sd _tf_to_dd _tf_to_td \ 31 1.1.1.5 mrg _sd_to_tf _dd_to_tf _td_to_tf 32 1.1.1.5 mrg 33 1.1 mrg # New functions for software emulation 34 1.1.1.5 mrg fp128_ppc_funcs = floattikf-sw floatuntikf-sw \ 35 1.1.1.5 mrg fixkfti-sw fixunskfti-sw \ 36 1.1 mrg extendkftf2-sw trunctfkf2-sw \ 37 1.1.1.4 mrg sfp-exceptions _mulkc3 _divkc3 _powikf2 38 1.1 mrg 39 1.1.1.5 mrg ifeq ($(decimal_float),yes) 40 1.1.1.5 mrg fp128_ppc_funcs += $(fp128_dec_funcs) 41 1.1.1.5 mrg endif 42 1.1.1.5 mrg 43 1.1 mrg fp128_ppc_src = $(addprefix $(srcdir)/config/rs6000/,$(addsuffix \ 44 1.1 mrg .c,$(fp128_ppc_funcs))) 45 1.1 mrg fp128_ppc_static_obj = $(addsuffix $(objext),$(fp128_ppc_funcs)) 46 1.1 mrg fp128_ppc_shared_obj = $(addsuffix _s$(objext),$(fp128_ppc_funcs)) 47 1.1 mrg fp128_ppc_obj = $(fp128_ppc_static_obj) $(fp128_ppc_shared_obj) 48 1.1 mrg 49 1.1 mrg # All functions 50 1.1 mrg fp128_funcs = $(fp128_softfp_funcs) $(fp128_ppc_funcs) \ 51 1.1.1.5 mrg $(fp128_hw_funcs) $(fp128_ifunc_funcs) \ 52 1.1.1.5 mrg $(fp128_3_1_hw_funcs) 53 1.1 mrg 54 1.1 mrg fp128_src = $(fp128_softfp_src) $(fp128_ppc_src) \ 55 1.1.1.5 mrg $(fp128_hw_src) $(fp128_ifunc_src) \ 56 1.1.1.5 mrg $(fp128_3_1_hw_src) 57 1.1 mrg 58 1.1 mrg fp128_obj = $(fp128_softfp_obj) $(fp128_ppc_obj) \ 59 1.1.1.5 mrg $(fp128_hw_obj) $(fp128_ifunc_obj) \ 60 1.1.1.5 mrg $(fp128_3_1_hw_obj) 61 1.1 mrg 62 1.1 mrg fp128_sed = $(srcdir)/config/rs6000/float128-sed$(fp128_sed_hw) 63 1.1 mrg fp128_dep = $(fp128_sed) $(srcdir)/config/rs6000/t-float128 64 1.1 mrg 65 1.1 mrg fp128_includes = $(srcdir)/soft-fp/double.h \ 66 1.1 mrg $(srcdir)/soft-fp/op-1.h \ 67 1.1 mrg $(srcdir)/soft-fp/op-4.h \ 68 1.1 mrg $(srcdir)/soft-fp/op-common.h \ 69 1.1 mrg $(srcdir)/soft-fp/single.h \ 70 1.1 mrg $(srcdir)/soft-fp/extended.h \ 71 1.1 mrg $(srcdir)/soft-fp/op-2.h \ 72 1.1 mrg $(srcdir)/soft-fp/op-8.h \ 73 1.1 mrg $(srcdir)/soft-fp/quad.h \ 74 1.1 mrg $(srcdir)/soft-fp/soft-fp.h 75 1.1 mrg 76 1.1 mrg # Build the emulator without ISA 3.0 hardware support. 77 1.1 mrg FP128_CFLAGS_SW = -Wno-type-limits -mvsx -mfloat128 \ 78 1.1.1.4 mrg -mno-float128-hardware -mno-gnu-attribute \ 79 1.1 mrg -I$(srcdir)/soft-fp \ 80 1.1 mrg -I$(srcdir)/config/rs6000 \ 81 1.1 mrg $(FLOAT128_HW_INSNS) 82 1.1 mrg 83 1.1 mrg $(fp128_softfp_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) 84 1.1 mrg $(fp128_ppc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW) 85 1.1 mrg $(fp128_obj) : $(fp128_includes) 86 1.1 mrg $(fp128_obj) : $(srcdir)/config/rs6000/quad-float128.h 87 1.1 mrg 88 1.1.1.5 mrg # Force the TF mode to/from decimal functions to be compiled with IBM long 89 1.1.1.5 mrg # double. Add building the KF mode to/from decimal conversions with explict 90 1.1.1.5 mrg # IEEE long double. 91 1.1.1.5 mrg fp128_dec_objs = $(addsuffix $(objext),$(fp128_dec_funcs)) \ 92 1.1.1.5 mrg $(addsuffix _s$(objext),$(fp128_dec_funcs)) 93 1.1.1.5 mrg 94 1.1.1.5 mrg ibm128_dec_objs = $(addsuffix $(objext),$(ibm128_dec_funcs)) \ 95 1.1.1.5 mrg $(addsuffix _s$(objext),$(ibm128_dec_funcs)) 96 1.1.1.5 mrg 97 1.1.1.5 mrg FP128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ieeelongdouble 98 1.1.1.5 mrg IBM128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ibmlongdouble 99 1.1.1.5 mrg 100 1.1.1.5 mrg $(fp128_dec_objs) : INTERNAL_CFLAGS += $(FP128_CFLAGS_DECIMAL) 101 1.1.1.5 mrg $(ibm128_dec_objs) : INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL) 102 1.1.1.5 mrg 103 1.1 mrg $(fp128_softfp_src) : $(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@)) $(fp128_dep) 104 1.1 mrg @src="$(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@))"; \ 105 1.1 mrg echo "Create $@"; \ 106 1.1 mrg (echo "/* file created from $$src */"; \ 107 1.1 mrg echo; \ 108 1.1 mrg sed -f $(fp128_sed) < $$src) > $@ 109 1.1 mrg 110 1.1 mrg .PHONY: test clean-float128 111 1.1 mrg 112 1.1 mrg test: 113 1.1 mrg @echo "fp128_src:"; \ 114 1.1 mrg for x in $(fp128_src); do echo " $$x"; done; \ 115 1.1 mrg echo; \ 116 1.1 mrg echo "fp128_obj:"; \ 117 1.1 mrg for x in $(fp128_obj); do echo " $$x"; done; 118 1.1 mrg 119 1.1 mrg clean-float128: 120 1.1.1.4 mrg -rm -f $(fp128_softfp_src) $(fp128_hardfp_src) 121 1.1 mrg @$(MULTICLEAN) multi-clean DO=clean-float128 122 1.1 mrg 123 1.1 mrg # For now, only put it in the static library 124 1.1 mrg # LIB2ADD += $(fp128_src) 125 1.1 mrg 126 1.1 mrg LIB2ADD_ST += $(fp128_src) 127