[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



Reply via email to