Rockbox

This is the bug/patch tracker for Rockbox. Click here for more information.

Quick links: Bugs · Patches · Rockbox frontpage

Tasklist

FS#11335 - Make ARM assembly functions thumb-friendly

Attached to Project: Rockbox
Opened by Rafaël Carré (funman) - Sunday, 30 May 2010, 23:37 GMT+2
Last edited by Rafaël Carré (funman) - Friday, 11 June 2010, 06:42 GMT+2
Task Type Patches
Category Battery/Charging
Status Closed
Assigned To No-one
Player Type All players
Severity Low
Priority Normal
Reported Version Release 3.4
Due in Version Undecided
Due Date Undecided
Percent Complete 100%
Private No

Details

A lot of functions use return instructions which won't set the T bit if the caller was running in thumb:

- ldm reg, { ..., pc } works on armv5 but not armv4t

- ldr pc, function works on ARMv5 and +

- add/sub/bic/orr/mov pc, lr works on armv7 but not before

reference is http://webcache.googleusercontent.com/search?q=cache:saLD8BqZXhQJ:www.riscosopen.org/wiki/documentation/pages/ARMv7%2Bcompatibility%2Bprimer+thumb+interwork+ldm+ldr+armv7&cd=1&hl=fr&ct=clnk

DDI0100E (ARMv5 architecture reference manual) says of mov:
If <Rd> is R15, the SPSR of the current mode is copied to the CPSR


This patch changes all occurences of these instructions which could be run on armv4t (e.g. PP, AMSv1, ..).

I don't think I have missed any, I used grep -E "(((ldr|mov) *)|(ldm.*))pc" to find all the occurences.

I could have changed some code which would not run on ARMv4 though.



Cost of this change on ldm (the most used)
- 4 more bytes per return
- 1 more cycle on ARM7TDMI, no effect on newer CPUs



See  FS#6734  for how to build thumb code
   thumb.diff (44.7 KiB)
 b/apps/codecs/demac/libdemac/predictor-arm.S             |    6 +
 b/apps/codecs/lib/mdct_arm.S                             |   11 ++-
 b/apps/codecs/libatrac/atrac3_arm.S                      |    6 +
 b/apps/codecs/libffmpegFLAC/arm.S                        |    3 
 b/apps/codecs/libmad/dct32_arm.S                         |    3 
 b/apps/codecs/libmad/imdct_l_arm.S                       |    6 +
 b/apps/codecs/libmad/synth_full_arm.S                    |   12 ++-
 b/apps/codecs/libmusepack/synth_filter_arm.S             |    6 +
 b/apps/codecs/libspeex/filters_arm4.S                    |   15 +++-
 b/apps/codecs/libtta/filter_arm.S                        |    6 +
 b/apps/codecs/libwavpack/arm.S                           |    3 
 b/apps/codecs/libwavpack/arml.S                          |    3 
 b/apps/dsp_arm.S                                         |   42 ++++++++-----
 b/apps/eq_arm.S                                          |    3 
 b/apps/plugins/SOURCES                                   |    1 
 b/apps/plugins/mpegplayer/idct_arm.S                     |    9 +-
 b/apps/plugins/mpegplayer/motion_comp_arm_s.S            |   48 ++++++++++-----
 b/apps/plugins/pacbox/pacbox_arm.S                       |    3 
 b/apps/plugins/test_codec.c                              |    2 
 b/apps/recorder/jpeg_idct_arm.S                          |   24 +++++--
 b/firmware/rolo.c                                        |   12 ++-
 b/firmware/target/arm/as3525/debug-as3525.c              |    9 ++
 b/firmware/target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S |    6 +
 b/firmware/target/arm/as3525/sansa-clip/lcd-as-clip.S    |    3 
 b/firmware/target/arm/ata-as-arm.S                       |   12 ++-
 b/firmware/target/arm/ipod/lcd-as-gray.S                 |   12 ++-
 b/firmware/target/arm/ipod/video/lcd-as-video.S          |    6 +
 b/firmware/target/arm/iriver/h10/lcd-as-h10.S            |    6 +
 b/firmware/target/arm/lcd-as-memframe.S                  |    9 +-
 b/firmware/target/arm/memcpy-arm.S                       |    3 
 b/firmware/target/arm/memmove-arm.S                      |    3 
 b/firmware/target/arm/memset-arm.S                       |    3 
 b/firmware/target/arm/memset16-arm.S                     |    3 
 b/firmware/target/arm/olympus/mrobe-100/lcd-as-mr100.S   |    3 
 b/firmware/target/arm/pbell/vibe500/lcd-as-vibe500.S     |    6 +
 b/firmware/target/arm/philips/hdd1630/lcd-as-hdd1630.S   |    6 +
 b/firmware/target/arm/samsung/yh820/lcd-as-yh820.S       |    6 +
 b/firmware/target/arm/samsung/yh920/lcd-as-yh920.S       |    3 
 b/firmware/target/arm/samsung/yh925/lcd-as-yh925.S       |    6 +
 b/firmware/target/arm/sandisk/sansa-c200/lcd-as-c200.S   |    6 +
 b/firmware/thread.c                                      |    8 +-
 41 files changed, 229 insertions(+), 114 deletions(-)

