码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【ARMv8/ARMv9 硬件加速系列 2.2 -- ARM NEON 的加减乘除(左移右移)运算】


    文章目录

      • NEON 加减乘除

    NEON 加减乘除

    下面代码是使用ARMv8汇编语言对向量寄存器v0-v31执行加、减、乘以及左移和右移操作的示例。
    ARMv8的SIMD指令集允许对向量寄存器中的多个数据进行并行操作。v0和v1加载数据,对它们进行加、减和乘,左移和右移操作。最后,我们会将结果存储到内存地址0xb0000000处, 方便观察结果。

    func neon_calc_test
        stp	    x29, x30, [sp, #-0x10 * 1]!
    
        // add
        mov w0, #0x1111
        mov v0.s[0], w0
        mov v1.s[0], w0
        fadd v2.4s, v0.4s, v1.4s    // v2 = v0 + v1
    
        // sub
        mov w0, #0x2222
        mov v0.s[0], w0
        mov w0, #0x1111
        mov v1.s[0], w0
        fsub v3.4s, v0.4s, v1.4s    // v3 = v0 - v1
    
        // multi
        mov w0, #0xf
        mov v0.s[0], w0
        mov w0, #0x11
        mov v1.s[0], w0
        mul v4.4s, v0.4s, v1.4s    // v4 = v0 * v1
    
        // left shift
        movi v0.4s, #0xff
        shl v5.4s, v0.4s, #1        // v5 = v2 << 1 (每个元素左移1位)
    
        // right shift
        movi v0.4s, #0xff
        srshr v6.4s, v0.4s, #1        // v6 = v3 >> 1 (每个元素右移1位)
    
        mov x0, xzr
        ldr x0, =0xb0000000
        st1 {v2.4s}, [x0], #16    // 发送v2到内存,并将x0增加16
        st1 {v3.4s}, [x0], #16    // 发送v3到内存,并将x0增加16
        st1 {v4.4s}, [x0], #16    // 发送v4到内存,并将x0增加16
        st1 {v5.4s}, [x0], #16    // 发送v5到内存,并将x0增加16
        st1 {v6.4s}, [x0]         // 发送v6到内存
        ldp x29, x30, [sp], #0x10
        ret
    endfunc neon_calc_test
    
    • 首先,我们使用fadd, fsub, 和 mul指令对浮点数进行加、减、乘操作,结果分别存储在v2, v3, 和 v4中。
    • 然后,使用shl和srshr指令对整数进行左移和右移操作,结果存储在v5和v6中。
    • 最后,我们使用st1指令将结果依次写入到内存地址0x87000000处。

    请注意,st1指令使用了后置更新地址的写法,每次存储后都会更新x0寄存器的值,为下一次存储准备。

    测试结果:

    msh >dump 0xb0000000 20
    0xb0000000: 0x00002222 0x00000000 0x00000000 0x00000000
    0xb0000010: 0x00001111 0x00000000 0x00000000 0x00000000
    0xb0000020: 0x000000ff 0x00000000 0x00000000 0x00000000
    0xb0000030: 0x000001fe 0x000001fe 0x000001fe 0x000001fe
    0xb0000040: 0x00000080 0x00000080 0x00000080 0x00000080
    
  • 相关阅读:
    九旬老人因“高压”头疼眼胀,成都爱尔联合手术减压摘障解危机
    研发效能|DevOps 已死平台工程永存带来的焦虑
    FFmpeg编译hevc版本,支持mac、linux系统
    最好用的Python库推荐总结,每一个都用处很大!
    OceanBase荣获OSCAR两项大奖,开源已成主流开发模式
    分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
    设计模式-享元模式、享元模式示例
    合成数据的好处和用途
    Redis夺命十二问,你能扛到第几问?
    荧光EEM平滑教程(去除散射)
  • 原文地址:https://blog.csdn.net/sinat_32960911/article/details/139782763
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号