Так это для руки? (Iphone?). Каков размер этих указателей (байтов, полуслов, слов и т. Д.?), Возникают ли у вас проблемы с выравниванием (копирование слов на несловесной границе)? Если это байты, то да, сгенерированный код, вероятно, мучительно медленный, оптимизатор не может сделать с ним слишком много. Где это тебя оставляет? Вы получаете то, что вы получаете.
Вот пример:
mov ip, #0
.L3:
ldrb r3, [r0, ip] @ zero_extendqisi2
ldrb r2, [r1, ip] @ zero_extendqisi2
add r3, r3, r2
strb r3, [r1, ip]
add ip, ip, #1
cmp ip, r4
bne .L3
Поскольку в вашем коде подсчитывались указатели, компилятор добавил инструкцию, которая ему не нужна.
sub ip, rx, #1
.L3:
ldrb r3, [r0, ip] @ zero_extendqisi2
ldrb r2, [r1, ip] @ zero_extendqisi2
add r3, r3, r2
strb r3, [r1, ip]
subs ip, ip, #1
bne .L3
Поскольку бит переноса не используется, мне интересно, есть ли способ загрузить слово и выполнить сложение по словам, выполняя по одному слову за раз.
load 0xnnmmoopp
load oxqqrrsstt
замаскируйте один из них, чтобы гарантировать отсутствие проблем с переносом
0xnnmmoopp -> 0xn0mmo0pp
добавить
0xgghhiikk = 0xn0mmo0pp + 0xqqrrsstt
затем сохраните hh и kk как байты
Вы должны вернуться к исходному повреждению байтов mm и pp, заново выполнить добавление и сохранить байты gg и ii.
Чтение двух слов должно быть значительно быстрее, чем чтение четырех байтов, если вы сохраняете все вышеперечисленное в регистрах и делаете хранилище слов вместо четырехбайтовых хранилищ, что сэкономит немного больше времени.
Вам нужно будет сохранить много регистров в стек, так что это будет стоить вам, поэтому вы не хотите делать это для небольших значений (скажем, меньше 10).
Во всяком случае, есть о чем подумать. Просто удаление одной строки кода в приведенном выше ассмблере должно быть заметно для длительных прогонов.
EDIT:
На самом деле та модификация, которую я сделал для вывода компилятора, была нарушена. Это больше похоже на это:
mov ip, ra
.L3:
subs ip, ip, #1
ldrb r3, [r0, ip]
ldrb r2, [r1, ip]
add r3, r3, r2
strb r3, [r1, ip]
bne .L3