kerneltest/e32test/mmu/t_mwait.cia
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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
	}