我正在编写可以为 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(使用前将#替换为@)