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