lib/lzma: Build the source for decompression with flag -Ofast

The decompression is critical for speed of boot. So we sacrifice some
generated code size to optimize for speed.
This change speeds up the LZMA decompression between 3% and 6% at a
cost of just over 2k of additional code space.

BUG=b:223985641
TEST=Majolica

The test is done on Majolica and the result is listed below.

Time saved:
We tested the boot time with each flag for 10 times. The duration of
each decompression process is listed as below.
        Load FSP-M    Load ramstage  Load payload
        Ofast Os      Ofast Os       Ofast Os
        ------------------------------------------
        62543 62959   20585 22458    9945  10626
        62548 62967   20587 22461    9951  10637
        62560 62980   20588 22478    9951  10641
        62561 62988   20596 22478    9954  10643
        62569 62993   20596 22479    9954  10643
        62574 63000   20605 22492    9958  10647
        62575 63026   20615 22495    9959  10647
        62576 63038   20743 22614    9960  10647
        62587 63044   20758 22625    9961  10647
        62592 63045   20769 22637    9961  10647
        -----------------------------------------
average 62568 63004   20644 22521    9955  10642
                             (unit: microseconds)

Size sacrificed:
The size of object file with -Os:
  ./build/ramstage/lib/lzmadecode.o:     file format elf32-i386
    4 .text.LzmaDecode 00000d84  00000000  00000000  00000076  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
The size of object file with -Ofast:
  ./build/ramstage/lib/lzmadecode.o:     file format elf32-i386
    4 .text.LzmaDecode 00001719  00000000  00000000  00000080  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
(Output by running "objdump -h ./build/ramstage/lib/lzmadecode.o")

We can see that size is increased from 3460 bytes to 5913 bytes, a
change of 2453 bytes or 171%.

Change-Id: Ie003164e2e93ba8ed3ccd207f3af31c6acf1c5e2
Signed-off-by: Zheng Bao <fishbaozi@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/66392
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martin.roth@amd.corp-partner.google.com>
This commit is contained in:
Zheng Bao 2022-08-03 17:57:47 +08:00 committed by Martin L Roth
parent dc522d2202
commit d91f3a4eaf
2 changed files with 14 additions and 0 deletions

View File

@ -114,3 +114,10 @@ config CBFS_PRELOAD
in the background before they are actually required. This feature
depends on the read-only boot_device having a DMA controller to
perform the background transfer.
config DECOMPRESS_OFAST
bool
depends on COMPILER_GCC
default y
help
Compile the decompressing function in -Ofast instead of standard -Os

View File

@ -19,6 +19,12 @@
to this file, however, are subject to the LGPL or CPL terms.
*/
#if CONFIG(DECOMPRESS_OFAST)
#define __lzma_attribute_Ofast__ __attribute__((optimize("Ofast")))
#else
#define __lzma_attribute_Ofast__
#endif
#include "lzmadecode.h"
#include <types.h>
@ -183,6 +189,7 @@ int LzmaDecodeProperties(CLzmaProperties *propsRes,
#define kLzmaStreamWasFinishedId (-1)
__lzma_attribute_Ofast__
int LzmaDecode(CLzmaDecoderState *vs,
const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)