一、测试环境:
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