cortex-a8的vfp3指令执行速度

一、测试环境:

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

你可能感兴趣的:(cortex-a8的vfp3指令执行速度)