[Taking over Tony's patch] Ping?
Best regards, Thomas > -----Original Message----- > From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches- > ow...@gcc.gnu.org] On Behalf Of Tony Wang > Sent: Thursday, August 21, 2014 7:15 AM > To: gcc-patches@gcc.gnu.org > Subject: [PATCH 1/3,ARM,libgcc]Code size optimization for the fmul/fdiv > and dmul/ddiv function in libgcc > > Hi there, > > In libgcc the file ieee754-sf.S and ieee754-df.S have some function pairs > which will be bundled into one .o > file and sharing the same .text section. For example, the fmul and fdiv, > the libgcc makefile will build them > into one .o file and archived into libgcc.a. So when user only call single > float point multiply functions, the > fdiv function will also be linked, and as fmul and fdiv share the same .text > section, linker option > --gc-sections or -flot can't remove the dead code. > > So this optimization just separates the function pair(fmul/fdiv and > dmul/ddiv) into different sections, > following the naming pattern of -ffunction- > sections(.text.__functionname), through which the unused sections > of fdiv/ddiv can be eliminated through option --gcc-sections when users > only use fmul/dmul.The solution is to > add a conditional statement in the macro FUNC_START, which will > conditional change the section of a function > from .text to .text.__\name. when compiling with the L_arm_muldivsf3 > or L_arm_muldivdf3 macro. > > GCC regression test has been done on QEMU for Cortex-M3. No new > regressions when turn on this patch. > > The code reduction for thumb2 on cortex-m3 is: > 1. When user only use single float point multiply: > fmul+fdiv => fmul will have a code size reduction of 318 bytes. > > 2. When user only use double float point multiply: > dmul+ddiv => dmul will have a code size reduction of 474 bytes. > > Ok for trunk? > > BR, > Tony > > Step 1: Provide another option: sp-scetion to control whether to split the > section of a function pair into two > part. > > gcc/libgcc/ChangeLog: > 2014-08-21 Tony Wang <tony.w...@arm.com> > > * config/arm/lib1funcs.S (FUNC_START): Add conditional section > redefine for macro L_arm_muldivsf3 and L_arm_muldivdf3 > (SYM_END, ARM_SYM_START): Add macros used to expose function > Symbols > > diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S > index b617137..0f87111 100644 > --- a/libgcc/config/arm/lib1funcs.S > +++ b/libgcc/config/arm/lib1funcs.S > @@ -418,8 +418,12 @@ SYM (\name): > #define THUMB_SYNTAX > #endif > > -.macro FUNC_START name > +.macro FUNC_START name sp_section= > + .ifc \sp_section, function_section > + .section .text.__\name,"ax",%progbits > + .else > .text > + .endif > .globl SYM (__\name) > TYPE (__\name) > .align 0 > @@ -429,14 +433,24 @@ SYM (\name): > SYM (__\name): > .endm > > +.macro ARM_SYM_START name > + TYPE (\name) > + .align 0 > +SYM (\name): > +.endm > + > +.macro SYM_END name > + SIZE (\name) > +.endm > + > /* Special function that will always be coded in ARM assembly, even if > in Thumb-only compilation. */ > > #if defined(__thumb2__) > > /* For Thumb-2 we build everything in thumb mode. */ > -.macro ARM_FUNC_START name > - FUNC_START \name > +.macro ARM_FUNC_START name sp_section= > + FUNC_START \name \sp_section > .syntax unified > .endm > #define EQUIV .thumb_set > @@ -467,8 +481,12 @@ _L__\name: > #ifdef __ARM_ARCH_6M__ > #define EQUIV .thumb_set > #else > -.macro ARM_FUNC_START name > +.macro ARM_FUNC_START name sp_section= > + .ifc \sp_section, function_section > + .section .text.__\name,"ax",%progbits > + .else > .text > + .endif > .globl SYM (__\name) > TYPE (__\name) > .align 0