//预取pld , load做8次, 但是实际pld的使用不应该如此频繁,因为文档里说pld的作用是从内存里提前预取数据,提前多久呢,in the near future(如此隐晦又美好)
//每次的vld1.8 {d16}, [r2], r3 代表从r2寄存器(里面是src),load出8个8位的数到d16里,然后r2寻址到r2+r3 (r3 is srcstride)
.macro loadin8
pld [r2]
vld1.8 {d16}, [r2], r3
pld [r2]
vld1.8 {d17}, [r2], r3
pld [r2]
vld1.8 {d18}, [r2], r3
pld [r2]
vld1.8 {d19}, [r2], r3
pld [r2]
vld1.8 {d20}, [r2], r3
pld [r2]
vld1.8 {d21}, [r2], r3
pld [r2]
vld1.8 {d22}, [r2], r3
pld [r2]
vld1.8 {d23}, [r2], r3
.endm
//水平差值,vext指令是个很鸡贼的指令
.macro vextin8
pld [r2]
vld1.8 {q11}, [r2], r3
vext.8 d16, d22, d23, #1
vext.8 d17, d22, d23, #2
vext.8 d18, d22, d23, #3
vext.8 d19, d22, d23, #4
vext.8 d20, d22, d23, #5
vext.8 d21, d22, d23, #6
vext.8 d22, d22, d23, #7
.endm
具体到像素,就是左边的像素在d22的低位
注意;第一个0每次的vext都取不到,所以,sub r2, #4 (亮度插值的范围是从当前正像素开始的 -3到4)
d16 d17 d18 d19 d20 d21 d22 d23里面对应存了插值所用的整像素。
.macro hevc_put_qpel_uw_vX_neon_8 filter
push {r4-r10} //寄存器入栈,等着被用
ldr r5, [sp, #28] // width 传入参数的顺序决定了每个变量的偏移量
ldr r4, [sp, #32] // height
ldr r8, [sp, #36] // src2
ldr r9, [sp, #40] // src2stride
vpush {d8-d15}
sub r2, r2, r3, lsl #1
sub r2, r3 // r2 move up 3 lines to ensure the result of first MC result.
mov r12, r4
mov r6, r0
mov r7, r2
cmp r8, #0 //看看src2是不是0来判断是不是bi模式预测
bne .Lbi\@
0: loadin8 //load进来8个8bit像素到d16-d
cmp r5, #4
beq 4f
8: subs r4, #1 // height-1
\filter // filtering and store the result in q7
vqrshrun.s16 d0, q7, #6 // when bitdepth = 8,a shift=6 process need to be applied to the filtered target.
vst1.8 d0, [r0], r1 // store d0 to r0 with r1 stride (r0->dst)
regshuffle_d8 // ==shuffle d16-d23. ???==相当于处理完当前像素后,处理下一个像素前,倒腾下寄存器,为下一个像素的插值滤波做准备
vld1.8 {d23}, [r2], r3 // load r2的下一个
bne 8b // 处理了前8列的插值
subs r5, #8 // 处理后8列
beq 99f // 如果为0代表已经处理完毕,结束。否则重新初始化 r4:height; r6:由src的地址跳8,r0重新指向没有处理的新位置 ;
// r7指向 向上偏移3行 再向右偏移8个像素位置
mov r4, r12
add r6, #8
mov r0, r6
add r7, #8
mov r2, r7
b 0b
4: subs r4, #1
\filter
vqrshrun.s16 d0, q7, #6
vst1.32 d0[0], [r0], r1 //如果还剩4列,则之用D寄存器的低地址,
regshuffle_d8
vld1.32 {d23[0]}, [r2], r3
bne 4b
b 99f
.Lbi\@: lsl r9, #1
mov r10, r8
0: loadin8
cmp r5, #4
beq 4f
8: subs r4, #1
\filter
vld1.16 {q0}, [r8], r9
vqadd.s16 q0, q7
vqrshrun.s16 d0, q0, #7
vst1.8 d0, [r0], r1
regshuffle_d8
vld1.8 {d23}, [r2], r3
bne 8b
subs r5, #8
beq 99f
mov r4, r12
add r6, #8
mov r0, r6
add r10, #16
mov r8, r10
add r7, #8
mov r2, r7
b 0b
4: subs r4, #1
\filter
vld1.16 d0, [r8], r9
vqadd.s16 d0, d14
vqrshrun.s16 d0, q0, #7
vst1.32 d0[0], [r0], r1
regshuffle_d8
vld1.32 {d23[0]}, [r2], r3
bne 4b
99: vpop {d8-d15}
pop {r4-r10}
bx lr
.endm