This task depends upon

Closed by  Rafaël Carré (funman)
Friday, 11 June 2010, 06:42 GMT+2
Reason for closing:  Accepted
Additional comments about closing:  r26756
Comment by Rafaël Carré (funman) - Sunday, 30 May 2010, 23:38 GMT+2
I didn't change any crt0.S

I think we can return from vectors with anything, the spsr will be restored with the T bit (must check)
Comment by Rafaël Carré (funman) - Monday, 31 May 2010, 00:03 GMT+2
Exceptions which return already take care of restoring CPSR from SPSR so the T bit stays set

e200v1 built with -mthumb still doesn't boot though
Comment by Rafaël Carré (funman) - Monday, 31 May 2010, 00:07 GMT+2
Tested OK on fuzev1 (armv4) and clipv2 (armv5)
Comment by Rafaël Carré (funman) - Monday, 31 May 2010, 16:43 GMT+2
All files checked
Modify some comments
Remove unrelated diffs

% grep -rE "(((mov|ldr) *)|(ldm.*))pc" *|cut -d: -f1|sort|uniq

apps/codecs/demac/libdemac/udiv32_arm.S # ARMv5+
apps/codecs/libtremor/mapping0.c # false positive (ldmia %[pcm])
apps/dsp_arm_v6.S # ARMv6+
apps/plugins/mpegplayer/idct_armv6.S # ARMv6+
apps/plugins/mpegplayer/motion_comp_arm_s.S # branches to local ARM functions
apps/recorder/jpeg_idct_arm.S # ARMv5+

firmware/target/arm/as3525/sansa-clipplus/lcd-as-clip-plus.S # ARMv5
firmware/target/arm/as3525/sansa-clipv2/lcd-as-clipv2.S # ARMv5

# crt0 ignored: entered in ARM state, returning from exceptions restore SPSR into CPSR
firmware/target/arm/at91sam/lyre_proto1/crt0.S
firmware/target/arm/crt0-pp-bl.S
firmware/target/arm/crt0-pp.S
firmware/target/arm/crt0.S
firmware/target/arm/imx31/crt0.S
firmware/target/arm/pnx0101/crt0-pnx0101.S
firmware/target/arm/s3c2440/crt0.S
firmware/target/arm/s5l8700/crt0.S
firmware/target/arm/tcc77x/crt0.S
firmware/target/arm/tcc780x/crt0.S

firmware/target/arm/support-arm.S # ARMv5+
firmware/target/arm/s3c2440/system-s3c2440.c # return from exception (irq), restore SPSR into CPSR

# tools and bootloaders ignored

rbutil/mkamsboot/dualboot/dualboot.S
rbutil/mkamsboot/dualboot/nrv2e_d8.S
rbutil/mktccboot/mktccboot.c

bootloader/creativezvm.c
bootloader/ipodnano2g.c

