rockbox/lib/rbcodec
Michael Giacomelli 5d8ce62b45 codecs: link libarm_support for its division routines
lib/arm_support/support-arm.S was written to replace libgcc's
division for ARM, and bff5a35c3c (FS#10943, 2010) added it to the
core, the plugin library and the codec library alike.  When
1501df045f (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>
2026-10-05 07:46:37 -04:00
..
codecs codecs: link libarm_support for its division routines 2026-10-05 07:46:37 -04:00
dsp dsp: Add missing .type <symbol>, %function to arm asm 2026-09-19 21:18:30 -04:00
metadata Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
test warble: zero the mp3entry before reading metadata 2026-09-28 16:35:14 -04:00
platform.h firmware: refactor CACHEALIGN_BITS/SIZE defines 2026-03-06 14:49:00 +00:00
rbcodec.make rbcodec: Force use of -O2 for dsp code 2025-09-06 08:44:32 -04:00
rbcodecconfig-example.h Enable setting of global output samplerate on certain targets. 2013-07-06 04:22:04 +02:00
rbcodecplatform-unix.h Add "rbfs" prefix to native filesystem functions 2026-09-17 16:22:31 -04:00
SOURCES rbcodec dsp: Move dsp_sample_io_configure() to its own file 2022-12-22 17:20:14 -05:00