一、测试环境:
1、CPU主频跑在1GHz,因为要测试VFP3指令所以需要将FPEXC的BIT30设为1;
2、操作系统使用WINCE6R3
3、编译器使用VS2005、VS2008、WEC7三种
二、测试代码:
//--------------------------------------
double FloatingPointArithmeticOne (DWORD i)
{
int j;
double a[256];
a[0] = rand();
a[1] = (i%256)+2;
a[2] = a[0] + a[1];
a[3] = a[2] / a[1];
a[4] = a[3] - a[1];
a[5] = a[4] * a[1];
for (j = 0; j < 7; j++) {
a[7] += a[j];
}
return a[7];
}
//--------------------------------------
DWORD FloatingPointArithmetic ()
{
DWORD dwTick;
DWORD dwNow;
DWORD i;
DWORD j;
double a = 0;
dwTick = GetTickCount ();
for (i = 0;; i++) {
for (j = 0; j < 1000; j++) {
a += FloatingPointArithmeticOne (j);
}
dwNow = GetTickCount ();
if (dwNow - dwTick >= 1000)
break;
}
return i;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD ts = FloatingPointArithmetic();
printf("FloatingPointArithmetic: ts = %d\n", ts);
return 0;
}
三、测试结果
1、VS2005编译生成的程序:用IDA查看,生成的代码调用的浮点运算是coredll中的函数,也就是纯软件模拟,ts值是270(次)
2、VS2008和WEC7编译生成的程序:用IDA查看,生成的代码调用的浮点运算都是VFP硬件指令,不过WEC7优化的指令数更少,前者ts是1546(次),后者是1771(次)
四、其它
1、IDA需要使用6.1版,而且需要将ARM架构设置成ARMv7-A&R,这样才能正确翻译VFP3/NEON指令
2、可以通过指定VS2008执行程序优先路径的方式来使用WEC7的编译器进行编译,然后指定编译参数“/QRarch7 /QRfpe- /arch:VFPv3-D32”来进行编译优化
3、对于汇编文件,如果有VFP3或NEON指令因VS2008的编译器无法识别则只能用WEC7的编译器进行编译;或者使用伪指令DCD