在编写 C 代码时如何优雅地利用 REV 和 RBIT 等 ARM 指令?

2024-01-08

我正在编写可以为 Arm Cortex-M3 微控制器编译的 C 代码。

该微控制器支持多种有用的指令,可有效操作寄存器中的位,包括 REV*、RBIT、SXT*。

在编写C代码时,如果我需要那些特定的功能,如何利用这些指令?例如,我怎样才能完成这段代码?

#define REVERSE_BIT_ORDER(x)    {  /* what to write here? */ }

我想在不使用内联汇编器的情况下执行此操作,以便该代码既可移植又可读。

Added:

在某种程度上,我想问如何用 C 语言优雅地表达这样的函数。例如,用 C 语言很容易表达位移位,因为它内置于该语言中。同样,设置或清除位。但位反转在 C 语言中是未知的,因此很难表达。例如,这就是我反转位的方式:

unsigned int ReverseBits(unsigned int x)
{
    unsigned int ret = 0;
    for (int i=0; i<32; i++)
    {
        ret <<= 1;
        if (x & (1<<i))
            ret |= 1;
    }
    return ret;
}

编译器会将其识别为位反转并发出正确的指令吗?


反转 32 位整数中的位是一种非常奇特的指令,因此这可能就是您无法重现它的原因。我能够生成利用的代码REV(撤销byteorder)但是,这是一个更常见的用例:

#include <stdint.h>

uint32_t endianize (uint32_t input)
{
  return ((input >> 24) & 0x000000FF) |
         ((input >>  8) & 0x0000FF00) |
         ((input <<  8) & 0x00FF0000) |
         ((input << 24) & 0xFF000000) ;
}

With gcc -O3 -mcpu=cortex-m3 -ffreestanding(对于 ARM32,第 11.2.1 节“无”):

endianize:
        rev     r0, r0
        bx      lr

https://godbolt.org/z/odGqzjTGz https://godbolt.org/z/odGqzjTGz

它也适用于 clang armv7-a 15.0.0,只要您使用-mcpu=cortex-m3.

因此,这将支持避免手动优化的想法,并让编译器担心这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编写 C 代码时如何优雅地利用 REV 和 RBIT 等 ARM 指令? 的相关文章

随机推荐