neon 的常見彙編指令與程式碼對照【基礎備忘】
阿新 • • 發佈:2018-12-25
作者:歌神flaming
來源:CSDN
原文:https://blog.csdn.net/u010684585/article/details/78455993
.arm .text .global cost_init cost_init: push {r4-r7} vdup.8 q0,r0 @u vdup.8 q1,r1 @u0 vdup.8 q2,r2 @u1 vdup.16 q12,r3 @(-1)*diff_scale ldr r12,[sp,#16]@v ldr r4,[sp,#20]@v0 ldr r5,[sp,#24]@v1 ldr r6,[sp,#28]@c0 ldr r7,[sp,#32]@c1 lsr r7,r7,#4 @ int v = prow2[width - x - 1 + d]; @ int v0 = buffer[width - x - 1 + d]; @ int v1 = buffer[width - x - 1 + d + width2]; @ int c0 = std::max(0, u - v1); c0 = std::max(c0, v0 - u); @ int c1 = std::max(0, v - u1); c1 = std::max(c1, u0 - v); @ cost[x*D + d] = (CostType)(cost[x*D + d] + (std::min(c0, c1) >> diff_scale)); .loop: vld1.8 {q3},[r12]! @v vld1.8 {q8},[r4]! @v0 vld1.8 {q9},[r5]! @v1 vqsub.s8 q9,q0,q9 @q9 = q0 - q9 = u-v1 vqsub.s8 q8,q8,q0 @q8 = q8 - q0 = v0-u vmax.s8 q8,q8,q9 @c0=max(u-v1,v0-u) vqsub.s8 q10,q3,q2 @v-u1 vqsub.s8 q11,q1,q3 @u0-v vmax.s8 q10,q10,q11 @c1=max(v-u1,u0-v) vmin.s8 q3,q8,q10 @min(c0,c1) vmovl.s8 q10,d6 vmovl.s8 q11,d7 vshl.s16 q10,q10,q12 vshl.s16 q11,q11,q12 vld1.16 {q3},[r6] vqadd.s16 q10,q10,q3 vst1.16 {q10},[r6]! vld1.16 {q3},[r6] vqadd.s16 q11,q11,q3 vst1.16 {q11},[r6]! subs r7,r7,#1 bne .loop pop {r4-r7} bx lr .end
=====================================================================
push {r4-r7} @儲存r4-r7暫存器的內容 vdup.8 q0,r0 @u 從r0裡面取出第一個引數(u)放到q0暫存器 vld1.8 {q1},[r1]! @v 從r1裡面取出第二個引數(v)放到q1暫存器 vabd.s8 q2,q0,q1 @abs(u-v) 求 | u-v |,值存放到暫存器 q2 vld3.8 {d0-d2}, [r1]! @從r1開始載入3個位元組到d1,d2,d3 vmull.u8 q3, d0, d3 @將d0內的值和d3內的值相乘後儲存在q3裡 vmlal.u8 q3, d2, d5 @將d2內的值和d5內的值相乘的結果累加到q3內的值 vshrn.u16 d6, q3, #8 @將q3除以256後值儲存在d6裡 vst1.8 {d6}, [r0]! @將d6內的值(一個位元組)儲存到地址r0開始的地方,並將r0的地址加1 subs r2, r2, #1 @將r2的值減1後再賦給r2,如果結果為0,就改變狀態位,那麼跳轉的時候就可以根據這個狀態值來做出是否跳轉的決定 bne loop @如果上面的結果為0,那麼ne的結果就為假,程式就不跳轉到loop,也就是跳出迴圈 push {r4-r5,lr} @將r4,r5,lr進棧儲存起來 pop { r4-r5, pc } @恢復之前儲存的暫存器r4,r5,程式跳轉到下一條指令執行。 vld1.8 {d0,d1,d2},[r1]! @從r1裡面取出8個值存在d0,然後再取8個放在d1,然後再取8個放在d2,這叫做線性儲存 vld3.8 {d0,d1,d2}, [r1]! @從r1取3個位元組分別放到d0,d1,d2,接著再取3個位元組放到d0,d1,d2,如此反覆下去,這叫結構性儲存,多見於rgb