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_BasicEm/Math.h"
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h"
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- related objects  --------------------------------------------------- */
237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- typedefs ----------------------------------------------------------- */
257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- constants ---------------------------------------------------------- */
277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ external functions } ----------------------------------------- */
337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*                                                                           */
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if defined( HW_SSE2 )
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	extern int32 bbs_dotProduct_128SSE2( const int16* vec1A, const int16* vec2A, uint32 sizeA );
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	extern int32 bbs_dotProduct_u128SSE2( const int16* vec1A, const int16* vec2A, uint32 sizeA );
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if defined( HW_FR71 )
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 bbs_dotProduct_fr71( const int16* vec1A, const int16* vec2A, uint32 sizeA );
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16 bbs_sqrt32( uint32 valA )
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 rootL = 0;
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL = 0;
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x10 ) ) != 0 ) << 4;
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x08 ) ) != 0 ) << 3;
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x04 ) ) != 0 ) << 2;
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x02 ) ) != 0 ) << 1;
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	switch( expL >> 1 )
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 15: rootL += ( ( rootL + 0x8000 ) * ( rootL + 0x8000 ) <= valA ) << 15;
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 14: rootL += ( ( rootL + 0x4000 ) * ( rootL + 0x4000 ) <= valA ) << 14;
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 13: rootL += ( ( rootL + 0x2000 ) * ( rootL + 0x2000 ) <= valA ) << 13;
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 12: rootL += ( ( rootL + 0x1000 ) * ( rootL + 0x1000 ) <= valA ) << 12;
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 11: rootL += ( ( rootL + 0x0800 ) * ( rootL + 0x0800 ) <= valA ) << 11;
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 10: rootL += ( ( rootL + 0x0400 ) * ( rootL + 0x0400 ) <= valA ) << 10;
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 9:  rootL += ( ( rootL + 0x0200 ) * ( rootL + 0x0200 ) <= valA ) << 9;
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 8:  rootL += ( ( rootL + 0x0100 ) * ( rootL + 0x0100 ) <= valA ) << 8;
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 7:  rootL += ( ( rootL + 0x0080 ) * ( rootL + 0x0080 ) <= valA ) << 7;
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 6:  rootL += ( ( rootL + 0x0040 ) * ( rootL + 0x0040 ) <= valA ) << 6;
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 5:  rootL += ( ( rootL + 0x0020 ) * ( rootL + 0x0020 ) <= valA ) << 5;
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 4:  rootL += ( ( rootL + 0x0010 ) * ( rootL + 0x0010 ) <= valA ) << 4;
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 3:  rootL += ( ( rootL + 0x0008 ) * ( rootL + 0x0008 ) <= valA ) << 3;
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 2:  rootL += ( ( rootL + 0x0004 ) * ( rootL + 0x0004 ) <= valA ) << 2;
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 1:  rootL += ( ( rootL + 0x0002 ) * ( rootL + 0x0002 ) <= valA ) << 1;
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		case 0:  rootL += ( ( rootL + 0x0001 ) * ( rootL + 0x0001 ) <= valA ) << 0;
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( uint16 )rootL;
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint8 bbs_sqrt16( uint16 valA )
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 rootL = 0;
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x80 ) * ( rootL + 0x80 ) <= valA ) << 7;
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x40 ) * ( rootL + 0x40 ) <= valA ) << 6;
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x20 ) * ( rootL + 0x20 ) <= valA ) << 5;
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x10 ) * ( rootL + 0x10 ) <= valA ) << 4;
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x08 ) * ( rootL + 0x08 ) <= valA ) << 3;
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x04 ) * ( rootL + 0x04 ) <= valA ) << 2;
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x02 ) * ( rootL + 0x02 ) <= valA ) << 1;
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	rootL += ( ( rootL + 0x01 ) * ( rootL + 0x01 ) <= valA ) << 0;
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( uint8 )rootL;
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/* table of sqrt and slope values */
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32 bbs_fastSqrt32_tableG[] =
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	268435456, 1016, 272596992, 1000, 276692992, 987, 280735744, 972,
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	284717056, 959, 288645120, 946, 292519936, 933, 296341504, 922,
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	300118016, 910, 303845376, 899, 307527680, 889, 311169024, 878,
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	314765312, 869, 318324736, 858, 321839104, 850, 325320704, 840,
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	328761344, 832, 332169216, 824, 335544320, 815, 338882560, 807,
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	342188032, 799, 345460736, 792, 348704768, 785, 351920128, 777,
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	355102720, 771, 358260736, 764, 361390080, 757, 364490752, 751,
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	367566848, 745, 370618368, 739, 373645312, 732, 376643584, 727,
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	379621376, 722, 382578688, 715, 385507328, 711, 388419584, 705,
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	391307264, 700, 394174464, 695, 397021184, 689, 399843328, 686,
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	402653184, 680, 405438464, 675, 408203264, 672, 410955776, 666,
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	413683712, 663, 416399360, 658, 419094528, 653, 421769216, 650,
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	424431616, 646, 427077632, 641, 429703168, 638, 432316416, 634,
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	434913280, 630, 437493760, 627, 440061952, 622, 442609664, 620,
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	445149184, 615, 447668224, 613, 450179072, 609, 452673536, 605,
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	455151616, 602, 457617408, 600, 460075008, 595, 462512128, 593,
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	464941056, 590, 467357696, 587, 469762048, 583, 472150016, 581,
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	474529792, 578, 476897280, 575, 479252480, 572, 481595392, 569,
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	483926016, 567, 486248448, 564, 488558592, 561, 490856448, 559,
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	493146112, 556, 495423488, 553, 497688576, 552, 499949568, 548,
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	502194176, 546, 504430592, 544, 506658816, 541, 508874752, 539,
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	511082496, 537, 513282048, 534, 515469312, 533, 517652480, 529,
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	519819264, 528, 521981952, 526, 524136448, 523, 526278656, 521,
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	528412672, 519, 530538496, 517, 532656128, 515, 534765568, 514
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16 bbs_fastSqrt32( uint32 valA )
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL = 0;
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 valL;
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL;
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 indexL = 0;
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA == 0 ) return 0;
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute closest even size exponent of valA */
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x10 ) ) != 0 ) << 4;
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x08 ) ) != 0 ) << 3;
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x04 ) ) != 0 ) << 2;
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x02 ) ) != 0 ) << 1;
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	valL = ( ( valA << ( 30 - expL ) ) - 1073741824 ); /* ( 1 << 30 ) */
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	offsL = ( ( valL & 0x01FFFFFF ) + ( 1 << 12 ) ) >> 13;
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	indexL = ( valL >> 24 ) & 0xFE;
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( bbs_fastSqrt32_tableG[ indexL ] + offsL * bbs_fastSqrt32_tableG[ indexL + 1 ] ) >> ( 28 - ( expL >> 1 ) );
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* table of 1/sqrt (1.31) and negative slope (.15) values
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project   referenced in b_GaborCueEm/focusDispAsm.s55, do not rename or remove ! */
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32 bbs_invSqrt32_tableG[] =
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2147483648u, 1001, 2114682880, 956, 2083356672, 915, 2053373952, 877,
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2024636416, 840, 1997111296, 808, 1970634752, 776, 1945206784, 746,
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1920761856, 720, 1897168896, 693, 1874460672, 669, 1852538880, 646,
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1831370752, 625, 1810890752, 604, 1791098880, 584, 1771962368, 567,
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1753382912, 548, 1735426048, 533, 1717960704, 516, 1701052416, 502,
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1684602880, 487, 1668644864, 474, 1653112832, 461, 1638006784, 448,
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1623326720, 436, 1609039872, 426, 1595080704, 414, 1581514752, 404,
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1568276480, 394, 1555365888, 384, 1542782976, 375, 1530494976, 367,
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1518469120, 357, 1506770944, 350, 1495302144, 342, 1484095488, 334,
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1473150976, 327, 1462435840, 320, 1451950080, 313, 1441693696, 307,
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1431633920, 300, 1421803520, 294, 1412169728, 289, 1402699776, 282,
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1393459200, 277, 1384382464, 272, 1375469568, 266, 1366753280, 262,
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1358168064, 257, 1349746688, 251, 1341521920, 248, 1333395456, 243,
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1325432832, 238, 1317634048, 235, 1309933568, 230, 1302396928, 227,
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1294958592, 222, 1287684096, 219, 1280507904, 216, 1273430016, 211,
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1266515968, 209, 1259667456, 205, 1252950016, 202, 1246330880, 198,
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1239842816, 196, 1233420288, 192, 1227128832, 190, 1220902912, 187,
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1214775296, 184, 1208745984, 181, 1202814976, 179, 1196949504, 176,
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1191182336, 173, 1185513472, 171, 1179910144, 169, 1174372352, 166,
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1168932864, 164, 1163558912, 162, 1158250496, 160, 1153007616, 157,
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1147863040, 155, 1142784000, 154, 1137737728, 151, 1132789760, 149,
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1127907328, 148, 1123057664, 145, 1118306304, 144, 1113587712, 142,
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1108934656, 140, 1104347136, 138, 1099825152, 137, 1095335936, 135,
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1090912256, 134, 1086521344, 131, 1082228736, 131, 1077936128, 128
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_invSqrt32( uint32 valA )
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL = 0;
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 valL;
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL;
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 indexL = 0;
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA == 0U ) return 0x80000000;
1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute closest even size exponent of valA */
1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x10 ) ) != 0 ) << 4;
1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x08 ) ) != 0 ) << 3;
1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x04 ) ) != 0 ) << 2;
1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valA >> ( expL + 0x02 ) ) != 0 ) << 1;
1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	valL = ( ( valA << ( 30 - expL ) ) - 1073741824 ); /* ( 1 << 30 ) */
1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	offsL = ( ( valL & 0x01FFFFFF ) + ( 1 << 9 ) ) >> 10;
1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	indexL = ( valL >> 24 ) & 0xFE;
1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( bbs_invSqrt32_tableG[ indexL ] - offsL * bbs_invSqrt32_tableG[ indexL + 1 ] ) >> ( expL >> 1 );
2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* table of 1/( x + 1 ) (2.30) and negative slope (.14) values
2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project   referenced in b_GaborCueEm/focusDispAsm.s55, do not rename or remove ! */
2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst int32 bbs_inv32_tableG[] =
2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1073741824, 1986, 1041203200, 1870, 1010565120, 1762, 981696512, 1664,
2097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	954433536,  1575, 928628736,  1491, 904200192,  1415, 881016832, 1345,
2107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	858980352,  1278, 838041600,  1218, 818085888,  1162, 799047680, 1108,
2117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	780894208,  1059, 763543552,  1013, 746946560,  970,  731054080, 930,
2127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	715816960,  891,  701218816,  856,  687194112,  823,  673710080, 791,
2137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	660750336,  761,  648282112,  732,  636289024,  706,  624721920, 681,
2147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	613564416,  657,  602800128,  635,  592396288,  613,  582352896, 592,
2157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	572653568,  573,  563265536,  554,  554188800,  537,  545390592, 520,
2167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
2177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_inv32( int32 valA )
2197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL = 0;
2227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 signL = ( ( valA >> 30 ) & 0xFFFFFFFE ) + 1;
2237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 valL = signL * valA;
2247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 offsL;
2257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 indexL = 0;
2267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valL <= ( int32 ) 1 ) return 0x40000000 * signL;
2287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* compute size exponent of valL */
2307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valL >> ( expL + 0x10 ) ) != 0 ) << 4;
2317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valL >> ( expL + 0x08 ) ) != 0 ) << 3;
2327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valL >> ( expL + 0x04 ) ) != 0 ) << 2;
2337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valL >> ( expL + 0x02 ) ) != 0 ) << 1;
2347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += ( ( valL >> ( expL + 0x01 ) ) != 0 );
2357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	valL = ( ( valL << ( 30 - expL ) ) - 1073741824 ); /*( 1U << 30 )*/
2377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	offsL = ( ( valL & 0x01FFFFFF ) + ( 1 << 10 ) ) >> 11;
2387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	indexL = ( valL >> 24 ) & 0xFE;
2397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return signL * ( ( ( ( bbs_inv32_tableG[ indexL ] - offsL * bbs_inv32_tableG[ indexL + 1 ] ) >> ( expL - 1 ) ) + 1 ) >> 1 );
2417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_intLog2( uint32 valA )
2467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL = 0;
2487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += 0x10 * ( ( valA >> ( expL + 0x10 ) ) != 0 );
2497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += 0x08 * ( ( valA >> ( expL + 0x08 ) ) != 0 );
2507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += 0x04 * ( ( valA >> ( expL + 0x04 ) ) != 0 );
2517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += 0x02 * ( ( valA >> ( expL + 0x02 ) ) != 0 );
2527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	expL += 0x01 * ( ( valA >> ( expL + 0x01 ) ) != 0 );
2537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return expL;
2547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32 bbs_pow2M1_tableG[] =
2597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	0,			713,	46769127,	721,	94047537,	729,	141840775,	737,
2617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	190154447,	745,	238994221,	753,	288365825,	761,	338275050,	769,
2627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	388727751,	778,	439729846,	786,	491287318,	795,	543406214,	803,
2637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	596092647,	812,	649352798,	821,	703192913,	830,	757619310,	839,
2647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	812638371,	848,	868256550,	857,	924480371,	867,	981316430,	876,
2657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1038771393, 886,	1096851999, 895,	1155565062, 905,	1214917468, 915,
2667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1274916179, 925,	1335568233, 935,	1396880745, 945,	1458860907, 956,
2677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1521515988, 966,	1584853338, 976,	1648880387, 987,	1713604645, 998,
2687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1779033703, 1009,	1845175238, 1020,	1912037006, 1031,	1979626852, 1042,
2697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2047952702, 1053,	2117022572, 1065,	2186844564u, 1077,	2257426868u, 1088,
2707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2328777762u, 1100,	2400905617u, 1112,	2473818892u, 1124,	2547526141u, 1136,
2717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2622036010u, 1149,	2697357237u, 1161,	2773498659u, 1174,	2850469207u, 1187,
2727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2928277909u, 1200,	3006933892u, 1213,	3086446383u, 1226,	3166824708u, 1239,
2737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	3248078296u, 1253,	3330216677u, 1266,	3413249486u, 1280,	3497186464u, 1294,
2747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	3582037455u, 1308,	3667812413u, 1323,	3754521399u, 1337,	3842174584u, 1352,
2757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	3930782250u, 1366,	4020354790u, 1381,	4110902710u, 1396,	4202436633u, 1411
2767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
2777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_pow2M1( uint32 valA )
2797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL = ( valA & 0x03FFFFFF ) >> 10;
2817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint16 indexL = ( ( valA & 0xFC000000 ) >> 26 ) << 1;
2827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_pow2M1_tableG[ indexL ] + offsL * bbs_pow2M1_tableG[ indexL + 1 ];
2837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_pow2( int32 valA )
2887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL = 16 - ( valA >> 27 );
2907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL  = ( uint32 )( valA << 5 );
2917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL == 32 ) return 1;
2927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( 1 << ( 32 - shiftL ) ) + ( bbs_pow2M1( offsL ) >> shiftL );
2937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
2947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
2967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
2977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_exp( int32 valA )
2987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
2997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 adjustedL;
3007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL;
3017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 offsL;
3027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* check boundaries to avoid overflow */
3047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA < -1488522236 )
3057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0;
3077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else if( valA > 1488522236 )
3097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return 0xFFFFFFFF;
3117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
3127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* multily valA with 1/ln(2) in order to use function 2^x instead of e^x */
3147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	adjustedL = ( valA >> 16 ) * 94548 + ( ( ( ( ( uint32 )valA ) & 0x0FFFF ) * 47274 ) >> 15 );
3157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	shiftL = 16 - ( adjustedL >> 27 );
3177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL == 32 ) return 1;
3187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	offsL  = ( uint32 )( adjustedL << 5 );
3197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( ( int32 ) 1 << ( 32 - shiftL ) ) + ( bbs_pow2M1( offsL ) >> shiftL );
3207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
3217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
3237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint16 bbs_satS16( int32 valA )
3257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA > 32767 ) return 32767;
3277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA < -32768 ) return -32768;
3287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return valA;
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#if defined( HW_i586 ) || defined( HW_i686 )
3347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* Windows section */
3367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if defined( WIN32 ) && !defined( WIN64 )
3377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* disable warning "no return value"*/
3397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#pragma warning( disable : 4035 )
3407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/**
3427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * computes a fast dot product using intel MMX, sizeA must be multiple of 16 and >0
3437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
3447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_intelMMX16( const int16* vec1A, const int16* vec2A, uint32 sizeA )
3457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
3467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	__asm
3477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
3487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			push    esi
3497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			push    edi
3507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			mov     eax, vec1A
3527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			mov     ebx, vec2A
3537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			mov     ecx, sizeA
3557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pxor    mm4, mm4
3577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pxor    mm6, mm6
3587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pxor    mm7, mm7
3607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			shr		ecx, 4
3617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		inner_loop_start:
3637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm0, 0[eax]
3647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm4
3657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm1, 0[ebx]
3677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm6
3687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm2, 8[eax]
3707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pmaddwd mm0, mm1
3717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm3, 8[ebx]
3737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm4, 16[eax]
3757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pmaddwd mm2, mm3
3767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm5, 16[ebx]
3787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm0
3797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm6, 24[eax]
3817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pmaddwd mm4, mm5
3827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pmaddwd mm6, 24[ebx]
3847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm2
3857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			add     eax, 32
3877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			add     ebx, 32
3887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			dec     ecx
3907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			jnz     inner_loop_start
3917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm4
3937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm6
3957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movq    mm0, mm7
3977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
3987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			psrlq   mm0, 32
3997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			paddd   mm7, mm0
4017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			movd    eax, mm7
4037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			emms
4057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pop     edi
4067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			pop     esi
4077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
4087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#pragma warning( default : 4035 )
4117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* gcc compiler section */
4137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#elif defined( epl_LINUX ) || defined( CYGWIN )
4147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/**
4167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * computes a fast dot product using intel MMX, sizeA must be multiple of 16 and >0
4177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
4187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_intelMMX16( const int16* vec1A, const int16* vec2A, uint32 sizeA )
4197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 resultL;
4217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	__asm__ __volatile__(
4237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movl %1,%%eax\n\t"
4257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movl %2,%%ebx\n\t"
4267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movl %3,%%ecx\n\t"
4287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pxor %%mm4,%%mm4\n\t"
4307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pxor %%mm6,%%mm6\n\t"
4317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pxor %%mm7, %%mm7\n\t"
4337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"shrl $4, %%ecx\n\t"
4347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"\n1:\t"
4367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 0(%%eax),%%mm0\n\t"
4377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm4,%%mm7\n\t"
4387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 0( %%ebx ),%%mm1\n\t"
4407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm6,%%mm7\n\t"
4417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 8( %%eax ),%%mm2\n\t"
4437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmaddwd %%mm1,%%mm0\n\t"
4447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 8( %%ebx ),%%mm3\n\t"
4467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 16( %%eax ),%%mm4\n\t"
4487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmaddwd %%mm3,%%mm2\n\t"
4497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 16( %%ebx ),%%mm5\n\t"
4517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm0,%%mm7\n\t"
4527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq 24( %%eax ),%%mm6\n\t"
4547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmaddwd %%mm5,%%mm4\n\t"
4557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmaddwd 24( %%ebx ),%%mm6\n\t"
4577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm2,%%mm7\n\t"
4587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"addl $32,%%eax\n\t"
4607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"addl $32,%%ebx\n\t"
4617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"decl %%ecx\n\t"
4637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"jnz 1b\n\t"
4647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm4,%%mm7\n\t"
4667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm6,%%mm7\n\t"
4677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movq  %%mm7,%%mm0\n\t"
4697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"psrlq $32,%%mm0\n\t"
4717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddd %%mm0,%%mm7\n\t"
4737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"movd %%mm7,%0\n\t"
4757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"emms\n\t"
4777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "=&g" ( resultL )
4797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "g" ( vec1A ), "g" ( vec2A ), "g" ( sizeA )
4807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "si", "di", "ax", "bx", "cx", "st", "memory" );
4817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return resultL;
4837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
4847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif /* epl_LINUX, CYGWIN */
4867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif /* HW_i586 || HW_i686 */
4887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
4907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
4917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifdef HW_TMS320C6x
4927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/**
4937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Calls fast assembler version of dotproduct for DSP.
4947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * dotProduct_C62x is implemented in file dotprod.asm and expects input vectors
4957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * of even length.
4967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
4977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_dsp( const int16* vec1A, const int16* vec2A, uint32 sizeA )
4987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
4997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( sizeA & 1 )
5007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 resultL;
5027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultL = dotProduct_C62x( vec1A, vec2A, sizeA - 1 );
5037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return resultL + ( int32 ) *( vec1A + sizeA - 1 ) * *( vec2A + sizeA - 1 );
5047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
5067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return dotProduct_C62x( vec1A, vec2A, sizeA );
5087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif /* HW_TMS320C6x */
5117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 16 dot product for the PS2/EE processor */
5157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* input vectors MUST be 128 bit aligned ! */
5167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if defined( epl_LINUX ) && defined( HW_EE )
5187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_EE( const int16* vec1A, const int16* vec2A, uint32 sizeA )
5207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 resultL = 0,
5227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	      iL = sizeA >> 3,
5237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	      jL = sizeA - ( iL << 3 );
5247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( iL > 0 )
5267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* multiply-add elements of input vectors in sets of 8 */
5287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 accL[ 4 ], t1L, t2L, t3L;
5297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		asm volatile (
5307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pxor %4, %2, %2\n\t"			/* reset 8 accumulators (LO and HI register) to 0 */
5317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmtlo %4\n\t"
5327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmthi %4\n\t"
5337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"\n__begin_loop:\t"
5357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"lq %2,0(%0)\n\t"				/* load 8 pairs of int16 */
5377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"lq %3,0(%1)\n\t"
5387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"addi %0,%0,16\n\t"				/* vec1L += 16 */
5407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"addi %1,%1,16\n\t"				/* vec2L += 16 */
5417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"addi %7,%7,-1\n\t"				/* iL-- */
5427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmaddh %4,%2,%3\n\t"			/* parallel multiply-add of 8 pairs of int16 */
5447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"bgtzl %7,__begin_loop\n\t"		/* if iL > 0 goto _begin_loop */
5467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmflo %2\n\t"					/* parallel add 8 accumulators , store remaining 4 accumulators in tmpL */
5487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"pmfhi %3\n\t"
5497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"paddw %4,%2,%3\n\t"
5507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			"sq %4,0(%8)\n\t"
5517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "=r" ( vec1A ), "=r" ( vec2A ), "=r" ( t1L ), "=r" ( t2L ), "=r" ( t3L )
5527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "0" ( vec1A ), "1" ( vec2A ), "r" ( iL ), "r" ( accL )
5537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		: "memory" );
5547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* add 4 parallel accumulators */
5567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		resultL += accL[ 0 ] + accL[ 1 ] + accL[ 2 ] + accL[ 3 ];
5577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* multiply-add remaining elements of input vectors */
5607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; jL--; ) resultL += ( int32 ) *vec1A++ * *vec2A++;
5617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return resultL;
5637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
5647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
5667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
5687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if defined( HW_ARMv5TE )
5707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* fast 16 dot product for ARM9E cores (DSP extensions).
5727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * input vectors must be 32 bit aligned
5737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
5747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_arm9e( const int16* vec1A, const int16* vec2A, uint32 sizeA )
5757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
5767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 accuL = 0;
5777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* v1PtrL = ( int32* )vec1A;
5797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32* v2PtrL = ( int32* )vec2A;
5807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; sizeA >= 4; sizeA -= 4 )
5827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
5837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		__asm {
5847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		    smlabb accuL, *v1PtrL, *v2PtrL, accuL;
5857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		    smlatt accuL, *v1PtrL, *v2PtrL, accuL;
5867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		v1PtrL++; v2PtrL++;
5887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	    __asm {
5897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		    smlabb accuL, *v1PtrL, *v2PtrL, accuL;
5907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		    smlatt accuL, *v1PtrL, *v2PtrL, accuL;
5917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
5927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		v1PtrL++; v2PtrL++;
5937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
5947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	vec1A = ( int16* )v1PtrL;
5967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	vec2A = ( int16* )v2PtrL;
5977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
5987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* multiply-add remaining elements of input vectors */
5997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; sizeA > 0; sizeA-- ) accuL += ( int32 )*vec1A++ * *vec2A++;
6007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return accuL;
6027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
6057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/**
6097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Computes a fast dot product using standard C
6107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
6117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProduct_stdc( const int16* vec1A, const int16* vec2A, uint32 sizeA )
6127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 accuL = 0;
6147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; sizeA >= 8; sizeA -= 8 )
6167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *vec1A * *vec2A;
6187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 1 ) * *( vec2A + 1 );
6197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 2 ) * *( vec2A + 2 );
6207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 3 ) * *( vec2A + 3 );
6217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 4 ) * *( vec2A + 4 );
6237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 5 ) * *( vec2A + 5 );
6247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 6 ) * *( vec2A + 6 );
6257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		accuL += ( int32 ) *( vec1A + 7 ) * *( vec2A + 7 );
6267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		vec1A += 8;
6287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		vec2A += 8;
6297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; sizeA; sizeA-- ) accuL += ( int32 ) *vec1A++ * *vec2A++;
6327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return accuL;
6347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
6357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
6377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_dotProductInt16( const int16* vec1A, const int16* vec2A, uint32 sizeA )
6397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
6407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* PC */
6417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#if ( defined( HW_i586 ) || defined( HW_i686 ) )
6427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#if defined( HW_SSE2 )
6447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 size16L = sizeA & 0xfffffff0;
6457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( size16L )
6467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( ( (uint32)vec1A & 0xF ) == 0 && ( (uint32)vec2A & 0xF ) == 0 )
6487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				return bbs_dotProduct_128SSE2( vec1A, vec2A, sizeA );
6507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
6527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				return bbs_dotProduct_u128SSE2( vec1A, vec2A, sizeA );
6547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
6567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#elif !defined( WIN64 )
6577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* MMX version (not supported by 64-bit compiler) */
6587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 size16L = sizeA & 0xfffffff0;
6597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( size16L )
6607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( sizeA == size16L )
6627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
6637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				return bbs_dotProduct_intelMMX16( vec1A, vec2A, size16L );
6647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
6657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return bbs_dotProduct_intelMMX16( vec1A, vec2A, size16L )
6667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					+ bbs_dotProduct_stdc( vec1A + size16L, vec2A + size16L, sizeA - size16L );
6677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		} /* if( size16L ) */
6687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#endif
6697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_stdc( vec1A, vec2A, sizeA );
6717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* Playstation 2 */
6737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#elif defined( HW_EE ) && defined( epl_LINUX )
6747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( (uint32)vec1A & 0xF ) == 0 && ( (uint32)vec2A & 0xF ) == 0 )
6767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return bbs_dotProduct_EE( vec1A, vec2A, sizeA );
6787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
6797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_stdc( vec1A, vec2A, sizeA );
6807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ARM9E */
6827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#elif defined( HW_ARMv5TE )
6837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_arm9e( vec1A, vec2A, sizeA );
6857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* TI C6000 */
6877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#elif defined( HW_TMS320C6x )
6887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_dsp( vec1A, vec2A, sizeA );
6907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#elif defined( HW_FR71 )
6927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
6937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 size16L = sizeA & 0xfffffff0;
6947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( size16L )
6957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
6967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( sizeA == size16L )
6977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
6987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return bbs_dotProduct_fr71( vec1A, vec2A, size16L );
6997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return bbs_dotProduct_fr71( vec1A, vec2A, size16L )
7017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				+ bbs_dotProduct_stdc( vec1A + size16L, vec2A + size16L, sizeA - size16L );
7027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_stdc( vec1A, vec2A, sizeA );
7057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
7077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return bbs_dotProduct_stdc( vec1A, vec2A, sizeA );
7097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* table of fermi and slope values (result: 2.30; offset: .12)
7147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project   referenced in b_NeuralNetEm/FastMlpNet.c, not not rename or remove */
7157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectconst uint32 bbs_fermi_tableG[] =
7167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	45056,      8,     77824,      13,    131072,     21,    217088,     34,
7187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	356352,     57,    589824,     94,    974848,     155,   1609728,    255,
7197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	2654208,    418,   4366336,    688,   7184384,    1126,  11796480,   1834,
7207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	19308544,   2970,  31473664,   4748,  50921472,   7453,  81448960,   11363,
7217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	127991808,  16573, 195874816,  22680, 288772096,  28469, 405381120,  32102,
7227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	536870912,  32101, 668356608,  28469, 784965632,  22680, 877862912,  16573,
7237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	945745920,  11363, 992288768,  7453,  1022816256, 4748,  1042264064, 2970,
7247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1054429184, 1834,  1061941248, 1126,  1066553344, 688,   1069371392, 418,
7257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1071083520, 255,   1072128000, 155,   1072762880, 94,    1073147904, 57,
7267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	1073381376, 34,    1073520640, 21,    1073606656, 13,    1073659904, 8,
7277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
7287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_fermi( int32 valA )
7307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 indexL = ( ( valA >> 15 ) + 20 ) << 1;
7327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 offsL  = ( ( valA & 0x00007FFF ) + 4 ) >> 3;
7337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA <  -655360 ) return 1;
7347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( valA >=  655360 ) return 1073741824 - 1; /* ( 1 << 30 ) */
7357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return ( bbs_fermi_tableG[ indexL ] + offsL * bbs_fermi_tableG[ indexL + 1 ] );
7367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_uint32ReduceToNBits( uint32* argPtrA, int32* bbpPtrA, uint32 nBitsA )
7417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 posHighestBitL = bbs_intLog2( *argPtrA ) + 1;
7437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL = posHighestBitL - nBitsA;
7447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL > 0 )
7457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		( *argPtrA ) >>= shiftL;
7477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		( *bbpPtrA ) -= shiftL;
7487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_int32ReduceToNBits( int32* argPtrA, int32* bbpPtrA, uint32 nBitsA )
7547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 posHighestBitL = bbs_intLog2( bbs_abs( *argPtrA ) ) + 1;
7567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 shiftL = posHighestBitL - nBitsA;
7577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( shiftL > 0 )
7587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		( *argPtrA ) >>= shiftL;
7607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		( *bbpPtrA ) -= shiftL;
7617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_convertU32( uint32 srcA, int32 srcBbpA, int32 dstBbpA )
7677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
7687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( dstBbpA >= srcBbpA )
7697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shiftL = dstBbpA - srcBbpA;
7717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( srcA > ( ( uint32 )0xFFFFFFFF >> shiftL ) )
7727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* overflow */
7747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return ( uint32 )0xFFFFFFFF;
7757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
7777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return srcA << shiftL;
7797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
7827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
7837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shiftL = srcBbpA - dstBbpA;
7847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 addL = 1L << ( shiftL - 1 );
7857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( srcA + addL < addL )
7867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* rounding would cause overflow */
7887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return srcA >> shiftL;
7897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
7917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
7927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return ( srcA + addL ) >> shiftL;
7937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
7947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
7957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
7967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
7987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
7997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_convertS32( int32 srcA, int32 srcBbpA, int32 dstBbpA )
8007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( dstBbpA >= srcBbpA )
8027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shiftL = ( uint32 )( dstBbpA - srcBbpA );
8047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( srcA > ( ( int32 )0x7FFFFFFF >> shiftL ) )
8057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* overflow */
8077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return ( uint32 )0x7FFFFFFF;
8087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else if( srcA < ( ( int32 )0x80000000 >> shiftL ) )
8107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* underflow */
8127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return ( int32 )0x80000000;
8137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
8157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return srcA << shiftL;
8177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
8207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 shiftL = ( uint32 )( srcBbpA - dstBbpA );
8227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 addL = 1L << ( shiftL - 1 );
8237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( srcA + addL < addL )
8247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			/* rounding would cause overflow */
8267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return srcA >> shiftL;
8277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
8297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			return ( srcA + addL ) >> shiftL;
8317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint32 bbs_vecPowerFlt16( const int16 *xA, int16 nxA )
8387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*	#if defined( HW_TMS320C5x )
8407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 rL;
8417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		power( ( int16* ) xA, ( int32* ) &rL, nxA );  // does not work properly in DSPLib version 2.20.02
8427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return ( rL >> 1 );
8437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#else*/
8447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* needs to be optimized */
8457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 rL = 0;
8467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( ; nxA--; )
8477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			rL += ( int32 ) *xA * *xA;
8497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			xA++;
8507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		return rL;
8527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*	#endif */
8537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_mulU32( uint32 v1A, uint32 v2A, uint32* manPtrA, int32* expPtrA )
8587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
8597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 log1L = bbs_intLog2( v1A );
8607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 log2L = bbs_intLog2( v2A );
8617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( log1L + log2L < 32 )
8637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*manPtrA = v1A * v2A;
8657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*expPtrA = 0;
8667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
8687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
8697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 v1L = v1A;
8707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 v2L = v2A;
8717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 exp1L = 0;
8727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 exp2L = 0;
8737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( log1L > 15 && log2L > 15 )
8747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp1L = log1L - 15;
8767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp2L = log2L - 15;
8777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v1L = ( ( v1L >> ( exp1L - 1 ) ) + 1 ) >> 1;
8787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v2L = ( ( v2L >> ( exp2L - 1 ) ) + 1 ) >> 1;
8797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else if( log1L > 15 )
8817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp1L = log1L + log2L - 31;
8837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v1L = ( ( v1L >> ( exp1L - 1 ) ) + 1 ) >> 1;
8847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
8867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
8877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp2L = log1L + log2L - 31;
8887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v2L = ( ( v2L >> ( exp2L - 1 ) ) + 1 ) >> 1;
8897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
8907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*manPtrA = v1L * v2L;
8927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*expPtrA = exp1L + exp2L;
8937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
8947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
8957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
8977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
8987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_mulS32( int32 v1A, int32 v2A, int32* manPtrA, int32* expPtrA )
8997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
9007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 log1L = bbs_intLog2( v1A > 0 ? v1A : -v1A );
9017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 log2L = bbs_intLog2( v2A > 0 ? v2A : -v2A );
9027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( log1L + log2L < 30 )
9047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*manPtrA = v1A * v2A;
9067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*expPtrA = 0;
9077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	else
9097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 v1L = v1A;
9117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 v2L = v2A;
9127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 exp1L = 0;
9137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 exp2L = 0;
9147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( log1L > 14 && log2L > 14 )
9157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp1L = log1L - 14;
9177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp2L = log2L - 14;
9187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v1L = ( ( v1L >> ( exp1L - 1 ) ) + 1 ) >> 1;
9197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v2L = ( ( v2L >> ( exp2L - 1 ) ) + 1 ) >> 1;
9207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else if( log1L > 14 )
9227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp1L = log1L + log2L - 29;
9247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v1L = ( ( v1L >> ( exp1L - 1 ) ) + 1 ) >> 1;
9257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
9277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			exp2L = log1L + log2L - 29;
9297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			v2L = ( ( v2L >> ( exp2L - 1 ) ) + 1 ) >> 1;
9307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*manPtrA = v1L * v2L;
9337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*expPtrA = exp1L + exp2L;
9347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
9367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
9387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_vecSqrNorm32( const int32* vecA, uint32 sizeA, uint32* manPtrA, uint32* expPtrA )
9407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
9417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sumL = 0;
9427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sumExpL = 0;
9437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
9457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeA; iL++ )
9467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 vL = vecA[ iL ];
9487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 logL = bbs_intLog2( vL > 0 ? vL : -vL );
9497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 expL = ( logL > 14 ) ? logL - 14 : 0;
9507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 prdL;
9517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( expL >= 1 )
9537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vL = ( ( vL >> ( expL - 1 ) ) + 1 ) >> 1;
9557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
9577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			vL = vL >> expL;
9597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		prdL = vL * vL;
9627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		expL <<= 1; /* now exponent of product */
9637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( sumExpL > expL )
9657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 shrL = sumExpL - expL;
9677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			prdL = ( ( prdL >> ( shrL - 1 ) ) + 1 ) >> 1;
9687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else if( expL > sumExpL )
9707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 shrL = expL - sumExpL;
9727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL = ( ( sumL >> ( shrL - 1 ) ) + 1 ) >> 1;
9737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumExpL += shrL;
9747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL += prdL;
9777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( sumL > 0x80000000 )
9797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
9807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL = ( sumL + 1 ) >> 1;
9817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumExpL++;
9827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
9837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* make exponent even */
9867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( sumExpL & 1 ) != 0 )
9877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
9887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL = ( sumL + 1 ) >> 1;
9897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumExpL++;
9907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
9917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( manPtrA != NULL ) *manPtrA = sumL;
9937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( expPtrA != NULL ) *expPtrA = sumExpL;
9947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
9957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
9977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
9987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_vecSqrNorm16( const int16* vecA, uint32 sizeA, uint32* manPtrA, uint32* expPtrA )
9997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 sumL = 0;
10017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 sumExpL = 0;
10027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 iL;
10047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = 0; iL < sizeA; iL++ )
10057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 vL = vecA[ iL ];
10077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		uint32 prdL = vL * vL;
10087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( sumExpL > 0 )
10107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			uint32 shrL = sumExpL;
10127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			prdL = ( ( prdL >> ( shrL - 1 ) ) + 1 ) >> 1;
10137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL += prdL;
10167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( sumL > 0x80000000 )
10187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumL = ( sumL + 1 ) >> 1;
10207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sumExpL++;
10217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
10237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* make exponent even */
10257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( ( sumExpL & 1 ) != 0 )
10267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
10277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumL = ( sumL + 1 ) >> 1;
10287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		sumExpL++;
10297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
10307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( manPtrA != NULL ) *manPtrA = sumL;
10327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( expPtrA != NULL ) *expPtrA = sumExpL;
10337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbs_vecNorm16( const int16* vecA, uint32 sizeA )
10387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 manL;
10407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 expL;
10417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	bbs_vecSqrNorm16( vecA, sizeA, &manL, &expL );
10427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	manL = bbs_sqrt32( manL );
10437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return manL << ( expL >> 1 );
10447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
10457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
10477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_matMultiplyFlt16( const int16 *x1A, int16 row1A, int16 col1A, const int16 *x2A, int16 col2A, int16 *rA )
10497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
10507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#if defined( HW_TMS320C5x )
10517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* operands need to be in internal memory for mmul*/
10527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( x1A > ( int16* ) bbs_C5X_INTERNAL_MEMORY_SIZE ||
10537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			x2A > ( int16* ) bbs_C5X_INTERNAL_MEMORY_SIZE )
10547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int16 iL,jL,kL;
10567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int16 *ptr1L, *ptr2L;
10577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 sumL;
10587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( iL = 0; iL < row1A; iL++ )
10607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
10617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( jL = 0; jL < col2A; jL++ )
10627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
10637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					ptr1L = ( int16* ) x1A + iL * col1A;
10647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					ptr2L = ( int16* ) x2A + jL;
10657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL = 0;
10667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					for( kL = 0; kL < col1A; kL++ )
10677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					{
10687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						sumL += ( ( int32 ) *ptr1L++ * *ptr2L );
10697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						ptr2L += col2A;
10707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					}
10717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					*rA++ = ( sumL + ( 1 << 14 ) ) >> 15; /* round result to 1.15 */
10727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
10737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
10747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
10757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else mmul( ( int16* ) x1A, row1A, col1A, ( int16* ) x2A, col1A, col2A, rA );
10767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#elif defined( HW_ARMv4 ) || defined( HW_ARMv5TE )
10787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
10797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 iL, jL, kL;
10807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 *ptr1L, *ptr2L;
10817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 sumL;
10827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < row1A; iL++ )
10837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
10847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < col2A; jL++ )
10857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
10867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr1L = ( int16* ) x1A + iL * col1A;
10877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr2L = ( int16* ) x2A + jL;
10887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL = 0;
10897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( kL = col1A; kL >= 4; kL -= 4 )
10907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
10917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *ptr2L );
10927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *( ptr2L += col2A ) );
10937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *( ptr2L += col2A ) );
10947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *( ptr2L += col2A ) );
10957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					ptr2L += col2A;
10967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
10977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( ; kL > 0; kL-- )
10987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
10997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *ptr2L );
11007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					ptr2L += col2A;
11017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
11027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*rA++ = ( sumL + ( 1 << 14 ) ) >> 15; /* round result to 1.15 */
11037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
11047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#else
11067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		/* needs to be optimized */
11077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 iL,jL,kL;
11087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 *ptr1L, *ptr2L;
11097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 sumL;
11107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( iL = 0; iL < row1A; iL++ )
11127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
11137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( jL = 0; jL < col2A; jL++ )
11147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
11157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr1L = ( int16* ) x1A + iL * col1A;
11167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				ptr2L = ( int16* ) x2A + jL;
11177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL = 0;
11187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				for( kL = 0; kL < col1A; kL++ )
11197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
11207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					sumL += ( ( int32 ) *ptr1L++ * *ptr2L );
11217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					ptr2L += col2A;
11227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
11237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				*rA++ = ( sumL + ( 1 << 14 ) ) >> 15; /* round result to 1.15 */
11247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
11257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	#endif
11277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
11287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
11307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbs_matMultiplyTranspFlt16( const int16 *x1A, int16 row1A, int16 col1A,
11327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 const int16 *x2A, int16 col2A, int16 *rA )
11337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
11347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	const int16* ptr1L = x1A;
11357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int32 iL;
11377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = row1A; iL > 0 ; iL-- )
11387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
11397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int32 jL;
11407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		const int16* ptr2L = x2A;
11417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = col2A; jL > 0 ; jL-- )
11427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
11437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 kL;
11447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			int32 sumL = 0;
11457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( kL = col1A >> 2; kL > 0; kL-- )
11467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
11477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += ( ( int32 ) *ptr1L++ * *ptr2L++ );
11487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += ( ( int32 ) *ptr1L++ * *ptr2L++ );
11497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += ( ( int32 ) *ptr1L++ * *ptr2L++ );
11507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += ( ( int32 ) *ptr1L++ * *ptr2L++ );
11517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
11527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			for( kL = col1A & 3; kL > 0; kL-- )
11537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
11547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				sumL += ( ( int32 ) *ptr1L++ * *ptr2L++ );
11557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
11567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			*rA++ = ( sumL + ( 1 << 14 ) ) >> 15; /* round result to 1.15 */
11577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			ptr1L -= col1A;
11587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		ptr1L += col1A;
11607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
11617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
11627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
11647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifndef mtrans
11677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16 bbs_matTrans( int16 *xA, int16 rowA, int16 colA, int16 *rA )
11687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
11697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* needs to be optimized */
11707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 iL;
11717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( iL = colA; iL--; )
11727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
11737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16* sL = xA++;
11747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 jL;
11757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		for( jL = rowA; jL--; )
11767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
11777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			*rA++ = *sL;
11787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			sL += colA;
11797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
11807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
11817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return 0;
11827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
11837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
11847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
11867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifndef atan2_16
11877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectint16 bbs_atan2( int16 nomA, int16 denomA )
11887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
11897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	int16 phL, argL;
11907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	if( nomA == denomA ) return 8192;
11927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	argL = ( ( int32 ) nomA << 15 ) / denomA;
11937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
11947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* 0.318253*2 x      20857 .15
11957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	  +0.003314*2 x^2      217 .15
11967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	  -0.130908*2 x^3    -8580 .15
11977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	  +0.068542*2 x^4     4491 .15
11987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	  -0.009159*2 x^5     -600 .15 */
11997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = -600;
12017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = ( ( ( int32 ) phL * argL ) >> 15 ) + 4481;
12027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = ( ( ( int32 ) phL * argL ) >> 15 ) - 8580;
12037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = ( ( ( int32 ) phL * argL ) >> 15 ) + 217;
12047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = ( ( ( int32 ) phL * argL ) >> 15 ) + 20857;
12057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	phL = ( ( int32 ) phL * argL ) >> 15;
12067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return phL >> 1; /* /2 */
12087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
12097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* needs to be optimized */
12117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint16 bbs_vecPhase( int16 *reA, int16 *imA, int16 *phaseA, uint16 sizeA )
12127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
12137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	for( ; sizeA--; )
12147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	{
12157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 reL = *reA++;
12167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 imL = *imA++;
12177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		int16 phL = 0;
12187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		if( reL < 0 )
12207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
12217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			reL = -reL;
12227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( imL < 0 )
12237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				imL = -imL;
12257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( reL > imL )
12267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = -32768 + bbs_atan2( imL, reL );
12287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
12307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = -16384 - bbs_atan2( reL, imL );
12327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
12357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( reL > imL )
12377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = -( -32768 + bbs_atan2( imL, reL ) );
12397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
12417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( imL == 0 ) phL = 0;
12437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else phL = 16384 + bbs_atan2( reL, imL );
12447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
12477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		else
12487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		{
12497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			if( imL < 0 )
12507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				imL = -imL;
12527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( reL > imL )
12537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = -bbs_atan2( imL, reL );
12557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
12577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = -16384 + bbs_atan2( reL, imL );
12597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			else
12627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			{
12637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				if( reL > imL )
12647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					phL = bbs_atan2( imL, reL );
12667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				else
12687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				{
12697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					if( imL == 0 ) phL = 0;
12707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project					else phL = 16384 - bbs_atan2( reL, imL );
12717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project				}
12727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project			}
12737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		}
12747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project		*phaseA++ = phL;
12767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	}
12777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	return 0;
12787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project}
12797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif
12817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
12827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */
1283