当前位置: 首页 > news >正文

【ARMv8/ARMv9 硬件加速系列 2.2 -- ARM NEON 的加减乘除(左移右移)运算】

文章目录

    • NEON 加减乘除

NEON 加减乘除

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

func neon_calc_teststp	    x29, x30, [sp, #-0x10 * 1]!// addmov w0, #0x1111mov v0.s[0], w0mov v1.s[0], w0fadd v2.4s, v0.4s, v1.4s    // v2 = v0 + v1// submov w0, #0x2222mov v0.s[0], w0mov w0, #0x1111mov v1.s[0], w0fsub v3.4s, v0.4s, v1.4s    // v3 = v0 - v1// multimov w0, #0xfmov v0.s[0], w0mov w0, #0x11mov v1.s[0], w0mul v4.4s, v0.4s, v1.4s    // v4 = v0 * v1// left shiftmovi v0.4s, #0xffshl v5.4s, v0.4s, #1        // v5 = v2 << 1 (每个元素左移1)// right shiftmovi v0.4s, #0xffsrshr v6.4s, v0.4s, #1        // v6 = v3 >> 1 (每个元素右移1)mov x0, xzrldr x0, =0xb0000000st1 {v2.4s}, [x0], #16    // 发送v2到内存,并将x0增加16st1 {v3.4s}, [x0], #16    // 发送v3到内存,并将x0增加16st1 {v4.4s}, [x0], #16    // 发送v4到内存,并将x0增加16st1 {v5.4s}, [x0], #16    // 发送v5到内存,并将x0增加16st1 {v6.4s}, [x0]         // 发送v6到内存ldp x29, x30, [sp], #0x10ret
endfunc neon_calc_test
  • 首先,我们使用fadd, fsub, 和 mul指令对浮点数进行加、减、乘操作,结果分别存储在v2, v3, 和 v4中。
  • 然后,使用shlsrshr指令对整数进行左移和右移操作,结果存储在v5v6中。
  • 最后,我们使用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

相关文章:

  • 新手教学系列——“笑看”单元测试(pytest)
  • 【人工智能】—XGBoost算法在构建互联网防火墙异常行为识别模型应用案例
  • AcWing 1801:蹄子剪刀布 ← 模拟题
  • 「51媒体」活动会议,展览展会,直播曝光的一种方法
  • Eclipse 工作空间:深入解析与高效使用
  • rk3568 Android 11在系统怎样执行命令获取SN号
  • C语言入门系列:特殊的main函数和exit函数
  • pandas plot函数:数据可视化的快捷通道
  • 【java】写一个发送邮箱的样例
  • 点击旋转箭头样式
  • Java宝藏实验资源库(2)字节流
  • ios CCLanguage.m
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS Huawei (华为) FusionServer 定制版
  • 3D开发工具HOOPS为BIM应用提供支持:复杂大模型实现Web端轻量化!
  • 【Android面试八股文】Kotlin内置标准函数also的原理是什么?
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS 7 防火墙操作
  • Java面向对象及其三大特征
  • Redis字符串类型内部编码剖析
  • Spring Cloud中负载均衡器概览
  • 工作手记之html2canvas使用概述
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 算法-图和图算法
  • 详解NodeJs流之一
  • No resource identifier found for attribute,RxJava之zip操作符
  • Linux权限管理(week1_day5)--技术流ken
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (06)Hive——正则表达式
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (八十八)VFL语言初步 - 实现布局
  • (转)程序员技术练级攻略
  • *2 echo、printf、mkdir命令的应用
  • ../depcomp: line 571: exec: g++: not found
  • .Family_物联网
  • .form文件_SSM框架文件上传篇
  • .Net CF下精确的计时器
  • .Net MVC + EF搭建学生管理系统
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net实现SCrypt Hash加密
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @html.ActionLink的几种参数格式
  • [51nod1610]路径计数
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • [COI2007] Sabor
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [Java安全入门]三.CC1链
  • [MongoDB]------windos下的安装部署与基础使用
  • [MySQL]日期和时间函数
  • [Python3网络爬虫开发实战] 5.3-非关系型数据库存储
  • [RISC-V]verilog