mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-10-10 08:03:04 -04:00
codecs: link libarm_support for its division routines
lib/arm_support/support-arm.S was written to replace libgcc's division for ARM, andbff5a35c3c(FS#10943, 2010) added it to the core, the plugin library and the codec library alike. When1501df045f(2013) replaced EXTRA_LIBS with explicit lists, plugins kept it and codecs did not, and they have taken their division from libgcc since. With the gcc 4.4 toolchain that cost little: its libgcc had a routine that used clz. With gcc 9.5 libgcc has no soft-float ARMv5 variant, so ARMv5 targets get the ARMv4 routine, a shift and subtract loop of about 130 cycles a division. Monkey's Audio divides two or three times a sample in its range decoder and, without codec IRAM, does it in C. On a Clip+ it is 11% to 21% slower than 3.14 was, with over half of -c1000's decode in __udivsi3. MP2 is 4% to 7% slower. Put libarm_support back, ahead of libgcc. In perfsim's model of the Clip+ a division falls to 44 cycles, Monkey's Audio by 38%, 30% and 22% at -c1000, -c2000 and -c3000 (60.9 to 37.9 MHz at -c1000), and MP2 by 3% to 7%; nothing else moves by more than 0.6%. A Clip+ decodes -c1000 with the same checksum as before. A division by zero in a codec goes to __div0 again, and so to the firmware's handler, as it did with support-arm.S and with the old libgcc (3.14's ape.codec calls it). The gcc 9.5 libgcc returns from its own stub instead. Change-Id: I6a9a79ce8e85bca69870349a5c0823f392a578b6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
4c78e98461
commit
5d8ce62b45
1 changed files with 3 additions and 2 deletions
|
|
@ -17,8 +17,9 @@ CODECS := $(subst $(RBCODECLIB_DIR),$(RBCODEC_BLD),$(CODECS))
|
|||
include $(RBCODECLIB_DIR)/codecs/lib/libcodec.make
|
||||
OTHER_INC += -I$(RBCODECLIB_DIR)/codecs/lib
|
||||
|
||||
# extra libraries
|
||||
CODEC_LIBS := $(CODECLIB) $(FIXEDPOINTLIB)
|
||||
# extra libraries. libarm_support has the division routines, which are much
|
||||
# faster than what libgcc may supply; it is empty when not building for ARM.
|
||||
CODEC_LIBS := $(CODECLIB) $(FIXEDPOINTLIB) $(ARMSUPPORTLIB)
|
||||
|
||||
# compile flags for codecs
|
||||
CODECFLAGS := $(CFLAGS) $(RBCODEC_CFLAGS) -fstrict-aliasing \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue