x264 arm64汇编分析 quant8x8_neon分析

2024-04-02 16:04

本文主要是介绍x264 arm64汇编分析 quant8x8_neon分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 C语言实现

#define QUANT_ONE( coef, mf, f ) \

{ \

    if( (coef) > 0 ) \

        (coef) = (f + (coef)) * (mf) >> 16; \

    else \

        (coef) = - ((f - (coef)) * (mf) >> 16); \

    nz |= (coef); \

}

static int quant_8x8( dctcoef dct[64], udctcoef mf[64], udctcoef bias[64] )

{

    int nz = 0;

    for( int i = 0; i < 64; i++ )

        QUANT_ONE( dct[i], mf[i], bias[i] );

    return !!nz;

}

二 汇编实现

//quant_8x8(int16_t dct[64], uint16_t mf[64], uint16_t bias[64])

function quant_8x8_neon, export=1

     ld1 {v16.8h, v17.8h}, [x0] //从地址x0加载数据到neon寄存器v16和v17

     abs v18.8h, v16.8h //对v16中的数据进行绝对值操作,并将结果存储在v18中

     abs v19.8h, v17.8h //对v17中的数据进行绝对值操作,并将结果存储在v19中

     ld1 {v0.8h, v1.8h}, [x2], #32 //从地址x2加载数据到neon寄存v0和v1,并跳过

     ld1 {v2.8h, v3.8h}, [x1], #32 //从地址x1加载数据到neon寄存器v2和v3,并跳过

     QUANT_TWO v0.8h, v1.8h, v2, v3, v4.16b//调用自定义的QUANT_TWO函数进行量化处理

.rept 3

//重复以下操作3次

    ld1 {v16.8h, v17.8h}, [x0] //v16, v17 dct系数

    abs v18.8h, v16.8h //求绝对值

    abs v19.8h, v17.8h //求绝对值

    ld1 {v0.8h, v1.8h}, [x2], #32

    ld1 {v2.8h, v3.8h}, [x1], #32

    QUANT_TWO v0.8h, v1.8h, v2, v3, v5.16b//再次强调QUANT_TWO函数进行量化处理

//v0.8h, v1.8h 存储偏移 数据64bits

//v2.8h,v3.8h 存储mf 量化因子64bits

    orr v4.16b, v4.16b, v5.16b //将每次量化处理的结果进行或操作,并存储在x4中

.endr

    uqxtn  v0.8b, v4.8h //对v4进行位转换操作

    QUANT_END d0 //量化处理结束

endfunc

// QUANT_TWO   v0.8h,  v1.8h,  v2,  v3,  v4.16b

//QUANT_TWO   v0.8h,  v1.8h,  v2,  v3,  v5.16b

// v0 v1存储偏移数组, v2,v3 量化因子mask用来输出结果

.macro QUANT_TWO bias0 bias1 mf0_1 mf2_3 mask

   add v18.8h, v18.8h, bias0 //绝对值v18.8h 相加bias0

   add v19.8h, v19.8h, bias1 //绝对值v19.8h 相加bias1

   umull v20.4s, v18.4h, mf0_1().4h //这里的h表示 harfword, 4half word量化因子4存入 v20.4s s表示s word, 32bits ,这个也是一致

   umull2 v21.4s, v18.8h, mf0_1().8h //这里h表示harfword, 4half word, 量化因子4存入v21.4s ,v18.8h 64位4个系数 和这个乘以mf量化因子4halfword

//意思乘以之后存入v21.4s

   umull v22.4s, v19.4h, mf2_3().4h

/*mf2_3().4h 的含义是4个half word,  乘以 v19.4h 存入 v22.4s */

   umull2 v23.4s, v19.8h, mf2_3().8h

/*高4个halfword 和 系数相乘 存入 v23.4s 4个sword 32bits的数据中*/

   sshr v16.8h, v16.8h, #15

/*v16以8个16bits 为单位,向右移位15位*/

   sshr v17.8h, v17.8h, #15

/*v17也是这样操作,看起来是取符号位, 取的低64bits*/

   shrn v18.4h, v20.4s, #16

/*对寄存器 v20 进行右移操作,移动 16 位,结果的低 16 位存储在寄存器 v18 中。*/

   shrn2 v18.8h, v21.4s, #16

//上面两句话,一句话写了v18的低64bits,一句话写了高64bits,组合成一个完整的v18寄存器的值

/*对寄存器 v21 进行右移操作,移动 16 位,结果的低 16 位存储在寄存器 v18 中。*/

   shrn v19.4h, v22.4s, #16

/*对寄存器 v22 进行右移操作,移动 16 位,结果的低 16 位存储在寄存器 v19 中。*/

   shrn2 v19.8h, v23.4s, #16

/*对寄存器 v23 进行右移操作,移动 16 位,结果的低 16 位存储在寄存器 v19 中。*/

   eor v18.16b, v18.16b, v16.16b

/*对寄存器 v18 v16 进行异或操作,结果存储在寄存器 v18字节 */

   eor v19.16b, v19.16b, v17.16b

/*对寄存器 v19 v17 进行异或操作,结果存储在寄存器 v19 字节中*/

   sub v18.8h, v19.8h, v16.8h

/*v16.8h 和 v19.8h 寄存器,相减 存入 18.8h */

   sub 19.8h, v19.8h, v17.8h

/*v7.8h 和 v19.8h 寄存器,相减 存入 19.8h*/

   orr mask, v18.16b, v19.16b

/*对寄存器 v18 v19 进行或操作,结果存储在寄存器 mask */

   st1 {v18.8h, v19.8h}, [x0], #32

/*把最终的结果存入,x0的内存位置,dct 数组*/

.endm

这篇关于x264 arm64汇编分析 quant8x8_neon分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870425

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File