idiv
- 表示两者的混合体sdiv
and udiv
支持是可选的Cortex-A操作说明。的支持Cortex-A可以通过以下方式查询ID_ISAR0
cp15 寄存器,位 [27:24]。
/* Get idiv support. */
unsigned int ISAR0;
int idiv;
__asm ("mrc 15, 0, %0, c0, c2, 0" :"=r" (ISAR0));
#ifdef __thumb2__
idiv = (ISAR0 & 0xf000000UL) ? 1 : 0;
#else
idiv = (ISAR0 & 0xf000000UL) == 0x2000000UL ? 1 : 0;
#endif
位[27:24]是0001
,如果只有thumb2支持udiv
and sdiv
指示。如果位[27:24]是0010
,则两种模式都支持该指令。
作为 gcc 标志-march=armv7-a
等意味着代码应该可以工作ALL这种类型的 CPU 和该指令是可选的,gcc 发出该指令将是一个错误。
您可以使用不同的标志编译不同的模块,例如,
gcc -march=armv7-a -o general.o -c general.c
gcc -mcpu=cortex-a15 -D_USE_IDIV_=1 -o fast_idiv.o -c fast_div.c
这些模块可以链接在一起,并且上述代码可用于在运行时选择适当的例程。例如,两个文件可能都有,
#include "fir_template.def"
这个文件可能有,
#ifdef _USE_IDIV_
#define _FUNC(x) idiv_ ## x
#else
#define _FUNC(x) x
#endif
int _FUNC(fir8)(FILTER8 *filter, SAMPLE *data,)
{
....
}
如果您知道您的代码只能在皮质-a15,然后使用-mcpu
选项。如果你想让它运行得更快IF它可以并且是通用的(支持所有armv7-a CPU),那么您必须如上所述ID CPU并动态选择代码。
附录:上面的文件(通用.c and fast_idiv.c) 可以放入具有相同 API 的单独共享库中。然后审问/proc/cpuinfo
看看是否idiv
是支持的。设置LD_LIBRARY_PATH
(or dlopen()
) 到适当的版本。选择将取决于涉及的代码量。