Чтобы действительно получить «самый быстрый» из возможных ARM-кодов ARM, вам необходимо протестировать различные подходы в вашей системе. Что касается цикла ldm / stm, этот мне кажется наиболее подходящим:
// Use non-conflicting register r12 to avoid waiting for r6 in pld
pld [r6, #0]
add r12, r6, #32
1:
ldm r6!, {r0, r1, r2, r3, r4, r5, r8, r9}
pld [r12, #32]
stm r10!, {r0, r1, r2, r3, r4, r5, r8, r9}
subs r11, r11, #16
ldm r6!, {r0, r1, r2, r3, r4, r5, r8, r9}
pld [r12, #64]
stm r10!, {r0, r1, r2, r3, r4, r5, r8, r9}
add r12, r6, #32
bne 1b
В вышеприведенном блоке предполагается, что вы уже настроили r6, r10, r11, и этот цикл ведет обратный отсчет на словах r11, а не байтах. Я проверил это на Cortex-A9 (iPad2), и, похоже, на этом процессоре он показывает неплохие результаты. Но будьте осторожны, потому что на Cortex-A8 (iPhone4) петля NEON кажется быстрее, чем ldm / stm, по крайней мере для больших копий.