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

文章目录

NEON 加减乘除

下面代码是使用ARMv8汇编语言对向量寄存器v0-v31执行加、减、乘以及左移和右移操作的示例。
ARMv8的SIMD指令集允许对向量寄存器中的多个数据进行并行操作。v0v1加载数据,对它们进行加、减和乘,左移和右移操作。最后,我们会将结果存储到内存地址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中。
  • 然后,使用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
  • 28
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
armv8armv9是英国ARM公司推出的两个处理器架构,用于移动设备、嵌入式设备和服务器等领域。在这两个架构中,异常中断和GIC (Generic Interrupt Controller) 是非常重要的主题。 异常中断是指当系统发生某种事件时,处理器暂停当前任务,转而处理优先级较高的任务。异常中断包括两种类型:同步异常和中断异常。同步异常是由指令执行时产生的,如除零异常、非法指令异常等。中断异常是由外部事件触发的,如定时器中断、外设中断等。 在armv8armv9架构中,异常的处理是通过异常向量表实现的。异常向量表是一个固定大小的表格,其中包含不同类型异常的处理函数的地址。当发生异常时,处理器会根据异常类型在异常向量表中查找相应的处理函数,并跳转到该函数执行异常处理。 GIC是一个用于处理中断的控制器,它负责管理和分发中断信号给相应的处理器核心。在多核处理器中,GIC可以实现中断的负载均衡和处理器间的中断共享。GIC具有多个中断输入通道,每个通道对应一个中断引脚。当外部设备发生中断时,通过相应的中断引脚将中断信号发送给GIC,然后GIC将中断信号分发给对应的处理器核心。 armv8armv9架构中的GIC支持多种中断处理模式,包括中断屏蔽、中断优先级配置和中断传递方式等。GIC还可以实现中断的共享和抢占,以提高中断的处理效率和可靠性。 总而言之,armv8armv9架构中的异常中断和GIC是处理器架构中非常重要的专题。通过学习异常中断的处理和GIC的功能,可以更好地理解和掌握armv8armv9架构的中断处理机制,提高系统的可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值