湖南seo网站策划广东省自然资源厅地址电话
湖南seo网站策划,广东省自然资源厅地址电话,做一个网站完整的网页,西安营销网站建设文章目录 ARM64 BFI 使用介绍BFI 使用示例memset 对 BFI 的使用 上篇文章#xff1a;ARM64 常见汇编指令学习 16 – ARM64 SMC 指令 ARM64 BFI 使用介绍
ARM64架构的 BFI#xff08;Bit Field Insert#xff09;指令用于将一个寄存器中的位字段插入到另一个寄存器中的指定位… 文章目录 ARM64 BFI 使用介绍BFI 使用示例memset 对 BFI 的使用 上篇文章ARM64 常见汇编指令学习 16 – ARM64 SMC 指令 ARM64 BFI 使用介绍
ARM64架构的 BFIBit Field Insert指令用于将一个寄存器中的位字段插入到另一个寄存器中的指定位置。这个指令对于位操作很有用。
BFI指令的格式如下 BFI 目标寄存器源寄存器lsb宽度
目标寄存器将被插入位字段的寄存器。源寄存器包含要插入的位字段的寄存器。lsb在目标寄存器中插入位字段的最低位的位置。宽度要插入的位字段的宽度。
例如考虑以下BFI指令
BFI x0, x1, #4, #8这个指令将x1寄存器的最低8位插入到x0的第4位到第11位包括第4位和第11位。其他位置的位不改变。 在BFI指令中源寄存器的位字段始终是从最低位开始的。如果你想从源寄存器的中间位置开始插入你需要先通过其他指令如LSL或LSR将源寄存器的位移动到最低位。 BFI 使用示例
mov w0, 0x5678
mov w1, 0x1234
bfi w0, w1, 16, 16w0 的值为 0x12345678
memset 对 BFI 的使用
通常我们都会使用类似于下面的memset函数
static void emmc_memset(uint8_t *buff, uint8_t data, uint32_t cnt)从接口可以看到对某一块内存按照字节进行填充我们知道ARM64 寄存器的位宽为64bits 所以为了提高效率ARM 使用BFI指令对memset 进行了优化下面截取 memset 汇编实现的关于 BFI指令使用的代码。
lib/libc/aarch64/memset.S /* 8-bytes aligned */
aligned:cbz x1, x1_zerobfi w1, w1, #8, #8 /* propagate val */bfi w1, w1, #16, #16bfi x1, x1, #32, #32x1_zero:ands x4, x2, #~0x3fb.eq less_64下面对汇编代码解析 cbz x1, x1_zero这是一个条件分支指令如果x1寄存器的值为0就跳转到标签x1_zero处执行。否则就继续执行下面的指令。 bfi w1, w1, #8, #8这是一个位字段插入指令它将w1寄存器的最低8位插入到w1的第8位到第15位。这样w1的最低16位就都设置为了相同的值。 bfi w1, w1, #16, #16类似地这个指令将w1的最低16位插入到w1的第16位到第31位。这样w1的32位就都设置为了相同的值。 bfi x1, x1, #32, #32最后这个指令将x1的最低32位插入到x1的第32位到第63位。这样x1的64位就都设置为了相同的值。
这个代码片段的目的是将x1寄存器的最低8位的值复制到x1的其他位从而使得x1的所有位都设置为了相同的值。这对于实现memset操作有用因为我们需要将一段内存设置为指定的值。
上篇文章ARM64 常见汇编指令学习 16 – ARM64 SMC 指令
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5367.html
如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!