У меня есть следующие 32-битный неон код, который просто извлекает изображение:Преобразовать ARM 32-разрядный неон для ARM 64-разрядный неон
extractY8ImageARM(unsigned char *from, unsigned char *to, int left, int top, int width, int height, int stride)
from: pointer to the original image
to: pointer to the destination extracted image
left, top: position where to extract in the original image
width, height: size of the extracted image
stride: width of the original image
и здесь есть код сборки:
.text
.arch armv7-a
.fpu neon
.type extractY8ImageARM, STT_FUNC
.global extractY8ImageARM
extractY8ImageARM:
from .req r0
to .req r1
left .req r2
top .req r3
width .req r4
height .req r5
stride .req r6
tmp .req r7
push {r0-r7, lr}
//Let's get back the arguments
ldr width, [sp, #(9 * 4)]
ldr height, [sp, #(10 * 4)]
ldr stride, [sp, #(11 * 4)]
//Update the from pointer. Advance left + stride * top
add from, from, left
mul tmp, top, stride
add from, from, tmp
.loopV:
//We will copy width
mov tmp, width
.loopH:
//Read and store data
pld [from]
vld1.u8 { d0, d1, d2, d3 }, [from]!
pld [to]
vst1.u8 { d0, d1, d2, d3 }, [to]!
subs tmp, tmp, #32
bgt .loopH
//We advance the from pointer for the next line
add from, from, stride
sub from, from, width
subs height, height, #1
bgt .loopV
pop {r0-r7, pc}
.unreq from
.unreq to
.unreq left
.unreq top
.unreq width
.unreq height
.unreq stride
.unreq tmp
Мне нужно перенести его на 64-битный неон. может ли кто-нибудь помочь мне сделать перевод? Я прочитал этот белый документ http://malideveloper.arm.com/downloads/Porting%20to%20ARM%2064-bit.pdf, поэтому я понимаю более или менее различия.
Мой код прост, и это будет хороший пример того, как передавать аргументы и загружать/хранить данные в 64-разрядном файле сборки неонов. Я предпочитаю избегать внутренних.
Смотрите мой ответ здесь: http://stackoverflow.com/questions/28050300/porting-arm-neon-code-to-aarch64-many-questions/ 28050834 # 28050834 На самом деле было бы неплохо использовать внутренности. Ваш код NEON не очень оптимизирован и будет переноситься как на ARM32, так и на ARM64, если вы используете встроенные средства. – BitBank
Если вы настаиваете на написании языка ассемблера ARM64, вы можете увидеть мой проект github здесь для полного примера: https://github.com/bitbank2/gcc_perf – BitBank
Даже с внутренними функциями существует слишком много изменений между неона-32bit и неона- 64-битная. – gregoiregentil