Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 带本征函数的前导零点计算_Arm_Bit Manipulation_Windows Ce_Intrinsics_Leading Zero - Fatal编程技术网

Arm 带本征函数的前导零点计算

Arm 带本征函数的前导零点计算,arm,bit-manipulation,windows-ce,intrinsics,leading-zero,Arm,Bit Manipulation,Windows Ce,Intrinsics,Leading Zero,我试图优化一些在嵌入式系统中工作的代码(FLAC解码、Windows CE、ARM 926 MCU) 使用宏和查找表: /*计算一个字中零个MSB的#*/ #定义计数\u零\u MSB(字)(\ (字)8]+16):\ ((字)>16]+8:\ 字节到一元表[(字)>>24])\ ) 静态常量无符号字符字节到一元表[]={ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,

我试图优化一些在嵌入式系统中工作的代码(FLAC解码、Windows CE、ARM 926 MCU)

使用宏和查找表:

/*计算一个字中零个MSB的#*/
#定义计数\u零\u MSB(字)(\
(字)8]+16):\
((字)>16]+8:\
字节到一元表[(字)>>24])\
)
静态常量无符号字符字节到一元表[]={
8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
然而,大多数CPU已经有了一条专用指令,x86上的bsr,ARM()上的clz,这应该会更有效

在Windows CE上,我们有一个内在函数,它应该只调用该值。但是,它比宏慢4倍(在1000万次迭代中测量)


依赖于专用ASM指令的固有函数的速度怎么可能慢4倍?

检查反汇编。您确定编译器插入了指令吗?备注部分包含以下内容:

此功能可通过以下方式实现: 调用运行时函数

我想这就是你的情况

请注意,CLZ指令仅在ARMv5及更高版本中可用。如果需要ARMv5代码,需要告诉编译器:

/QRarch5 ARM5 Architecture
/QRarch5T ARM5T Architecture

(Microsoft错误地使用了“ARM5”而不是“ARMv5”)

我将检查生成的代码。如果它真的是一个函数调用(而不是一个真正的内在调用),那么调用开销将解释为什么它如此缓慢。