kerneltest/f32test/math/t_gen32.cpp
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// Copyright (c) 1996-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:
// f32test\math\t_gen32.cpp
// Generates files to be used in testing whether arithmetic in TReal32 gives
// exactly the same results using the MSDEV complier as on the rack.
// 
//

#include <f32file.h>
#include <e32svr.h>
#include "t_math.h"
#include "../server/t_server.h"

#if defined(__VC32__)
//
// Some symbols generated by the VC++ compiler for floating point stuff.
//
extern "C" {
GLDEF_D TInt _adj_fdiv_m32;
}
#endif

GLDEF_D RTest test(_L("T_GEN32"));

LOCAL_D	RFile f;
LOCAL_D const TFileName fileName32 = _L("T_REAL32.H");

LOCAL_D const TFileName pathName = _L("C:\\E32-MATH\\");
LOCAL_D	TBuf<0x100> buf;
LOCAL_D TBuf8<0x100> buf8;

// Data for tests from T_R32DTA.cpp 
GLREF_D TReal32 addInput[];
GLREF_D TReal32 subInput[];
GLREF_D TReal32 multInput[];
GLREF_D TReal32 divInput[];
//GLREF_D TApprox32 subApprox[];
GLREF_D TReal32 unaryInput[];
GLREF_D TReal32 incDecInput[];
GLREF_D TInt sizeAdd;
GLREF_D TInt sizeSub;
GLREF_D TInt sizeMult;
GLREF_D TInt sizeDiv;
//GLREF_D TInt sizeSubApprox;
GLREF_D TInt sizeUnary;
GLREF_D TInt sizeIncDec;

LOCAL_C void appendStart()
	{
	f.Write(_L8("// Generated by \\E32\\TMATH\\T_GEN32.MAK\n\n"));
	f.Write(_L8("#include <e32std.h>\n\n"));
	f.Write(_L8("#if defined(__WINS__)\n#include \"t_vals.hwg\"\n"));
	f.Write(_L8("#else\n#include \"t_vals.hag\"\n#endif\n"));
	}

LOCAL_C void appendArrayName32(TPtrC aName)
	{
	buf=_L("");
	buf.AppendFormat(_L("const TInt32x %S[] = \n{\n"),&aName);
	buf8.Copy(buf);
	f.Write(buf8);
	}

LOCAL_C void appendValue32(TReal32* aVal)
	{
	buf=_L("");
	buf.AppendFormat(_L("	TInt32x(0x%x),\n"),*(TUint32*)aVal);
	buf8.Copy(buf);
	f.Write(buf8);
	}

LOCAL_C void appendArrayTerm()
	{
	buf8=_L8("};\n\n");
	f.Write(buf8);
	}

LOCAL_C void createAddArray()
//
// Writes an array of results of additions to the header file
//
	{
	TInt ii;
	TReal32 ff;

	appendArrayName32(_L("addArray"));
	for (ii=0; ii<sizeAdd-1; ii++)
		{
		ff=addInput[ii]+addInput[ii+1];
		appendValue32(&ff);
		}
	appendArrayTerm();
	}

LOCAL_C void createSubArray()
//
// Writes an array of results of subtractions to the header file
//
	{
	TInt ii;
	TReal32 ff;

	appendArrayName32(_L("subArray"));
	for (ii=0; ii<sizeSub-1; ii++)
		{
		ff=subInput[ii]-subInput[ii+1];
		appendValue32(&ff);
		}
	appendArrayTerm();

	/*
	appendArrayName32(_L("subApproxArray"));
	for (ii=0; ii<sizeSubApprox; ii++)
		{
		ff=subApprox[ii].f-subApprox[ii].g;
		appendValue32(&ff);
		}
	appendArrayTerm();
	*/
	} 

LOCAL_C void createMultArray()
//
// Writes an array of results of multiplications to the header file
//
	{
	TInt ii;
	TReal32 ff;

	appendArrayName32(_L("multArray"));
	for (ii=0; ii<sizeMult-1; ii++)
		{
		ff=multInput[ii]*multInput[ii+1];
		appendValue32(&ff);
		}
	appendArrayTerm();
	} 

LOCAL_C void createDivArray()
//
// Writes an array of results of divisions to the header file
//
	{
	TInt ii;
	TReal32 ff;

	appendArrayName32(_L("divArray"));
	for (ii=0; ii<sizeDiv-1; ii++)
		{
		if (divInput[ii+1]!=0)
			{
			ff=divInput[ii]/divInput[ii+1];
			appendValue32(&ff);
			}
		}
	appendArrayTerm();
	} 

LOCAL_C void createUnaryArray()
//
// Writes an array of results of unary operations to the header file
//
	{
	TReal32 f;

	appendArrayName32(_L("unaryArray"));
	for (TInt ii=0; ii<sizeUnary; ii++)
		{
		f=-unaryInput[ii];
		appendValue32(&f);
		}
	appendArrayTerm();
	} 

LOCAL_C void createIncDecArrays()
//
// Writes an array of results of pre and post increment and decrement operations to the
// header file
//
	{
	TInt ii;
	TReal32 f;

	appendArrayName32(_L("preIncArray1"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		++f;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("preIncArray2"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		++f;
		++f;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("preDecArray1"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		--f;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("preDecArray2"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		--f;
		--f;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("postIncArray1"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		f++;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("postIncArray2"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		f++;
		f++;
		appendValue32(&f);
		}
	appendArrayTerm();

	appendArrayName32(_L("postDecArray1"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		f--;
		appendValue32(&f);
		}
	appendArrayTerm();
	
	appendArrayName32(_L("postDecArray2"));
	for (ii=0; ii<sizeIncDec; ii++)
		{
		f=incDecInput[ii];
		f--;
		f--;
		appendValue32(&f);
		}
	appendArrayTerm();
	} 

LOCAL_C void createArrays()
//
// Create and append to header file all arrays required for T_R32.CPP tests
//
	{
	createAddArray();
	createSubArray();
	createMultArray();
	createDivArray();
	createUnaryArray();
	createIncDecArrays();
	}

GLDEF_C void CallTestsL(void)
//
// Generate TReal32s (and special values if required) and write to header files
//
    {

	test.Title();

	TFileName msg;
	msg=_L("Generating Maths constants to header files:\n ");
	msg+=pathName;
	msg+=fileName32;
	test.Start(msg);

	test.Next(_L("Making directory"));
	TInt r=TheFs.MkDirAll(pathName);
	test(r==KErrNone || r==KErrAlreadyExists);
	test(TheFs.SetSessionPath(pathName)==KErrNone);

	test(f.Replace(TheFs,fileName32,EFileWrite)==KErrNone);
	test.Next(_L("Generating TReal32s"));
	appendStart();
	createArrays();
	f.Close();

	test.End();

	return;
    }