17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*
27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License.
67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at
77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and
147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License.
157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */
187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_TensorEm/Flt16Vec.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Memory.h"
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Math.h"
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h"
237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_init( struct bbs_Context* cpA,
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bts_Flt16Vec* ptrA )
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->arrE );
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->expE = 0;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_exit( struct bbs_Context* cpA,
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bts_Flt16Vec* ptrA )
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->arrE );
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->expE = 0;
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_copy( struct bbs_Context* cpA,
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bts_Flt16Vec* ptrA,
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						const struct bts_Flt16Vec* srcPtrA )
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_copy( cpA, &ptrA->arrE, &srcPtrA->arrE );
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->expE = srcPtrA->expE;
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bts_Flt16Vec_equal( struct bbs_Context* cpA,
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const struct bts_Flt16Vec* ptrA,
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const struct bts_Flt16Vec* srcPtrA )
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( !bbs_Int16Arr_equal( cpA, &ptrA->arrE, &srcPtrA->arrE ) ) return FALSE;
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->expE != srcPtrA->expE ) return FALSE;
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint16 bts_Flt16Vec_avg( struct bbs_Context* cpA, const struct bts_Flt16Vec* ptrA )
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 iL;
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 sizeL = ptrA->arrE.sizeE;
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sumL = 0;
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* srcL = ptrA->arrE.arrPtrE;
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeL; iL++ )
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL += srcL[ iL ];
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return sumL / ( int32 )sizeL;
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Flt16Vec_norm( struct bbs_Context* cpA, const struct bts_Flt16Vec* ptrA )
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_vecNorm16( ptrA->arrE.arrPtrE, ptrA->arrE.sizeE );
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16 bts_Flt16Vec_maxAbs( struct bbs_Context* cpA, const struct bts_Flt16Vec* ptrA )
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 iL;
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 sizeL = ptrA->arrE.sizeE;
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 maxL = 0;
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* srcL = ptrA->arrE.arrPtrE;
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeL; iL++ )
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16 vL = srcL[ iL ] > 0 ? srcL[ iL ] : -srcL[ iL ];
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxL = vL > maxL ? vL : maxL;
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return maxL;
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_create( struct bbs_Context* cpA,
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  struct bts_Flt16Vec* ptrA,
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  uint32 sizeA,
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  struct bbs_MemSeg* mspA )
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_create( cpA, &ptrA->arrE, sizeA, mspA );
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_size( struct bbs_Context* cpA,
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						struct bts_Flt16Vec* ptrA,
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						uint32 sizeA )
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_size( cpA, &ptrA->arrE, sizeA );
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Flt16Vec_memSize( struct bbs_Context* cpA,
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const struct bts_Flt16Vec *ptrA )
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return  bbs_SIZEOF16( uint32 ) /* mem size */
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		+ bbs_Int16Arr_memSize( cpA, &ptrA->arrE )
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		+ bbs_SIZEOF16( ptrA->expE );
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Flt16Vec_memWrite( struct bbs_Context* cpA,
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   const struct bts_Flt16Vec* ptrA,
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							   uint16* memPtrA )
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bts_Flt16Vec_memSize( cpA, ptrA );
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->arrE, memPtrA );
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite16( &ptrA->expE, memPtrA );
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Flt16Vec_memRead( struct bbs_Context* cpA,
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  struct bts_Flt16Vec* ptrA,
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const uint16* memPtrA,
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  struct bbs_MemSeg* mspA )
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL;
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->arrE, memPtrA, mspA );
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead16( &ptrA->expE, memPtrA );
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bts_Flt16Vec_memSize( cpA, ptrA ) )
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bts_Flt16Vec_memRead( const struct bts_Flt16Vec* ptrA, const void* memPtrA ):\n"
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                   "size mismatch" );
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_maximizeMantisse( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA )
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    uint32 maxAbsL = bts_Flt16Vec_maxAbs( cpA, ptrA );
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 shlL = 0;
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( maxAbsL == 0 ) return; /* cannot maximize 0 */
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( maxAbsL < 0x4000 )
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shlL++;
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxAbsL <<= 1;
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shlL > 0 )
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->arrE.sizeE;
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16* dstL = ptrA->arrE.arrPtrE;
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] <<= shlL;
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->expE -= shlL;
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Flt16Vec_maximizeAbsValue( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA )
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    int32 maxAbsL = bts_Flt16Vec_maxAbs( cpA, ptrA );
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 fL;
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( maxAbsL == 0 ) return 0; /* vector is zero */
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	fL = ( int32 )0x7FFF0000 / maxAbsL;
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->arrE.sizeE;
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16* dstL = ptrA->arrE.arrPtrE;
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( ( int32 )dstL[ iL ] * fL + 32768 ) >> 16;
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return fL;
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_zeroAverage( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA )
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 iL;
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 sizeL = ptrA->arrE.sizeE;
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16* dstL = ptrA->arrE.arrPtrE;
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 avgL = bts_Flt16Vec_avg( cpA, ptrA );
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] -= avgL;
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_normalize( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA )
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 normL = bts_Flt16Vec_norm( cpA, ptrA );
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( normL == 0 )
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* vector is zero - do nothing */
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16* dstL = ptrA->arrE.arrPtrE;
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16 iL;
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint16 sizeL = ptrA->arrE.sizeE;
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	    int16 expL = 0;
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 fL;
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* let norm occupy 17 bits */
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ( normL & 0xFFFE0000 ) != 0 )
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( ( normL >> -expL ) & 0xFFFE0000 ) != 0 ) expL--;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			normL >>= -expL;
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( ( normL <<  expL ) & 0xFFFF0000 ) == 0 ) expL++;
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			normL <<=  expL;
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* fL is positive and occupies only 16 bits - a product with int16 fits in int32 */
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		fL = ( uint32 )0xFFFFFFFF / normL;
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* multiply with factor */
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( ( ( ( int32 )dstL[ iL ] * fL ) >> 15 ) + 1 ) >> 1;
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* set exponent */
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->expE = expL - 16;
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 testNormL = bts_Flt16Vec_norm( cpA, ptrA );
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		printf( "test norm %f\n", ( float )testNormL / ( 1 << -ptrA->expE ) );
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_setZero( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA )
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_fill( cpA, &ptrA->arrE, 0 );
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->expE = 0;
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_mul( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA, int32 valA, int16 expA )
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 valL = valA;
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 expL = expA;
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valL == 0 )
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bts_Flt16Vec_setZero( cpA, ptrA );
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 iL;
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 sizeL = ptrA->arrE.sizeE;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16* dstL = ptrA->arrE.arrPtrE;
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* adjust valL to maximum 16 bit accuracy  */
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 absValL = valL > 0 ? valL : -valL;
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ( absValL & 0xFFFF8000 ) != 0 )
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 shrL = 0;
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( absValL & 0xFFFF8000 ) != 0 )
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				absValL >>= 1;
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				shrL++;
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( shrL > 0 )
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				valL = ( ( valL >> ( shrL - 1 ) ) + 1 ) >> 1;
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				expL += shrL;
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( valL >= 0x08000 ) valL = 0x07FFF; /* saturate */
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 shlL = 0;
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( ( absValL & 0xFFFFC000 ) == 0 )
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				absValL <<= 1;
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				shlL++;
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			valL <<= shlL;
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			expL -= shlL;
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dstL[ iL ] = ( ( ( ( int32 )dstL[ iL ] * valL ) >> 15 ) + 1 ) >> 1;
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrA->expE += expL + 16;
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_dotPtrd( struct bbs_Context* cpA, struct bts_Flt16Vec* vp1A, struct bts_Flt16Vec* vp2A, int32* manPtrA, int32* expPtrA )
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_DEF_fNameL( "void bts_Flt16Vec_dotPtrd( struct bbs_Context* cpA, struct bts_Flt16Vec* vp1A, struct bts_Flt16Vec* vp2A, int32* matPtrA, int32* expPtrA )" )
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 iL;
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 sizeL = vp1A->arrE.sizeE;
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* arr1L = vp1A->arrE.arrPtrE;
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* arr2L = vp2A->arrE.arrPtrE;
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 shrm1L = -1; /* shift minus 1 */
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sumL;
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( vp1A->arrE.sizeE != vp2A->arrE.sizeE )
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR1( "%s:\nVectors have different size", fNameL );
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	sumL = 0;
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* shrm1L == -1 */
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeL; iL++ )
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL += ( int32 )arr1L[ iL ] * ( int32 )arr2L[ iL ];
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ( ( ( sumL > 0 ) ? sumL : -sumL ) & 0xC0000000 ) != 0 ) break;
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( iL < sizeL )
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* danger of overflow: increase shift; adjust sum */
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shrm1L++;
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL = ( ( sumL >> 1 ) + 1 ) >> 1;
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* shrm1L == 0 */
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL += ( int32 )( ( arr1L[ iL ] + 1 ) >> 1 ) * ( int32 )( ( arr2L[ iL ] + 1 ) >> 1 );
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ( ( ( sumL > 0 ) ? sumL : -sumL ) & 0xC0000000 ) != 0 ) break;
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ( ( ( sumL > 0 ) ? sumL : -sumL ) & 0xC0000000 ) != 0 )
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				/* danger of overflow: increase shift; adjust sum */
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				shrm1L++;
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL = ( ( sumL >> 1 ) + 1 ) >> 1;
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL += ( int32 )( ( ( arr1L[ iL ] >> shrm1L ) + 1 ) >> 1 ) * ( int32 )( ( ( arr2L[ iL ] >> shrm1L ) + 1 ) >> 1 );
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( manPtrA != NULL ) *manPtrA = sumL;
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( expPtrA != NULL ) *expPtrA = vp1A->expE + vp2A->expE + ( ( shrm1L + 1 ) << 1 );
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Flt16Vec_append( struct bbs_Context* cpA, struct bts_Flt16Vec* ptrA, struct bts_Flt16Vec* srcPtrA )
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->arrE.sizeE == 0 )
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bts_Flt16Vec_copy( cpA, ptrA, srcPtrA );
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 idxL = ptrA->arrE.sizeE;
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bts_Flt16Vec_size( cpA, ptrA, idxL + srcPtrA->arrE.sizeE );
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* copy data */
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_memcpy16( ptrA->arrE.arrPtrE + idxL, srcPtrA->arrE.arrPtrE, srcPtrA->arrE.sizeE );
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* equalize exponent */
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( ptrA->expE > srcPtrA->expE )
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 iL;
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 sizeL = srcPtrA->arrE.sizeE;
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 shrL = ptrA->expE - srcPtrA->expE;
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int16* dstL = ptrA->arrE.arrPtrE + idxL;
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( ( dstL[ iL ] >> ( shrL - 1 ) ) + 1 ) >> 1;
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else if( ptrA->expE < srcPtrA->expE )
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 iL;
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 sizeL = idxL;
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 shrL = srcPtrA->expE - ptrA->expE;
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int16* dstL = ptrA->arrE.arrPtrE;
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < sizeL; iL++ ) dstL[ iL ] = ( ( dstL[ iL ] >> ( shrL - 1 ) ) + 1 ) >> 1;
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrA->expE = srcPtrA->expE;
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
487