Я нуждается макросов с большим количеством регистров, связанных, например:Экспрессия в GCC ARM сборки макросъемки
.macro load128bytes
vld1.8 {d0, d1, d2, d3}, [r0]!
vld1.8 {d4, d5, d6, d7}, [r0]!
vld1.8 {d8, d9, d10, d11}, [r0]!
vld1.8 {d12, d13, d14, d15}, [r0]!
.endm
Как вы можете видеть, регистры являются последовательными. Тем не менее, я хочу передать номер стартового регистра в качестве аргумента, как:
.macro load128bytes srn
vld1.8 {d\srn, d\srn+1, d\srn+2, d\srn+3}, [r0]!
vld1.8 {d\srn+4, d\srn+5, d\srn+6, d\srn+7}, [r0]!
vld1.8 {d\srn+8, d\srn+9, d\srn+10, d\srn+11}, [r0]!
vld1.8 {d\srn+12, d\srn+13, d\srn+14, d\srn+15}, [r0]!
.endm
И, конечно же, выше, не работает. Ассемблер интерпретирует их как: d0, d0 + 1, d0 + 2, d0 + 3 вместо d0, d1, d2, d3, что я им намереваюсь, когда srn равно 0.
Я искал в Интернете и нашел пример, который мог бы решить эту проблему:
.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm
Хотя приведенный выше пример работает нормально, это не помогло решить мои проблемы:
.macro test srn0
vld1.8 {d"(\srn0)", d"(\srn0+1)"}, [r0]
.endm
здания выше, приводит к сообщению об ошибке: Neon двойной или четверной точности регистр ожидается - `vld1.8 {d" 0 ", d" 0 + 1 "}, [r0] '
Любые идеи? Очень сложно каждый раз переходить до шестнадцати регистров, и, что еще хуже, это делает мой код подверженным ошибкам.
Заранее спасибо.
Работает как очарование! Большое спасибо. BTW, я в настоящее время работаю над большим проектом с открытым исходным кодом, состоящим из простых ручных программ сборок NEON и электронной книги по оптимизации ARM. Я сообщу вам, как только они закончатся. И, конечно же, вы получите бесплатную «копию» этой электронной книги. :) –