Still not booting on e200v1 (built with -mthumb) - not sure why
   thumb-v2.diff (45.5 KiB)
 b/apps/codecs/demac/libdemac/predictor-arm.S             |    6 +
 b/apps/codecs/demac/libdemac/udiv32_arm.S                |    3 
 b/apps/codecs/lib/mdct_arm.S                             |   11 ++-
 b/apps/codecs/libatrac/atrac3_arm.S                      |    6 +
 b/apps/codecs/libffmpegFLAC/arm.S                        |    3 
 b/apps/codecs/libmad/dct32_arm.S                         |    3 
 b/apps/codecs/libmad/imdct_l_arm.S                       |    6 +
 b/apps/codecs/libmad/synth_full_arm.S                    |   12 ++-
 b/apps/codecs/libmusepack/synth_filter_arm.S             |    6 +
 b/apps/codecs/libspeex/filters_arm4.S                    |   18 ++++-
 b/apps/codecs/libtta/filter_arm.S                        |    6 +
 b/apps/codecs/libwavpack/arm.S                           |    3 
 b/apps/codecs/libwavpack/arml.S                          |    3 
 b/apps/dsp_arm.S                                         |   42 ++++++++-----
 b/apps/eq_arm.S                                          |    3 
 b/apps/plugins/mpegplayer/idct_arm.S                     |    9 +-
 b/apps/plugins/mpegplayer/motion_comp_arm_s.S            |   48 ++++++++++-----
 b/apps/plugins/pacbox/pacbox_arm.S                       |    3 
 b/apps/recorder/jpeg_idct_arm.S                          |   34 ++++++----
 b/firmware/rolo.c                                        |    9 +-
 b/firmware/target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S |    6 +
 b/firmware/target/arm/as3525/sansa-clip/lcd-as-clip.S    |    3 
 b/firmware/target/arm/ata-as-arm.S                       |   12 ++-
 b/firmware/target/arm/ipod/lcd-as-gray.S                 |   12 ++-
 b/firmware/target/arm/ipod/video/lcd-as-video.S          |    6 +
 b/firmware/target/arm/iriver/h10/lcd-as-h10.S            |    6 +
 b/firmware/target/arm/lcd-as-memframe.S                  |    9 +-
 b/firmware/target/arm/memcpy-arm.S                       |    3 
 b/firmware/target/arm/memmove-arm.S                      |    3 
 b/firmware/target/arm/memset-arm.S                       |    4 -
 b/firmware/target/arm/memset16-arm.S                     |    4 -
 b/firmware/target/arm/olympus/mrobe-100/lcd-as-mr100.S   |    3 
 b/firmware/target/arm/pbell/vibe500/lcd-as-vibe500.S     |    6 +
 b/firmware/target/arm/pcm-pp.c                           |    8 +-
 b/firmware/target/arm/philips/hdd1630/lcd-as-hdd1630.S   |    6 +
 b/firmware/target/arm/samsung/yh820/lcd-as-yh820.S       |    6 +
 b/firmware/target/arm/samsung/yh920/lcd-as-yh920.S       |    3 
 b/firmware/target/arm/samsung/yh925/lcd-as-yh925.S       |    6 +
 b/firmware/target/arm/sandisk/sansa-c200/lcd-as-c200.S   |    6 +
 b/firmware/thread.c                                      |   11 ++-
 40 files changed, 235 insertions(+), 122 deletions(-)

