rockbox/lib
Michael Giacomelli aa7ebbe057 libdemac: entropy state in registers, one less divide
After the division routines the entropy decoder was the largest part
of Monkey's Audio at the fast levels, with two things to gain.

All of its state, the range coder's and the Rice parameters, was in
statics, so each use was a load and each update a store: about half
of the function's time on ARM7TDMI, where a load is 3 cycles.  Copy
it to locals for the length of a block and write it back after.  The
functions that take a pointer to it have to be inlined for that to
work, and on ARMv4 gcc left the per-sample one out of line, so force
them.

The symbol was found by dividing low by help and searching the count
table for the quotient.  counts[n] <= low / help is the same as
counts[n] * help <= low, so search with the multiply instead: the
first symbols are by far the likeliest.  That leaves two divisions a
sample from three.

MHz for real time in perfsim's models, -c1000, -c2000 and -c3000:
  Clip+ (ARMv5)  37.9, 53.8, 81.8  to  32.5, 48.4, 76.4
  e200 (ARMv4)   45.3, 68.6, 111.4 to  35.2, 58.5, 101.3
A Clip+ measures 32.85 at -c1000 (61.4 before this and the division
change), with test_codec's checksum, 1008ffab, the same as the old
code's.  The standalone decoder gives identical output for all four
levels tested.  The path for files older than 3.98 has the same
change and was not tested, for want of a file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Change-Id: Idf9002a5b5f3a423f44f70443936ea5ac427cd12
2026-10-05 10:19:38 -04:00
..
arm_support chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
fixedpoint chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
libsetjmp libsetjmp: fix unpredictable behavior warning on ARM Cortex-M 2025-04-19 11:24:01 -04:00
microtar chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
mipsunwinder chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
rbcodec libdemac: entropy state in registers, one less divide 2026-10-05 10:19:38 -04:00
skin_parser skin_parser: Fix regression in 0d5afa6d 2026-07-05 19:12:25 -04:00
tlsf chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
unwarminder chore: Get rid of *all* vestigal CVS '$Id:$' tags 2026-06-01 16:01:18 -04:00
utf8proc utf8proc: Add utf8proc for normalizing UTF-8 strings 2026-03-01 08:26:00 -05:00