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

相关文章

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1