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