Intra帧内预测
1.16x16水平预测
function predict_16x16_h_neon
sub r1, r0, #1 //寄存器r1=r0-1,即对应宏块最左侧紧挨的宏块的内存的值,
mov ip, #FDEC_STRIDE //寄存器ip保存立即数FDEC_STRIDE
.rept 8 //循环8次,每次赋值2行
vld1.8 {d0[]}, [r1], ip //取r1的值,赋值到d0寄存器,, r1+=FDEC_STRIDE
vmov d1, d0 //复制d0的值到d1,此时完成
vld1.8 {d2[]}, [r1], ip //同上,给d2寄存器赋值, r1+=FDEC_STRIDE
vmov d3, d2 //同上,以上就给d3赋值,
//这样d0,d1,d2,d3就都保存了两行宏块最左侧紧挨的宏块对应格子的值
vst1.64 {d0-d1}, [r0,:128], ip //d0-d1线性赋值到r0,r0+=FDEC_STRIDE,第一行完成16x8的赋值
vst1.64 {d2-d3}, [r0,:128], ip //d2-d3线性赋值到r0,r0+=FDEC_STRIDE ,第二行完成16x8的赋值
.endr //循环结束
bx lr //return
endfunc
2.16x16垂直预测
function predict_16x16_v_neon
sub r0, r0, #FDEC_STRIDE //寄存器r1=r0-FDEC_STRIDE ,即宏块上面一行紧挨的宏块的一行的值,
mov ip, #FDEC_STRIDE
vld1.64 {d0-d1}, [r0,:128], ip //d0-d1寄存器初始化宏块上方一行的值
.rept 16 //循环16次(行)
vst1.64 {d0-d1}, [r0,:128], ip //d0-d1的值赋值到r0开始区域(16x8)线性赋值
.endr
bx lr //return
endfunc
网友评论