neon的常見彙編命令

2021-08-10 09:35:20 字數 2576 閱讀 5678

push      儲存r4-r9暫存器的內容

.arm

.text

.global cost_init

cost_init:

push

vdup.8

q0,r0

@uvdup.8

q1,r1

@u0vdup.8

q2,r2

@u1vdup.16

q12,r3

@(-1)*diff_scale

ldrr12,[sp,#16]

@vldr

r4,[sp,#20]

@v0ldr

r5,[sp,#24]

@v1ldr

r6,[sp,#28]

@c0ldr

r7,[sp,#32]

@c1lsr

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

,[r12]!

@vvld1.8

,[r4]!

@v0vld1.8

,[r5]!

@v1vqsub.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

,[r6]

vqadd.s16

q10,q10,q3

vst1.16

,[r6]!

vld1.16

,[r6]

vqadd.s16

q11,q11,q3

vst1.16

,[r6]!

subs

r7,r7,#1

bne.loop

pop          

bx            lr

.end

vdup.8q0,r0        @u   從r0裡面取出第乙個引數(u)放到q0暫存器

vld1.8,[r1]!     @v   從r1裡面取出第二個引數(v)放到q1暫存器

vabd.s8q2,q0,q1  @abs(u-v)   求 | u-v |,值存放到暫存器 q2

vld3.8      , [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      , [r0]!         @將d6內的值(乙個位元組)儲存到位址r0開始的地方,並將r0的位址加1

subs        r2, r2, #1          @將r2的值減1後再賦給r2,如果結果為0,就改變狀態位,那麼跳轉的時候就可以根據這個狀態值來做出是否跳轉的決定

bne   loop   @如果上面的結果為0,那麼ne的結果就為假,程式就不跳轉到loop,也就是跳出迴圈

push              @將r4,r5,lr進棧儲存起來

pop               @恢復之前儲存的暫存器r4,r5,程式跳轉到下一條指令執行。

vld1.8,[r1]!        從r1裡面取出8個值存在d0,然後再取8個放在d1,然後再取8個放在d2,這叫做線性儲存

vld3.8      , [r1]!   從r1取3個位元組分別放到d0,d1,d2,接著再取3個位元組放到d0,d1,d2,如此反覆下去,這叫結構性儲存,多見於rgb

neon的常用指令

neon支援的主要操作 助記符 含義 add 加法 sub 減法 mul 乘法 mla 乘加 mls 乘減 ceq 比較 cge 比較 cle 比較 cgt 比較 clt 比較 max 最大值 min 最小值 shl 左移位 shr 右移位 abs 求絕對值 neg 取反 mvn 按位取反 and ...

氖 neon 的指令摘抄

參考位址 字母意思 add加法 mul乘法 sub減法 mla乘加 mls乘減 ceq比較,類似 cge比較,類似 cle比較,類似 cgt比較,類似 clt比較,類似 tst與運算,判斷是否等於0,ri ai bi 0 1.1 0.0 abd向量相減後絕對值,vabd ri ai bi max最大...

漢明距離的NEON版本

chromium中的libyuv。256 bits at a time uses short accumulator which restricts count to 131 kb uint32 t hammingdistance neon const uint8 t src a,const uin...