Comment by Rafaël Carré (funman) - Saturday, 05 June 2010, 19:23 GMT+2
sync to r26588
   thumb-v3.diff (43.2 KiB)
 b/apps/codecs/demac/libdemac/predictor-arm.S             |    6 +
 b/apps/codecs/demac/libdemac/udiv32_arm.S                |    3 
 b/apps/codecs/lib/mdct_arm.S                             |    9 +-
 b/apps/codecs/libatrac/atrac3_arm.S                      |    6 +
 b/apps/codecs/libffmpegFLAC/arm.S                        |    3 
 b/apps/codecs/libmad/dct32_arm.S                         |    3 
 b/apps/codecs/libmad/imdct_l_arm.S                       |    6 +
 b/apps/codecs/libmad/synth_full_arm.S                    |   12 ++-
 b/apps/codecs/libmusepack/synth_filter_arm.S             |    6 +
 b/apps/codecs/libspeex/filters_arm4.S                    |   18 ++++-
 b/apps/codecs/libtta/filter_arm.S                        |    6 +
 b/apps/codecs/libwavpack/arm.S                           |    3 
 b/apps/codecs/libwavpack/arml.S                          |    3 
 b/apps/dsp_arm.S                                         |   42 ++++++++-----
 b/apps/eq_arm.S                                          |    3 
 b/apps/plugins/mpegplayer/idct_arm.S                     |    9 +-
 b/apps/plugins/mpegplayer/motion_comp_arm_s.S            |   48 ++++++++++-----
 b/apps/plugins/pacbox/pacbox_arm.S                       |    3 
 b/apps/recorder/jpeg_idct_arm.S                          |   34 ++++++----
 b/firmware/target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S |    6 +
 b/firmware/target/arm/as3525/sansa-clip/lcd-as-clip.S    |    3 
 b/firmware/target/arm/ata-as-arm.S                       |   12 ++-
 b/firmware/target/arm/ipod/lcd-as-gray.S                 |   12 ++-
 b/firmware/target/arm/ipod/video/lcd-as-video.S          |    6 +
 b/firmware/target/arm/iriver/h10/lcd-as-h10.S            |    6 +
 b/firmware/target/arm/lcd-as-memframe.S                  |    9 +-
 b/firmware/target/arm/memcpy-arm.S                       |    3 
 b/firmware/target/arm/memmove-arm.S                      |    3 
 b/firmware/target/arm/memset-arm.S                       |    4 -
 b/firmware/target/arm/memset16-arm.S                     |    4 -
 b/firmware/target/arm/olympus/mrobe-100/lcd-as-mr100.S   |    3 
 b/firmware/target/arm/pbell/vibe500/lcd-as-vibe500.S     |    6 +
 b/firmware/target/arm/pcm-pp.c                           |    8 +-
 b/firmware/target/arm/philips/hdd1630/lcd-as-hdd1630.S   |    6 +
 b/firmware/target/arm/samsung/yh820/lcd-as-yh820.S       |    6 +
 b/firmware/target/arm/samsung/yh920/lcd-as-yh920.S       |    3 
 b/firmware/target/arm/samsung/yh925/lcd-as-yh925.S       |    6 +
 b/firmware/target/arm/sandisk/sansa-c200/lcd-as-c200.S   |    6 +
 b/firmware/target/arm/thread-arm.c                       |    5 -
 39 files changed, 226 insertions(+), 114 deletions(-)

Comment by Rafaël Carré (funman) - Saturday, 05 June 2010, 23:46 GMT+2
problem on PP is a problem with the linker, i think this patch could go in

i'll make some test_codec run to confirm it hasn't any noticeable impact
Comment by Rafaël Carré (funman) - Wednesday, 09 June 2010, 14:36 GMT+2
Results on fuzev1 built with eabi: last column is the % of time needed to decode with the patch, compared to without the patch

