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/CompactMat.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 Project/** Returns dot product of inVec with indexed row
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project    The result is a floating point expresstion:
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		upper 16 bit: signed value
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		lower 16 bit: signed exponent
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bts_CompactMat_fltDotPrdRow( struct bbs_Context* cpA,
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								   struct bts_CompactMat* ptrA,
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							       const int16* inVecA,
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							       uint32 inNormBitsA,
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							       uint32 rowA )
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* rowPtrL = ptrA->cpsArrE.arrPtrE + ptrA->wordsPerRowE * rowA;
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* extract row-header info */
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL = *rowPtrL++;
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sizeL = *rowPtrL++;
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 factorManL = *rowPtrL++;
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 factorExpL = *rowPtrL++;
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rowNormBitsL = *rowPtrL++;
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* consider possible overflow */
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 overflowBitsL = ( inNormBitsA + rowNormBitsL >= 31 ) ? inNormBitsA + rowNormBitsL - 31 : 0;
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* inPtrL = inVecA + offsL;
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	count_t iL;
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sumL = 0;
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( overflowBitsL == 0 ) /* raw dot product fits in int32 */
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		switch( ptrA->bitsPerValueE )
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 16:
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL > 0; iL-- ) sumL += ( ( int32 )*rowPtrL++ * ( int32 )*inPtrL++ );
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			#ifndef HW_TMS320C5x /* platforms that don't have int8 must use the 'default' implementation */
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 8:
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint16* dpL = ( uint16* )rowPtrL;
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 8; iL -= 8 )
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )  dpL[ 0 ]         * ( int32 )inPtrL[ 0 ] );
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )( dpL[ 0 ] >>  8 ) * ( int32 )inPtrL[ 1 ] );
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )  dpL[ 1 ]         * ( int32 )inPtrL[ 2 ] );
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )( dpL[ 1 ] >>  8 ) * ( int32 )inPtrL[ 3 ] );
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )  dpL[ 2 ]         * ( int32 )inPtrL[ 4 ] );
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )( dpL[ 2 ] >>  8 ) * ( int32 )inPtrL[ 5 ] );
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )  dpL[ 3 ]         * ( int32 )inPtrL[ 6 ] );
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )( dpL[ 3 ] >>  8 ) * ( int32 )inPtrL[ 7 ] );
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dpL += 4;
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 8;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( ; iL >= 2; iL -= 2 )
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )  *dpL         * ( int32 )inPtrL[ 0 ] );
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )( *dpL >>  8 ) * ( int32 )inPtrL[ 1 ] );
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dpL++;
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 2;
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( iL > 0 )
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int8 )*dpL++ * ( int32 )inPtrL[ 0 ] );
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 6:
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint16* dpL = ( uint16* )rowPtrL;
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 8; iL -= 8 )
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )     ( dpL[ 0 ] <<  2 )                                  * ( int32 )inPtrL[ 0 ] );
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  4 )                       & 0x00FC ) * ( int32 )inPtrL[ 1 ] );
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 0 ] >> 10 ) | ( dpL[ 1 ] << 6 ) ) & 0x00FC ) * ( int32 )inPtrL[ 2 ] );
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 1 ]       )                       & 0x00FC ) * ( int32 )inPtrL[ 3 ] );
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  6 )                       & 0x00FC ) * ( int32 )inPtrL[ 4 ] );
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 1 ] >> 12 ) | ( dpL[ 2 ] << 4 ) ) & 0x00FC ) * ( int32 )inPtrL[ 5 ] );
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 2 ] >>  2 )                       & 0x00FC ) * ( int32 )inPtrL[ 6 ] );
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 2 ] >>  8 )                       & 0x00FC ) * ( int32 )inPtrL[ 7 ] );
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 2 );
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dpL += 3;
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 8;
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 0 ) lSumL += ( ( int8 )     ( dpL[ 0 ] <<  2 )                                  * ( int32 )inPtrL[ 0 ] );
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 1 ) lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  4 )                       & 0x00FC ) * ( int32 )inPtrL[ 1 ] );
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 2 ) lSumL += ( ( int8 ) ( ( ( dpL[ 0 ] >> 10 ) | ( dpL[ 1 ] << 6 ) ) & 0x00FC ) * ( int32 )inPtrL[ 2 ] );
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 3 ) lSumL += ( ( int8 ) (   ( dpL[ 1 ]       )                       & 0x00FC ) * ( int32 )inPtrL[ 3 ] );
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 4 ) lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  6 )                       & 0x00FC ) * ( int32 )inPtrL[ 4 ] );
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 5 ) lSumL += ( ( int8 ) ( ( ( dpL[ 1 ] >> 12 ) | ( dpL[ 2 ] << 4 ) ) & 0x00FC ) * ( int32 )inPtrL[ 5 ] );
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 6 ) lSumL += ( ( int8 ) (   ( dpL[ 2 ] >>  2 )                       & 0x00FC ) * ( int32 )inPtrL[ 6 ] );
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 2 );
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 5:
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				const uint16* dpL = ( uint16* )rowPtrL;
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 16; iL -= 16 )
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )     ( dpL[ 0 ] <<  3 )                                  * ( int32 )inPtrL[  0 ] );
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  2 )                       & 0x00F8 ) * ( int32 )inPtrL[  1 ] );
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  7 )                       & 0x00F8 ) * ( int32 )inPtrL[  2 ] );
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 0 ] >> 12 ) | ( dpL[ 1 ] << 4 ) ) & 0x00F8 ) * ( int32 )inPtrL[  3 ] );
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  1 )                       & 0x00F8 ) * ( int32 )inPtrL[  4 ] );
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  6 )                       & 0x00F8 ) * ( int32 )inPtrL[  5 ] );
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 1 ] >> 11 ) | ( dpL[ 2 ] << 5 ) ) & 0x00F8 ) * ( int32 )inPtrL[  6 ] );
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 2 ]       )                       & 0x00F8 ) * ( int32 )inPtrL[  7 ] );
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 2 ] >>  5 )                       & 0x00F8 ) * ( int32 )inPtrL[  8 ] );
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 2 ] >> 10 ) | ( dpL[ 3 ] << 6 ) ) & 0x00F8 ) * ( int32 )inPtrL[  9 ] );
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 3 ] <<  1 )                       & 0x00F8 ) * ( int32 )inPtrL[ 10 ] );
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 3 ] >>  4 )                       & 0x00F8 ) * ( int32 )inPtrL[ 11 ] );
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) ( ( ( dpL[ 3 ] >>  9 ) | ( dpL[ 4 ] << 7 ) ) & 0x00F8 ) * ( int32 )inPtrL[ 12 ] );
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 4 ] <<  2 )                       & 0x00F8 ) * ( int32 )inPtrL[ 13 ] );
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 4 ] >>  3 )                       & 0x00F8 ) * ( int32 )inPtrL[ 14 ] );
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 ) (   ( dpL[ 4 ] >>  8 )                       & 0x00F8 ) * ( int32 )inPtrL[ 15 ] );
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 3 );
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					dpL += 5;
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 16;
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  0 ) lSumL += ( ( int8 )     ( dpL[ 0 ] <<  3 )                                  * ( int32 )inPtrL[  0 ] );
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  1 ) lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  2 )                       & 0x00F8 ) * ( int32 )inPtrL[  1 ] );
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  2 ) lSumL += ( ( int8 ) (   ( dpL[ 0 ] >>  7 )                       & 0x00F8 ) * ( int32 )inPtrL[  2 ] );
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  3 ) lSumL += ( ( int8 ) ( ( ( dpL[ 0 ] >> 12 ) | ( dpL[ 1 ] << 4 ) ) & 0x00F8 ) * ( int32 )inPtrL[  3 ] );
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  4 ) lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  1 )                       & 0x00F8 ) * ( int32 )inPtrL[  4 ] );
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  5 ) lSumL += ( ( int8 ) (   ( dpL[ 1 ] >>  6 )                       & 0x00F8 ) * ( int32 )inPtrL[  5 ] );
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  6 ) lSumL += ( ( int8 ) ( ( ( dpL[ 1 ] >> 11 ) | ( dpL[ 2 ] << 5 ) ) & 0x00F8 ) * ( int32 )inPtrL[  6 ] );
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  7 ) lSumL += ( ( int8 ) (   ( dpL[ 2 ]       )                       & 0x00F8 ) * ( int32 )inPtrL[  7 ] );
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  8 ) lSumL += ( ( int8 ) (   ( dpL[ 2 ] >>  5 )                       & 0x00F8 ) * ( int32 )inPtrL[  8 ] );
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL >  9 ) lSumL += ( ( int8 ) ( ( ( dpL[ 2 ] >> 10 ) | ( dpL[ 3 ] << 6 ) ) & 0x00F8 ) * ( int32 )inPtrL[  9 ] );
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 10 ) lSumL += ( ( int8 ) (   ( dpL[ 3 ] <<  1 )                       & 0x00F8 ) * ( int32 )inPtrL[ 10 ] );
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 11 ) lSumL += ( ( int8 ) (   ( dpL[ 3 ] >>  4 )                       & 0x00F8 ) * ( int32 )inPtrL[ 11 ] );
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 12 ) lSumL += ( ( int8 ) ( ( ( dpL[ 3 ] >>  9 ) | ( dpL[ 4 ] << 7 ) ) & 0x00F8 ) * ( int32 )inPtrL[ 12 ] );
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 13 ) lSumL += ( ( int8 ) (   ( dpL[ 4 ] <<  2 )                       & 0x00F8 ) * ( int32 )inPtrL[ 13 ] );
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL > 14 ) lSumL += ( ( int8 ) (   ( dpL[ 4 ] >>  3 )                       & 0x00F8 ) * ( int32 )inPtrL[ 14 ] );
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 3 );
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 4:
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 4; iL -= 4 )
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint16 v1L = *rowPtrL++;
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L << 4 )        ) * ( int32 )inPtrL[ 0 ] );
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L      ) & 0xF0 ) * ( int32 )inPtrL[ 1 ] );
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L >> 4 ) & 0xF0 ) * ( int32 )inPtrL[ 2 ] );
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L >> 8 ) & 0xF0 ) * ( int32 )inPtrL[ 3 ] );
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 4;
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 4 );
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint16 v1L = *rowPtrL++;
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L << 4 )        ) * ( int32 )inPtrL[ 0 ] );
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L      ) & 0xF0 ) * ( int32 )inPtrL[ 1 ] );
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L >> 4 ) & 0xF0 ) * ( int32 )inPtrL[ 2 ] );
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL >> 4 );
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			#endif /*ifndef HW_TMS320C5x*/
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* The default case can process all bit sizes including those that are explicitly encoded above
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			 * Use the default for all bit sizes when the platform cannot handle the int8 data type (e.g. HW_TMS320C5x)
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			 */
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			default:
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 bfL = ( ( uint32 )*rowPtrL++ ) << 16;
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 bitsL = ptrA->bitsPerValueE;
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint16 adjL = 16 - bitsL;
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 mkL = ( ( 1 << bitsL ) - 1 ) << adjL;
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 srL = bitsL;
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ )
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( srL > 16 )
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						bfL = ( ( ( uint32 )*rowPtrL++ ) << 16 ) | ( bfL >> 16 );
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						srL -= 16;
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int16 )( ( bfL >> srL ) & mkL ) * ( int32 )inPtrL[ iL ] ) >> adjL;
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					srL += bitsL;
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else /* raw dot product does not fit in int32 */
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 roundL = 1 << ( overflowBitsL - 1 );
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		switch( ptrA->bitsPerValueE )
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 16:
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL > 0; iL-- ) sumL += ( ( ( int32 )*rowPtrL++ * ( int32 )*inPtrL++ ) + roundL ) >> overflowBitsL;
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 8:
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 2; iL -= 2 )
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint16 v1L = *rowPtrL++;
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL =   ( ( int8 )  v1L         * ( int32 )inPtrL[ 0 ] )
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						          + ( ( int8 )( v1L >>  8 ) * ( int32 )inPtrL[ 1 ] );
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( lSumL + roundL ) >> overflowBitsL;
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 2;
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( iL > 0 )
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( ( int8 )*rowPtrL++ * ( int32 )inPtrL[ 0 ] ) + roundL ) >> overflowBitsL;
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			case 4:
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = sizeL; iL >= 4; iL -= 4 )
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint16 v1L = *rowPtrL++;
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L << 4 )        ) * ( int32 )inPtrL[ 0 ] );
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L      ) & 0xF0 ) * ( int32 )inPtrL[ 1 ] );
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L >> 4 ) & 0xF0 ) * ( int32 )inPtrL[ 2 ] );
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					lSumL += ( ( int8 )( ( v1L >> 8 ) & 0xF0 ) * ( int32 )inPtrL[ 3 ] );
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					inPtrL += 4;
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( lSumL >> 4 ) + roundL ) >> overflowBitsL;
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					uint16 v1L = *rowPtrL++;
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					int32 lSumL = 0;
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L << 4 )        ) * ( int32 )inPtrL[ 0 ] );
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L      ) & 0xF0 ) * ( int32 )inPtrL[ 1 ] );
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( iL-- > 0 ) lSumL += ( ( int8 )( ( v1L >> 4 ) & 0xF0 ) * ( int32 )inPtrL[ 2 ] );
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( lSumL >> 4 ) + roundL ) >> overflowBitsL;
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			break;
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			default:
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 bfL = ( ( uint32 )*rowPtrL++ ) << 16;
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 bitsL = ptrA->bitsPerValueE;
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint16 adjL = 16 - bitsL;
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 mkL = ( ( 1 << bitsL ) - 1 ) << adjL;
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				uint32 srL = bitsL;
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 lRoundL = roundL << adjL;
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				int32 lAdjL = overflowBitsL + adjL;
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( iL = 0; iL < sizeL; iL++ )
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( srL > 16 )
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						bfL = ( ( ( uint32 )*rowPtrL++ ) << 16 ) | ( bfL >> 16 );
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						srL -= 16;
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int16 )( ( bfL >> srL ) & mkL ) * ( int32 )inPtrL[ iL ] + lRoundL ) >> lAdjL;
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					srL += bitsL;
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute result */
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 resultManL;
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 resultExpL;
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 resultLogL;
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_mulS32( sumL, factorManL, &resultManL, &resultExpL );
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultExpL += factorExpL + overflowBitsL;
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultLogL = bbs_intLog2( resultManL > 0 ? resultManL : -resultManL );
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( resultLogL < 30 )
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			resultManL <<= 30 - resultLogL;
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			resultExpL  -= 30 - resultLogL;
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultManL = ( ( resultManL >> 15 ) + 1 ) >> 1;
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultExpL = resultExpL + 16;
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return ( ( resultManL & 0x0000FFFF ) << 16 ) | ( resultExpL & 0x0000FFFF );
3297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor / destructor } ----------------------------------- */
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_CompactMat_init( struct bbs_Context* cpA,
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					      struct bts_CompactMat* ptrA )
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = 0;
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bitsPerValueE = 0;
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->wordsPerRowE = 0;
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRowBitsE = 0;
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->cpsArrE );
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_init( cpA, &ptrA->expArrE );
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_CompactMat_exit( struct bbs_Context* cpA,
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					    struct bts_CompactMat* ptrA )
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = 0;
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = 0;
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bitsPerValueE = 0;
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->wordsPerRowE = 0;
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRowBitsE = 0;
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->cpsArrE );
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_exit( cpA, &ptrA->expArrE );
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_CompactMat_create( struct bbs_Context* cpA,
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bts_CompactMat* ptrA,
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    uint32 widthA,
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    uint32 heightA,
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    uint32 bitsA,
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							uint32 maxRowSizeA,
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				            struct bbs_MemSeg* mspA )
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return;
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bitsA < 2 || bitsA > 16 )
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERROR0( "bts_CompactMat_create:\nbitsA must be between 2 and 16" );
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return;
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = widthA;
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = heightA;
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bitsPerValueE = bitsA;
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->wordsPerRowE = 6 /*header + 1*/ + ( ( maxRowSizeA * bitsA ) / ( 8 * sizeof( short ) ) );
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRowBitsE = 0;
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( ptrA->wordsPerRowE & 1 ) != 0 ) ptrA->wordsPerRowE++;
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_create( cpA, &ptrA->cpsArrE, heightA * ptrA->wordsPerRowE, mspA );
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_fill( cpA, &ptrA->cpsArrE, 0 );
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_create( cpA, &ptrA->expArrE, ptrA->heightE, mspA );
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_fill( cpA, &ptrA->expArrE, 0 );
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_CompactMat_copy( struct bbs_Context* cpA,
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					      struct bts_CompactMat* ptrA,
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						  const struct bts_CompactMat* srcPtrA )
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->widthE = srcPtrA->widthE;
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->heightE = srcPtrA->heightE;
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->bitsPerValueE = srcPtrA->bitsPerValueE;
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->wordsPerRowE = srcPtrA->wordsPerRowE;
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	ptrA->maxRowBitsE = srcPtrA->maxRowBitsE;
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_copy( cpA, &ptrA->cpsArrE, &srcPtrA->cpsArrE );
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_size( cpA, &ptrA->expArrE, ptrA->heightE );
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ I/O } -------------------------------------------------------- */
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_CompactMat_memSize( struct bbs_Context* cpA,
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const struct bts_CompactMat *ptrA )
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return  bbs_SIZEOF16( uint32 )
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( uint32 ) /* version */
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->widthE )
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->heightE )
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->bitsPerValueE )
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->wordsPerRowE )
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_SIZEOF16( ptrA->maxRowBitsE )
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		  + bbs_Int16Arr_memSize( cpA, &ptrA->cpsArrE );
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_CompactMat_memWrite( struct bbs_Context* cpA,
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  const struct bts_CompactMat* ptrA,
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							  uint16* memPtrA )
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL = bts_CompactMat_memSize( cpA, ptrA );
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &memSizeL, memPtrA );
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWriteUInt32( bts_COMPACT_MAT_VERSION, memPtrA );
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->widthE, memPtrA );
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->heightE, memPtrA );
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->bitsPerValueE, memPtrA );
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->wordsPerRowE, memPtrA );
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memWrite32( &ptrA->maxRowBitsE, memPtrA );
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memWrite( cpA, &ptrA->cpsArrE, memPtrA );
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bts_CompactMat_memRead( struct bbs_Context* cpA,
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 struct bts_CompactMat* ptrA,
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							 const uint16* memPtrA,
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				             struct bbs_MemSeg* mspA )
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 memSizeL, versionL;
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( bbs_Context_error( cpA ) ) return 0;
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &memSizeL, memPtrA );
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memReadVersion32( cpA, &versionL, bts_COMPACT_MAT_VERSION, memPtrA );
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->widthE, memPtrA );
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->heightE, memPtrA );
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->bitsPerValueE, memPtrA );
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->wordsPerRowE, memPtrA );
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_memRead32( &ptrA->maxRowBitsE, memPtrA );
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	memPtrA += bbs_Int16Arr_memRead( cpA, &ptrA->cpsArrE, memPtrA, mspA );
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( memSizeL != bts_CompactMat_memSize( cpA, ptrA ) )
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		bbs_ERR0( bbs_ERR_CORRUPT_DATA, "uint32 bts_CompactMat_memRead( const struct bts_CompactMat* ptrA, const void* memPtrA ):\n"
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project                  "size mismatch" );
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_create( cpA, &ptrA->expArrE, ptrA->heightE, mspA );
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_Int16Arr_fill( cpA, &ptrA->expArrE, 0 );
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return memSizeL;
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bts_CompactMat_map( struct bbs_Context* cpA,
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const struct bts_CompactMat* ptrA,
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 const int16* inVecA,
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int16* outVecA,
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						 int16* outExpPtrA )
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 inNormBitsL = bbs_intLog2( bbs_vecNorm16( inVecA, ptrA->widthE ) ) + 1;
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16* expArrL = ( ( struct bts_CompactMat* )ptrA )->expArrE.arrPtrE;
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 maxExpL = -32767;
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < ptrA->heightE; iL++ )
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 fltL = bts_CompactMat_fltDotPrdRow( cpA, ( struct bts_CompactMat* )ptrA, inVecA, inNormBitsL, iL );
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		outVecA[ iL ] = fltL >> 16;
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		expArrL[ iL ] = fltL & 0x0000FFFF;
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		maxExpL = ( expArrL[ iL ] > maxExpL ) ? expArrL[ iL ] : maxExpL;
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( outExpPtrA != NULL ) *outExpPtrA = maxExpL;
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < ptrA->heightE; iL++ )
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 shrL = maxExpL - expArrL[ iL ];
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( shrL > 0 )
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			outVecA[ iL ] = ( ( outVecA[ iL ] >> ( shrL - 1 ) ) + 1 ) >> 1;
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
554