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

embedded/2024/10/18 19:29:13/

文章目录

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

http://www.ppmy.cn/embedded/51047.html

相关文章

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…

【DevOps】Kibana:数据可视化与探索的强大工具

目录 1、Kibana的基本概念 1.1 Elasticsearch集成 1.2 可视化类型 1.3 仪表板 2、 Kibana的主要功能 2.1 数据探索 2.2 可视化分析 2.3 仪表板管理 2.4 日志分析 2.5 监控与警报 3、 Kibana的使用场景 3.1 应用性能监控&#xff08;APM&#xff09; 3.2 安全信…

C++面向对象程序设计 - 函数库

C语言程序中各种功能基本上都是由函数来实现的&#xff0c;在C语言的发展过程中建立了功能丰富的函数库&#xff0c;C从C语言继承了些函数功能。如果要用函数库中的函数&#xff0c;就必须在程序文件中包含文件中有关的头文件&#xff0c;在不同的头文件中&#xff0c;包含了不…

18V-180V降5V500mA恒压WT5118

18V-180V降5V500mA恒压WT5118 如何实现18V-180V宽电压输入下的恒压5V 500mA输出。输入电压是波动的18V还是高达180V,WT5118都能确保输出端提供稳定的5V电压和500mA的电流。 WT5118 是一款集成了 180V 高电压 MOSFET 的 DC-DC 控制器&#xff0c;专为开关电源设计。该设备具备内…

【学习笔记】CSS

CSS 1、 基础篇 1.1、选择器 1.2、长度单位 1.3、CSS2 常用属性 1.4、盒模型 1.5、浮动 1.6、定位 position2、 CSS3 2.1、新增长度单位 2.2、新增颜色表示 2.3、新增选择器 2.4、新增盒子属性 2.5、新增背景属性 …

在敏捷项目管理中实施 Scrum 方法

在本文中&#xff0c;我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件&#xff0c;详细探索端到端 Scrum 流程。在本文结束时&#xff0c;您将清楚地了解 Scrum 的工作原…

专访毫末智行COO 侯军:自动驾驶,水深鱼才大

站在当下&#xff0c;回看自动驾驶赛道的各个玩家们&#xff0c;活下去的要不就是“家里有矿”&#xff0c;要不就是场景、技术降维&#xff0c;渐进式发展。但活的好的有一个共性&#xff0c;就是顺应需求&#xff0c;让技术落于产业实处。 作者|斗斗 出品|产业家 “我们认…

生产实习Day10 ---- SparkSQL介绍

文章目录 Spark SQL&#xff1a;大数据处理的新境界什么是Spark SQL&#xff1f;主要特点 DataFrame和DataSetSpark SQL的基本使用使用案例 Spark SQL函数自定义函数 窗口函数结论 Spark SQL&#xff1a;大数据处理的新境界 在大数据时代&#xff0c;高效处理和分析海量数据的…