diff -r 000000000000 -r a41df078684a kerneltest/e32test/mmu/t_mwait.cia --- /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 +#include +#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 + } +