72e3a52923
Softfloat single precision and double precision floating-point multiplication routines in libgcc share some code with the floating-point division of their corresponding precision. As the code is structured now, this leads to *all* division code being pulled in an executable in softfloat mode even if only multiplication is performed. This patch create some new LIB1ASMFUNCS macros to also build files with just the multiplication and shared code as weak symbols. By putting these earlier in the static library, they can then be picked up when only multiplication is used and they are overriden by the global definition in the existing file containing both multiplication and division code when division is needed. The patch also removes changes made to the FUNC_START and ARM_FUNC_START macros in r218124 since the intent was to put multiplication and division code into their own section in a later patch to achieve the same size optimization. That approach relied on specific section layout to ensure multiplication and division were not too far from the shared bit of code in order to the branches to be within range. Due to lack of guarantee regarding section layout, in particular with all the possibility of linker scripts, this approach was chosen instead. This patch keeps the two testcases that were posted by Tony Wang on the mailing list to implement this approach and adds a new one. 2018-12-19 Thomas Preud'homme <thomas.preudhomme@linaro.org> libgcc/ * /config/arm/lib1funcs.S (FUNC_START): Remove unused sp_section parameter and corresponding code. (ARM_FUNC_START): Likewise in both definitions. Also update footer comment about condition that need to match with gcc/config/arm/elf.h to also include libgcc/config/arm/t-arm. * config/arm/ieee754-df.S (muldf3): Also build it if L_arm_muldf3 is defined. Weakly define it in this case. * config/arm/ieee754-sf.S (mulsf3): Likewise with L_arm_mulsf3. * config/arm/t-elf (LIB1ASMFUNCS): Build _arm_muldf3.o and _arm_mulsf3.o before muldiv versions if targeting Thumb-1 only. Add comment to keep condition in sync with the one in libgcc/config/arm/lib1funcs.S and gcc/config/arm/elf.h. gcc/ * config/arm/elf.h: Update comment about condition that need to match with libgcc/config/arm/lib1funcs.S to also include libgcc/config/arm/t-arm. * doc/sourcebuild.texi (output-exists, output-exists-not): Rename subsubsection these directives are in to "Check for output files". Move scan-symbol to that section and add to it new scan-symbol-not directive. 2018-12-19 Tony Wang <tony.wang@arm.com> Thomas Preud'homme <thomas.preudhomme@linaro.org> gcc/testsuite/ * lib/lto.exp (lto-execute): Define output_file and testname_with_flags to same value as execname. (scan-symbol): Move and rename to ... * lib/gcc-dg.exp (scan-symbol-common): This. Adapt into a helper function returning true or false if a symbol is present. (scan-symbol): New procedure. (scan-symbol-not): Likewise. * gcc.target/arm/size-optimization-ieee-1.c: New testcase. * gcc.target/arm/size-optimization-ieee-2.c: Likewise. * gcc.target/arm/size-optimization-ieee-3.c: Likewise. From-SVN: r267282
35 lines
1.7 KiB
Plaintext
35 lines
1.7 KiB
Plaintext
ifeq (,$(findstring __symbian__,$(shell $(gcc_compile_bare) -dM -E - </dev/null)))
|
|
|
|
ARM_ISA:=$(findstring __ARM_ARCH_ISA_ARM,$(shell $(gcc_compile_bare) -dM -E - </dev/null))
|
|
THUMB1_ISA:=$(findstring __ARM_ARCH_ISA_THUMB 1,$(shell $(gcc_compile_bare) -dM -E - </dev/null))
|
|
|
|
# The condition here must match the one in gcc/config/arm/elf.h and
|
|
# libgcc/config/arm/lib1funcs.S. _arm_muldf3 and _arm_mulsf3 must be included
|
|
# first so that the weak multiplication symbols in the corresponding files are
|
|
# chosen over the global symbols that _arm_muldivdf3 and _arm_muldivsf3
|
|
# inclusion create when only multiplication is used, thus avoiding pulling in
|
|
# useless division code.
|
|
ifneq (__ARM_ARCH_ISA_THUMB 1,$(ARM_ISA)$(THUMB1_ISA))
|
|
LIB1ASMFUNCS += _arm_muldf3 _arm_mulsf3
|
|
endif
|
|
endif # !__symbian__
|
|
|
|
# For most CPUs we have an assembly soft-float implementations.
|
|
# However this is not true for ARMv6M. Here we want to use the soft-fp C
|
|
# implementation. The soft-fp code is only build for ARMv6M. This pulls
|
|
# in the asm implementation for other CPUs.
|
|
LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
|
|
_call_via_rX _interwork_call_via_rX \
|
|
_lshrdi3 _ashrdi3 _ashldi3 \
|
|
_arm_negdf2 _arm_addsubdf3 _arm_muldivdf3 _arm_cmpdf2 _arm_unorddf2 \
|
|
_arm_fixdfsi _arm_fixunsdfsi \
|
|
_arm_truncdfsf2 _arm_negsf2 _arm_addsubsf3 _arm_muldivsf3 \
|
|
_arm_cmpsf2 _arm_unordsf2 _arm_fixsfsi _arm_fixunssfsi \
|
|
_arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
|
|
_clzsi2 _clzdi2 _ctzsi2
|
|
|
|
# Currently there is a bug somewhere in GCC's alias analysis
|
|
# or scheduling code that is breaking _fpmul_parts in fp-bit.c.
|
|
# Disabling function inlining is a workaround for this problem.
|
|
HOST_LIBGCC2_CFLAGS += -fno-inline
|