kerneltest/e32test/mmu/t_mwait.cia
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/mmu/t_mwait.cia	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,357 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\mmu\t_mwait.cia
+// 
+//
+
+#include <e32test.h>
+#include <u32std.h>
+#include "d_shadow.h"
+
+#if defined(__CPU_ARM)
+#define INS8	asm(".word 0xe1a00000,0xe1a01001,0xe1a02002,0xe1a03003,0xe1a00000,0xe1a01001,0xe1a02002,0xe1a03003 ")
+#define INS16	INS8 ; INS8
+#define INS32	INS16 ; INS16
+#define INS64	INS32 ; INS32
+#define INS128	INS64 ; INS64
+#elif defined(__CPU_X86)
+#ifdef __GCC32__
+#define INC_EAX	asm("inc eax"); 
+#else
+#define INC_EAX	__asm inc eax
+#endif
+#define INS4	INC_EAX \
+				INC_EAX \
+				INC_EAX \
+				INC_EAX
+#define INS8	INS4	INS4
+#define INS16	INS8	INS8
+#define INS32	INS16	INS16
+#define INS64	INS32	INS32
+#define INS128	INS64	INS64
+#define INS256	INS128	INS128
+#define INS512	INS256	INS256
+#endif
+
+__NAKED__ TLinAddr MemSpeedTest(TInt /*aLoopSize*/, TInt& /*aCount*/)
+	{
+#if defined(__CPU_ARM)
+	asm("memspeedtest: ");
+	__SWITCH_TO_ARM;
+	asm("movs r0, r0 ");
+	asm("beq get_function_end ");	// if loopsize=0, return end address of this function
+	asm("mov r3, r3 ");
+	asm("mov r3, #0 ");				// count of how many loops done
+	asm("adr r2, loopend ");
+	asm("sub r2, r2, r0 ");			// r2=point to branch back to in loop
+	asm("loopstart: ");				// from here to loopend must be 64k bytes
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS128;
+	INS64;
+	INS32;
+	INS16;
+	INS8;
+	asm(".word 0xe1a00000,0xe1a01001,0xe1a02002 ");
+	asm("add r3, r3, #1 ");			// increment counter
+	asm("str r3, [r1] ");			// and store in aCount
+	__JUMP(,r2);				// branch back to start of loop
+	asm("mov r0, r0 ");				// two NOPs because of prefetch
+	asm("mov r0, r0 ");
+	asm("loopend: ");
+	asm("get_function_end: ");
+	asm("adr r0, memspeedtest_end ");
+	__END_ARM;
+	__JUMP(,lr);
+	asm("memspeedtest_end: ");
+#elif defined(__CPU_X86)
+	asm("mov ecx, [esp+4]");		// ecx=loop size
+	asm("test ecx, ecx");
+	asm("jz get_function_end");		// if zero, return function end address
+	asm("mov edx, [esp+8]");		// edx=&aCount
+	asm("lea ebx, loopend");
+	asm("sub ebx, ecx");			// ebx=point to jump back to in loop
+	asm("xor ecx, ecx");			// count of loops done
+	asm("loopstart:");				// from here to loopend must be 64k bytes
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS512;
+	INS256;
+	INS128;
+	INS64;
+	INS32;
+	INS16;
+	INS8;
+	asm("inc ecx");			// increment loop counter
+	asm("mov [edx], ecx");	// update aCount
+	asm("jmp ebx");			// jump back
+	asm("nop");
+	asm("nop");
+	asm("nop");
+	asm("loopend:");
+	asm("get_function_end:");
+	asm("lea eax, memspeedtest_end");
+	asm("ret");
+	asm("memspeedtest_end:");
+#endif
+	}
+