| *Nero AAC-HE* |||||
| 64kaache.m4a | 164.17% realtime | Decode time - 107.21s | 151.06MHz | 100.85%|
| *Cook (RA)* |||||
| cook_mono_64.ra | 1306.83% realtime | Decode time - 13.46s | 18.97MHz | 100.00%|
| cook_stereo_32.ra | 1417.40% realtime | Decode time - 12.41s | 17.49MHz | 100.00%|
| cook_stereo_64.ra | 694.15% realtime | Decode time - 25.34s | 35.72MHz | 99.97%|
| cook_stereo_96.ra | 678.36% realtime | Decode time - 25.93s | 36.55MHz | 100.00%|
| *MP3* |||||
| lame_096.mp3 | 833.53% realtime | Decode time - 21.11s | 29.75MHz | 100.23%|
| lame_128.mp3 | 637.30% realtime | Decode time - 27.61s | 38.91MHz | 100.26%|
| *Musepack* |||||
| mpc_096.mpc | 903.90% realtime | Decode time - 19.46s | 27.43MHz | 100.00%|
| mpc_128.mpc | 860.98% realtime | Decode time - 20.43s | 28.80MHz | 99.97%|
| *AAC-LC* |||||
| nero_096.m4a | 571.11% realtime | Decode time - 30.81s | 43.42MHz | - |
| nero_128.m4a | 550.21% realtime | Decode time - 31.98s | 45.07MHz | - |
| *Vorbis* |||||
| vorbis_096.ogg | 658.55% realtime | Decode time - 26.71s | 37.65MHz | - |
| *WMA Standard* |||||
| wma_128.wma | 652.33% realtime | Decode time - 27.21s | 38.01MHz | - |
| wma_96.wma | 659.60% realtime | Decode time - 26.91s | 37.59MHz | - |
Comment by Rafaël Carré (funman) - Friday, 11 June 2010, 06:29 GMT+2
Replace ldm/ldr which pop pc by ldrpc/ldmpc macros
   thumb-v4.diff (43.4 KiB)
 b/apps/codecs/demac/libdemac/predictor-arm.S             |    8 +++
 b/apps/codecs/lib/mdct_arm.S                             |    6 +-
 b/apps/codecs/libatrac/atrac3_arm.S                      |    6 +-
 b/apps/codecs/libffmpegFLAC/arm.S                        |    2 
 b/apps/codecs/libmad/dct32_arm.S                         |    2 
 b/apps/codecs/libmad/imdct_l_arm.S                       |    5 +-
 b/apps/codecs/libmad/synth_full_arm.S                    |    9 ++--
 b/apps/codecs/libmusepack/synth_filter_arm.S             |    6 +-
 b/apps/codecs/libspeex/filters_arm4.S                    |   10 ++--
 b/apps/codecs/libtta/filter_arm.S                        |    4 -
 b/apps/codecs/libwavpack/arm.S                           |    5 +-
 b/apps/codecs/libwavpack/arml.S                          |    4 +
 b/apps/dsp_arm.S                                         |   31 +++++++-------
 b/apps/eq_arm.S                                          |    2 
 b/apps/plugins/mpegplayer/idct_arm.S                     |    8 ++-
 b/apps/plugins/mpegplayer/motion_comp_arm_s.S            |   32 +++++++--------
 b/apps/plugins/pacbox/pacbox_arm.S                       |    3 -
 b/apps/recorder/jpeg_idct_arm.S                          |   24 +++++------
 b/firmware/export/config.h                               |   20 +++++++++
 b/firmware/target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S |    4 -
 b/firmware/target/arm/as3525/sansa-clip/lcd-as-clip.S    |    3 -
 b/firmware/target/arm/ata-as-arm.S                       |    8 +--
 b/firmware/target/arm/ipod/lcd-as-gray.S                 |    8 +--
 b/firmware/target/arm/ipod/video/lcd-as-video.S          |    6 +-
 b/firmware/target/arm/iriver/h10/lcd-as-h10.S            |    4 -
 b/firmware/target/arm/lcd-as-memframe.S                  |    6 +-
 b/firmware/target/arm/memcpy-arm.S                       |    2 
 b/firmware/target/arm/memmove-arm.S                      |    2 
 b/firmware/target/arm/memset-arm.S                       |    2 
 b/firmware/target/arm/memset16-arm.S                     |    2 
 b/firmware/target/arm/olympus/mrobe-100/lcd-as-mr100.S   |    2 
 b/firmware/target/arm/pbell/vibe500/lcd-as-vibe500.S     |    4 -
 b/firmware/target/arm/pcm-pp.c                           |   11 +++--
 b/firmware/target/arm/philips/hdd1630/lcd-as-hdd1630.S   |    4 -
 b/firmware/target/arm/samsung/yh820/lcd-as-yh820.S       |    4 -
 b/firmware/target/arm/samsung/yh920/lcd-as-yh920.S       |    2 
 b/firmware/target/arm/samsung/yh925/lcd-as-yh925.S       |    4 -
 b/firmware/target/arm/sandisk/sansa-c200/lcd-as-c200.S   |    4 -
 b/firmware/target/arm/thread-arm.c                       |   10 ++++
 39 files changed, 170 insertions(+), 109 deletions(-)

Loading...