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/Int32Mat.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_TensorEm/Functions.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#include "b_BasicEm/Memory.h"
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/*                                                                           */
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
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 Projectvoid bts_Int32Mat_reduceToNBits( int32* ptrA, uint32 sizeA, int32* bbpPtrA, uint32 nBitsA )
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL;
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* find max element */
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 maxL = 0;
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* ptrL = ptrA;
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iL = sizeA;
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	while( iL-- )
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 xL = *ptrL++;
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( xL < 0 ) xL = -xL;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( xL > maxL ) maxL = xL;
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* determine shift */
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = bts_absIntLog2( maxL ) + 1 - nBitsA;
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL > 0 )
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptrL = ptrA;
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		iL = sizeA;
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		while( iL-- )
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			*ptrL = ( ( *ptrL >> ( shiftL - 1 ) ) + 1 ) >> 1;
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrL++;
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*bbpPtrA -= shiftL;
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_init( struct bbs_Context* cpA,
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					    struct bts_Int32Mat* ptrA )
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_init( cpA, &ptrA->arrE );
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_exit( struct bbs_Context* cpA,
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					    struct bts_Int32Mat* ptrA )
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_exit( cpA, &ptrA->arrE );
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
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/* ---- \ghd{ operators } -------------------------------------------------- */
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_create( struct bbs_Context* cpA,
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  struct bts_Int32Mat* ptrA,
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32 widthA,
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				          struct bbs_MemSeg* mspA )
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_create( cpA, &ptrA->arrE, widthA * widthA, mspA );
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = widthA;
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_Int32Mat_copy( struct bbs_Context* cpA,
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					    struct bts_Int32Mat* ptrA,
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						const struct bts_Int32Mat* srcPtrA )
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ptrA->widthE != srcPtrA->widthE )
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "void bts_Int32Mat_copy( struct bts_Int32Mat* ptrA, struct bts_Int32Mat* srcPtrA ):\n"
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			       "size mismatch" );
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int32Arr_copy( cpA, &ptrA->arrE, &srcPtrA->arrE );
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memSize( struct bbs_Context* cpA,
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const struct bts_Int32Mat *ptrA )
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return  bbs_SIZEOF16( uint32 )
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( uint32 ) /* version */
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->widthE )
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_Int32Arr_memSize( cpA, &ptrA->arrE );
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memWrite( struct bbs_Context* cpA,
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const struct bts_Int32Mat* ptrA,
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint16* memPtrA )
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bts_Int32Mat_memSize( cpA, ptrA );
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bts_INT32MAT_VERSION, memPtrA );
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->widthE, memPtrA );
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int32Arr_memWrite( cpA, &ptrA->arrE, memPtrA );
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_Int32Mat_memRead( struct bbs_Context* cpA,
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 struct bts_Int32Mat* ptrA,
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const uint16* memPtrA,
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				             struct bbs_MemSeg* mspA )
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bts_INT32MAT_VERSION, memPtrA );
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->widthE, memPtrA );
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int32Arr_memRead( cpA, &ptrA->arrE, memPtrA, mspA );
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bts_Int32Mat_memSize( cpA, ptrA ) )
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bts_Int32Mat_memRead( const struct bts_Int32Mat* ptrA, const void* memPtrA ):\n"
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                  "size mismatch" );
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bts_Int32Mat_solve( struct bbs_Context* cpA,
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const int32* matA,
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int32 matWidthA,
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const int32* inVecA,
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int32* outVecA,
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int32 bbpA,
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int32* tmpMatA,
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int32* tmpVecA )
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_memcpy32( tmpMatA, matA, ( matWidthA * matWidthA ) * bbs_SIZEOF32( int32 ) );
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bts_Int32Mat_solve2( cpA,
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		                        tmpMatA,
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								matWidthA,
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								inVecA,
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								outVecA,
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								bbpA,
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								tmpVecA );
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bts_Int32Mat_solve2( struct bbs_Context* cpA,
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32* matA,
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32 matWidthA,
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  const int32* inVecA,
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32* outVecA,
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32 bbpA,
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  int32* tmpVecA )
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sizeL = matWidthA;
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 bbpL = bbpA;
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iL, jL, kL;
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iPivL;
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 jPivL;
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* vecL      = outVecA;
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* matL      = matA;
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* checkArrL = tmpVecA;
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeL; iL++ )
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		checkArrL[ iL ] = 0;
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_memcpy32( outVecA, inVecA, sizeL * bbs_SIZEOF32( int32 ) );
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	iPivL = 0;
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( kL = 0; kL < sizeL; kL++ )
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* find pivot */
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 maxAbsL = 0;
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32* pivRowL;
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 bbp_pivRowL, bbp_vecL, shiftL;
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		jPivL = -1;
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( checkArrL[ iL ] != 1 )
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32* rowL = matL + ( iL * sizeL );
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( jL = 0; jL < sizeL; jL++ )
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( checkArrL[ jL ] == 0 )
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						int32 absElemL = rowL[ jL ];
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						if( absElemL < 0 ) absElemL = -absElemL;
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						if( maxAbsL < absElemL )
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						{
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							maxAbsL = absElemL;
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							iPivL = iL;
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							jPivL = jL;
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						}
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else if( checkArrL[ jL ] > 1 )
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						return FALSE;
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* successfull ? */
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( jPivL < 0 )
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return FALSE;
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		checkArrL[ jPivL ]++;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* exchange rows to put pivot on diagonal, if neccessary */
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( iPivL != jPivL )
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* row1PtrL = matL + ( iPivL * sizeL );
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* row2PtrL = matL + ( jPivL * sizeL );
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < sizeL; jL++ )
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 tmpL = *row1PtrL;
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*row1PtrL++ = *row2PtrL;
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*row2PtrL++ = tmpL;
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 tmpL = vecL[ jPivL ];
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				vecL[ jPivL ] = vecL[ iPivL ];
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				vecL[ iPivL ] = tmpL;
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* now index jPivL specifies pivot row and maximum element */
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/**	Overflow protection: only if the highest bit of the largest matrix element is set,
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 *	we need to shift the whole matrix and the right side vector 1 bit to the right,
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 *	to make sure there can be no overflow when the pivot row gets subtracted from the
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 *	other rows.
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 *	Getting that close to overflow is a rare event, so this shift will happen only
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 *	occasionally, or not at all.
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		 */
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( maxAbsL & 1073741824 )  /*( 1 << 30 )*/
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* right shift matrix by 1 */
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 iL = sizeL * sizeL;
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32* ptrL = matL;
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( iL-- )
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*ptrL = ( *ptrL + 1 ) >> 1;
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptrL++;
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* right shift right side vector by 1 */
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			iL = sizeL;
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptrL = vecL;
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			while( iL-- )
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*ptrL = ( *ptrL + 1 ) >> 1;
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptrL++;
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* decrement bbpL */
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbpL--;
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* reduce elements of pivot row to 15 bit */
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		pivRowL = matL + jPivL * sizeL;
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbp_pivRowL = bbpL;
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bts_Int32Mat_reduceToNBits( pivRowL, sizeL, &bbp_pivRowL, 15 );
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* scale pivot row such that maximum equals 1 */
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 maxL = pivRowL[ jPivL ];
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 bbp_maxL = bbp_pivRowL;
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 factorL = 1073741824 / maxL; /*( 1 << 30 )*/
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < sizeL; jL++ )
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				pivRowL[ jL ] = ( pivRowL[ jL ] * factorL + ( 1 << 14 ) ) >> 15;
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbp_pivRowL = 15;
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* set to 1 to avoid computational errors */
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pivRowL[ jPivL ] = ( int32 )1 << bbp_pivRowL;
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			shiftL = 30 - bts_absIntLog2( vecL[ jPivL ] );
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vecL[ jPivL ] = ( vecL[ jPivL ] << shiftL ) / maxL;
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbp_vecL = bbpL + shiftL - bbp_maxL;
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			bbs_int32ReduceToNBits( &( vecL[ jPivL ] ), &bbp_vecL, 15 );
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* subtract pivot row from all other rows */
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( iL != jPivL )
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32* rowPtrL = matL + iL * sizeL;
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 tmpL = *( rowPtrL + jPivL );
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 bbp_tmpL = bbpL;
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				bbs_int32ReduceToNBits( &tmpL, &bbp_tmpL, 15 );
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				shiftL = bbp_tmpL + bbp_pivRowL - bbpL;
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( shiftL > 0 )
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( jL = 0; jL < sizeL; jL++ )
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*rowPtrL++ -= ( ( ( tmpL * pivRowL[ jL ] ) >> ( shiftL - 1 ) ) + 1 ) >> 1;
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( jL = 0; jL < sizeL; jL++ )
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						*rowPtrL++ -= ( tmpL * pivRowL[ jL ] ) << -shiftL;
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				shiftL = bbp_tmpL + bbp_vecL - bbpL;
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( shiftL > 0 )
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					vecL[ iL ] -= ( ( ( tmpL * vecL[ jPivL ] ) >> ( shiftL - 1 ) ) + 1 ) >> 1;
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					vecL[ iL ] -= ( tmpL * vecL[ jPivL ] ) << -shiftL;
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* change bbp of pivot row back to bbpL */
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shiftL = bbpL - bbp_pivRowL;
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( shiftL >= 0 )
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < sizeL; jL++ )
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				pivRowL[ jL ] <<= shiftL;
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			shiftL = -shiftL;
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < sizeL; jL++ )
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				pivRowL[ jL ] = ( ( pivRowL[ jL ] >> ( shiftL - 1 ) ) + 1 ) >> 1;
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shiftL = bbpL - bbp_vecL;
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( shiftL >= 0 )
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vecL[ jPivL ] <<= shiftL;
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			shiftL = -shiftL;
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vecL[ jPivL ] = ( ( vecL[ jPivL ] >> ( shiftL - 1 ) ) + 1 ) >> 1;
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectif( sizeL <= 5 ) bts_Int32Mat_print( matL, vecL, sizeL, bbpL );
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}	/* of kL */
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* in case bbpL has been decreased by the overflow protection, change it back now */
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbpA > bbpL )
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* find largest element of solution vector */
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 maxL = 0;
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, shiftL;
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ )
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 xL = vecL[ iL ];
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( xL < 0 ) xL = -xL;
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( xL > maxL ) maxL = xL;
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* check whether we can left shift without overflow */
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shiftL = 30 - bts_absIntLog2( maxL );
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( shiftL < ( bbpA - bbpL ) )
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/*
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			    bbs_WARNING1( "flag bts_Int32Mat_solve2( ... ): getting overflow when trying to "
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				"compute solution vector with bbp = %d. Choose smaller bbp.\n", bbpA );
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			*/
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return FALSE;
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* shift left */
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		shiftL = bbpA - bbpL;
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < sizeL; iL++ ) vecL[ iL ] <<= shiftL;
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return TRUE;
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
491