kerneltest/e32test/bench/t_userasmfnc.cpp
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/bench/t_userasmfnc.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,520 @@
+// Copyright (c) 2005-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\bench\t_userasmfnc.cpp
+// 
+//
+
+#include "t_userbm.h"
+#include <e32huffman.h>
+#include <e32math.h>
+#include <e32base.h>
+#include <e32base_private.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32svr.h>
+
+TBool PointsEqual(const TPoint& a, const TPoint& b)
+	{
+	return a.iX == b.iX && a.iY == b.iY;
+	}
+
+TInt ComparePoints(const TPoint& a, const TPoint& b)
+	{
+	if (a.iX < b.iX)
+		return -1;
+	else if (a.iX > b.iX)
+		return 1;
+	else if (a.iY < b.iY)
+		return -1;
+	else
+		return a.iY < b.iY;
+	}
+
+RArray<TInt>          ArrayTInt;   // RArrayPointerBase derived
+RArray<TUint>         ArrayTUint;  // RArrayPointerBase derived
+RPointerArray<TPoint> ArrayTPointPtr;
+RArray<TPoint> 		  ArrayTPoint;
+
+TPoint Point(6, 13);
+TIdentityRelation<TPoint> PointIdentity(PointsEqual);
+TLinearOrder<TPoint> PointOrder(ComparePoints);
+
+CObjectConIx* ObjectConIx;
+CObjectIx* ObjectIx;
+CObjectCon* ObjectCon;
+TInt ObjectHandle;
+
+TUint32 HuffmanTable[] = { 0, 1, 3, 8, 10, 3, 1, 0 };
+TBitInput BitInput;
+TUint8 BitData[] = { 0, 0, 0, 0 };
+
+RRegion Region, Region2, Region3;
+TRect Rect1(20, 20, 40, 40);
+
+SPoly* Poly;
+TRealX PolyXCoeffs[] = { 1.0, 3.0, 5.0 };
+
+RHeap* Heap;
+const TInt HeapSize = 32768;
+const TInt SmallAlloc = 4;
+const TInt Allocs = HeapSize / 2 / (SmallAlloc + RHeap::EAllocCellSize) / 2 * 2;
+
+void InitDataL()
+	{
+	TInt array1Data[] = { 1, 2, 3, 5, 7, 11, 13, 17, 23 };
+	for (TUint i = 0 ; i < sizeof(array1Data) / sizeof(TInt) ; ++i)
+		{
+		User::LeaveIfError(ArrayTInt.Append(array1Data[i]));
+		User::LeaveIfError(ArrayTUint.Append(array1Data[i]));
+		TPoint* p = new (ELeave) TPoint(i, array1Data[i]);
+		CleanupStack::PushL(p);
+		User::LeaveIfError(ArrayTPointPtr.Append(p));
+		CleanupStack::Pop(p);
+		User::LeaveIfError(ArrayTPoint.Append(*p));
+		}
+
+	ObjectConIx = CObjectConIx::NewL();
+	ObjectCon = ObjectConIx->CreateL();
+	ObjectIx = CObjectIx::NewL();
+	CObject* o = new (ELeave) CObject;
+	ObjectCon->AddL(o);
+	ObjectHandle = ObjectIx->AddL(o);
+
+	Huffman::HuffmanL(HuffmanTable, sizeof(HuffmanTable) / sizeof(TUint32), HuffmanTable);
+	Huffman::Decoding(HuffmanTable, sizeof(HuffmanTable) / sizeof(TUint32), HuffmanTable);	
+
+	Region.AddRect(TRect(10, 10, 30, 30));
+	Region.AddRect(TRect(30, 20, 50, 50));
+	Region.AddRect(TRect(10, 50, 50, 60));
+
+	Region2.AddRect(TRect(0, 40, 100, 60));
+	Region2.AddRect(TRect(40, 0, 60, 100));
+	Region2.AddRect(TRect(30, 30, 70, 70));
+
+	Region3.AddRect(TRect(0, 30, 100, 40));
+	Region3.AddRect(TRect(0, 0, 100, 10));
+	Region3.AddRect(TRect(0, 20, 100, 30));
+	Region3.AddRect(TRect(0, 10, 100, 20));
+	Region3.AddRect(TRect(0, 40, 100, 50));
+
+	Poly = (SPoly*) User::AllocL(sizeof(SPoly) + (3 - 1) * sizeof(TReal));
+	Poly->num = 3;
+	Poly->c[0] = 3;
+	Poly->c[1] = 6;
+	Poly->c[2] = 9;
+
+	Heap = (RHeap*)User::LeaveIfNull(UserHeap::ChunkHeap(NULL, HeapSize, HeapSize));	
+	TInt x;	
+	TAny* cells[Allocs];
+	for (x=0; x<Allocs; ++x)
+		cells[x] = Heap->Alloc(4);
+	for (x=0; x<Allocs; x += 2)
+		Heap->Free(cells[x]);
+	}
+
+// Define benchmarks for assembler-coded euser functions.  Note that these are
+// named after the function we're trying to test, which is not necessarily the
+// one we call.
+
+// RPointerArrayBase
+DEFINE_USER_BENCHMARK(RPointerArrayBase_At,
+					  ,
+					  ArrayTInt[4]);
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_Append,
+					  RArray<TInt> a,
+					  a.Reset(); a.Append(1));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_Find1,
+					  ,
+					  ArrayTInt.Find(5));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_Find2,
+					  ,
+					  ArrayTPointPtr.Find(&Point, PointIdentity));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_BinarySearchSigned,
+					  TInt i,
+					  ArrayTInt.SpecificFindInOrder(13, i, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_BinarySearchUnsigned,
+					  TInt i,
+					  ArrayTUint.SpecificFindInOrder(13, i, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_BinarySearch,
+					  ,
+					  ArrayTPointPtr.SpecificFindInOrder(&Point, PointOrder, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_FindIsqSigned,
+					  ,
+					  ArrayTInt.SpecificFindInOrder(5, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_FindIsqUnsigned,
+					  ,
+					  ArrayTUint.SpecificFindInOrder(5, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_FindIsq,
+					  ,
+					  ArrayTPointPtr.SpecificFindInOrder(&Point, PointOrder, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_HeapSortSigned,
+					  ,
+					  ArrayTInt.Sort());
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_HeapSortUnsigned,
+					  ,
+					  ArrayTUint.Sort());
+
+DEFINE_USER_BENCHMARK(RPointerArrayBase_HeapSort,
+					  ,
+					  ArrayTPointPtr.Sort(PointOrder));
+
+// RArrayBase
+DEFINE_USER_BENCHMARK(RArrayBase_At,
+					  ,
+					  ArrayTPoint[4]);
+
+DEFINE_USER_BENCHMARK(RArrayBase_Append,
+					  RArray<TPoint> a,
+					  a.Reset(); a.Append(Point));
+
+DEFINE_USER_BENCHMARK(RArrayBase_Find1,
+					  ,
+					  ArrayTPoint.Find(Point));
+
+DEFINE_USER_BENCHMARK(RArrayBase_Find2,
+					  ,
+					  ArrayTPoint.Find(Point, PointIdentity));
+
+DEFINE_USER_BENCHMARK(RArrayBase_BinarySearchSigned,
+					  TInt i,
+					  ArrayTPoint.SpecificFindInSignedKeyOrder(Point, i, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RArrayBase_BinarySearchUnsigned,
+					  TInt i,
+					  ArrayTPoint.SpecificFindInUnsignedKeyOrder(Point, i, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RArrayBase_BinarySearch,
+					  TInt i,
+					  ArrayTPoint.FindInOrder(Point, i, PointOrder));
+
+DEFINE_USER_BENCHMARK(RArrayBase_FindIsqSigned,
+					  ,
+					  ArrayTPoint.SpecificFindInSignedKeyOrder(Point, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RArrayBase_FindIsqUnsigned,
+					  ,
+					  ArrayTPoint.SpecificFindInUnsignedKeyOrder(Point, EArrayFindMode_Any));
+
+DEFINE_USER_BENCHMARK(RArrayBase_HeapSortSigned,
+					  ,
+					  ArrayTPoint.SortSigned());
+
+DEFINE_USER_BENCHMARK(RArrayBase_HeapSortUnsigned,
+					  ,
+					  ArrayTPoint.SortUnsigned());
+
+DEFINE_USER_BENCHMARK(RArrayBase_HeapSort,
+					  ,
+					  ArrayTPointPtr.Sort(PointOrder));
+
+// CObject related
+DEFINE_USER_BENCHMARK(CObjectIx_At1,
+					  ,
+					  ObjectIx->At(ObjectHandle));
+
+DEFINE_USER_BENCHMARK(CObjectIx_At2,
+					  ,
+					  ObjectIx->At(ObjectHandle, 0));
+
+DEFINE_USER_BENCHMARK(CObjectIx_ArrayOperator,
+					  ,
+					  (*ObjectIx)[0]);
+
+DEFINE_USER_BENCHMARK(CObjectCon_ArrayOperator,
+					  ,
+					  (*ObjectCon)[0]);
+
+DEFINE_USER_BENCHMARK(CObjectCon_At,
+					  ,
+					  ObjectCon->At(ObjectHandle));
+
+DEFINE_USER_BENCHMARK(CObjectCon_AtL,
+					  ,
+					  ObjectCon->AtL(ObjectHandle));
+
+// Huffman coding
+DEFINE_USER_BENCHMARK(TBitInput_ReadL1,
+					  ,
+					  BitInput.Set(BitData, 128); BitInput.ReadL());
+
+DEFINE_USER_BENCHMARK(TBitInput_ReadL2,
+					  ,
+					  BitInput.Set(BitData, 128); BitInput.ReadL(7));
+
+DEFINE_USER_BENCHMARK(TBitInput_HuffmanL,
+					  ,
+					  BitInput.Set(BitData, 128); BitInput.HuffmanL(HuffmanTable));
+
+// Regions
+DEFINE_USER_BENCHMARK(TRegion_BoundingRect,
+					  ,
+					  Region.BoundingRect());
+
+DEFINE_USER_BENCHMARK(TRegion_IsContainedBy,
+					  TRect r(0,0,90,90),
+					  Region.IsContainedBy(r));
+
+DEFINE_USER_BENCHMARK(TRegion_Copy,
+					  RRegion r,
+					  r.Copy(Region));
+
+DEFINE_USER_BENCHMARK(TRegion_Offset1,
+					  ,
+					  Region.Offset(0, 0));
+
+DEFINE_USER_BENCHMARK(TRegion_Contains,
+					  TPoint p(0, 0),
+					  Region.Contains(p));
+
+DEFINE_USER_BENCHMARK(TRegion_Intersects,
+					  TRect r(0, 0, 10, 10),
+					  Region2.Intersects(r));
+
+DEFINE_USER_BENCHMARK(TRegion_SubRect,
+					  RRegion r,
+					  r.Copy(Region); r.SubRect(Rect1));
+
+DEFINE_USER_BENCHMARK(TRegion_Intersection,
+					  RRegion r,
+					  r.Intersection(Region, Region2));
+
+DEFINE_USER_BENCHMARK(TRegion_ClipRect,
+					  RRegion r,
+					  r.Copy(Region); r.ClipRect(Rect1));
+
+DEFINE_USER_BENCHMARK(TRegion_Tidy,
+					  RRegion r,
+					  r.Copy(Region3); r.Tidy());
+
+// Maths
+DEFINE_USER_BENCHMARK(Math_Frac,
+					  TReal t,
+					  Math::Frac(t, KPi));
+
+DEFINE_USER_BENCHMARK(Math_Int1,
+					  TReal t,
+					  Math::Int(t, KPi));
+
+DEFINE_USER_BENCHMARK(Math_Int2,
+					  TInt16 t,
+					  Math::Int(t, KPi));
+
+DEFINE_USER_BENCHMARK(Math_Int3,
+					  TInt32 t,
+					  Math::Int(t, KPi));
+
+DEFINE_USER_BENCHMARK(Math_IsZero,
+					  ,
+					  Math::IsZero(KPi));
+
+DEFINE_USER_BENCHMARK(Math_IsNaN,
+					  ,
+					  Math::IsNaN(KPi));
+
+DEFINE_USER_BENCHMARK(Math_IsInfinite,
+					  ,
+					  Math::IsInfinite(KPi));
+
+DEFINE_USER_BENCHMARK(Math_IsFinite,
+					  ,
+					  Math::IsFinite(KPi));
+
+DEFINE_USER_BENCHMARK(Math_Sqrt,
+					  TReal t,
+					  Math::Sqrt(t, KPi));
+
+DEFINE_USER_BENCHMARK(Math_Poly,
+					  TRealX t,
+					  Math::PolyX(t, KPi, 3, PolyXCoeffs));
+
+// Not tested due to not being exported:
+//   Math::SetZero
+//   Math::SetNan
+//   Math::SetInfinite
+
+// TRealX
+DEFINE_USER_BENCHMARK(TRealX_Cons1,
+					  TRealX t,
+					  new (&t) TRealX);
+
+DEFINE_USER_BENCHMARK(TRealX_Cons2,
+					  TRealX t,
+					  new (&t) TRealX(0, 0, 0));
+
+// covers TRealX::Set(TInt), TRealX::TRealX(TInt) and TRealX::operator=(TInt)
+DEFINE_USER_BENCHMARK(TRealX_SetInt,
+					  TRealX t,
+					  t = (TInt) 23);
+
+// covers TRealX::Set(TUint), TRealX::TRealX(TUint) and TRealX::operator=(TUint)
+DEFINE_USER_BENCHMARK(TRealX_SetUint,
+					  TRealX t,
+					  t = (TUint) 23);
+
+// covers TRealX::Set(TInt64), TRealX::TRealX(TInt64) and TRealX::operator=(TInt64)
+DEFINE_USER_BENCHMARK(TRealX_SetInt64,
+					  TRealX t,
+					  t = (TInt64) 23);
+
+// covers TRealX::Set(TReal32), TRealX::TRealX(TReal32) and TRealX::operator=(TReal32)
+DEFINE_USER_BENCHMARK(TRealX_SetReal32,
+					  TRealX t; TReal32 v = 23,
+					  t = v);
+
+// covers TRealX::Set(TReal64), TRealX::TRealX(TReal64) and TRealX::operator=(TReal64)
+DEFINE_USER_BENCHMARK(TRealX_SetReal64,
+					  TRealX t; TReal64 v = 23,
+					  t = v);
+
+DEFINE_USER_BENCHMARK(TRealX_SetZero,
+					  TRealX t,
+					  t.SetZero(EFalse));
+
+DEFINE_USER_BENCHMARK(TRealX_SetNaN,
+					  TRealX t,
+					  t.SetNaN());
+
+DEFINE_USER_BENCHMARK(TRealX_SetInfinite,
+					  TRealX t,
+					  t.SetInfinite(EFalse));
+
+DEFINE_USER_BENCHMARK(TRealX_IsZero,
+					  TRealX t,
+					  t.IsZero());
+
+DEFINE_USER_BENCHMARK(TRealX_IsNaN,
+					  TRealX t; t.SetNaN(),
+					  t.IsNaN());
+
+DEFINE_USER_BENCHMARK(TRealX_IsInfinite,
+					  TRealX t; t.SetInfinite(EFalse),
+					  t.IsInfinite());
+
+DEFINE_USER_BENCHMARK(TRealX_IsFinite,
+					  TRealX t,
+					  t.IsFinite());
+
+DEFINE_USER_BENCHMARK(TRealX_Int,
+					  TRealX t = 2.3,
+					  (TInt) t);
+
+DEFINE_USER_BENCHMARK(TRealX_Uint,
+					  TRealX t = 2.3,
+					  (TUint) t);
+
+DEFINE_USER_BENCHMARK(TRealX_Int64,
+					  TRealX t = 2.3,
+					  (TInt64) t);
+
+DEFINE_USER_BENCHMARK(TRealX_Real32,
+					  TRealX t = 2.3,
+					  (TReal32) t);
+
+DEFINE_USER_BENCHMARK(TRealX_Real64,
+					  TRealX t = 2.3,
+					  (TReal64) t);
+
+DEFINE_USER_BENCHMARK(TRealX_GetReal32,
+					  TRealX t = 2.3; TReal32 out,
+					  t.GetTReal(out));
+
+DEFINE_USER_BENCHMARK(TRealX_GetReal64,
+					  TRealX t = 2.3; TReal64 out,
+					  t.GetTReal(out));
+
+DEFINE_USER_BENCHMARK(TRealX_UnaryPlus,
+					  TRealX t,
+					  +t);
+
+DEFINE_USER_BENCHMARK(TRealX_UnaryMinus,
+					  TRealX t,
+					  -t);
+
+DEFINE_USER_BENCHMARK(TRealX_Compare,
+					  TRealX a = 0.2; TRealX b = 0.21,
+					  a.Compare(b));
+
+DEFINE_USER_BENCHMARK(TRealX_Sub,
+					  TRealX a = 1.0; TRealX b = 0.2,
+					  a - b);
+
+DEFINE_USER_BENCHMARK(TRealX_Add,
+					  TRealX a = 1.0; TRealX b = 0.2,
+					  a + b);
+
+DEFINE_USER_BENCHMARK(TRealX_Mult,
+					  TRealX a = 1.0; TRealX b = 0.2,
+					  a * b);
+
+DEFINE_USER_BENCHMARK(TRealX_Div,
+					  TRealX a = 1.0; TRealX b = 0.2,
+					  a / b);
+
+DEFINE_USER_BENCHMARK(TRealX_Mod,
+					  TRealX a = 1.1; TRealX b = 0.2,
+					  a % b);
+
+DEFINE_USER_BENCHMARK(TRealX_PreInc,
+					  TRealX t = 0.0,
+					  ++t);
+
+DEFINE_USER_BENCHMARK(TRealX_PostInc,
+					  TRealX t = 0.0,
+					  t++);
+
+DEFINE_USER_BENCHMARK(TRealX_PreDec,
+					  TRealX t = 0.0,
+					  --t);
+
+DEFINE_USER_BENCHMARK(TRealX_PostDec,
+					  TRealX t = 0.0,
+					  t--);
+
+DEFINE_USER_BENCHMARK(RHeap_AllocFree,
+					  TAny* mem,
+					  mem = Heap->Alloc(8);
+					  Heap->Free(mem));
+
+// The following were added for timing functions affected by user-side thread data.
+
+DEFINE_USER_BENCHMARK(User_Heap,
+					  ,
+					  User::Heap());
+
+DEFINE_USER_BENCHMARK(CActiveScheduler_Current,
+					  ,
+					  CActiveScheduler::Current());
+
+DEFINE_USER_BENCHMARK(User_TrapHandler,
+					  ,
+					  User::TrapHandler());
+
+DEFINE_USER_BENCHMARK(UserSvr_DllSetTls,
+					  ,
+					  UserSvr::DllSetTls(0, 0, 0));
+
+DEFINE_USER_BENCHMARK(UserSvr_DllTls,
+					  ,
+					  UserSvr::DllTls(0));