2017-01-19 30 views
0

У меня есть следующие 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-разрядном файле сборки неонов. Я предпочитаю избегать внутренних.

+0

Смотрите мой ответ здесь: http://stackoverflow.com/questions/28050300/porting-arm-neon-code-to-aarch64-many-questions/ 28050834 # 28050834 На самом деле было бы неплохо использовать внутренности. Ваш код NEON не очень оптимизирован и будет переноситься как на ARM32, так и на ARM64, если вы используете встроенные средства. – BitBank

+0

Если вы настаиваете на написании языка ассемблера ARM64, вы можете увидеть мой проект github здесь для полного примера: https://github.com/bitbank2/gcc_perf – BitBank

+0

Даже с внутренними функциями существует слишком много изменений между неона-32bit и неона- 64-битная. – gregoiregentil

ответ

0

Весь код выглядит следующим образом:

.text 
.arch armv8-a 
.type extractY8ImageARM, STT_FUNC 
.global extractY8ImageARM 

extractY8ImageARM: 
from .req x0 
to .req x1 
left .req x2 
top .req x3 
width .req x4 
height .req x5 
stride .req x6 
tmp .req x9 

    add from, from, left 
    mul tmp, top, stride 
    add from, from, tmp 

.loopV: 
    mov tmp, width 

.loopH: 
    ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [from], #64 

    st1 {v0.16b, v1.16b, v2.16b, v3.16b}, [to], #64 

    subs tmp, tmp, #64 
    bgt .loopH 

    add from, from, stride 
    sub from, from, width 

    subs height, height, #1 
    bgt .loopV 

    ret 


.unreq from 
.unreq to 
.unreq left 
.unreq top 
.unreq width 
.unreq height 
.unreq stride 
.unreq tmp