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/Memory.h" 207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Functions.h" 217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include <string.h> 237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/ 247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- related objects --------------------------------------------------- */ 257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- typedefs ----------------------------------------------------------- */ 277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- constants ---------------------------------------------------------- */ 297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ external functions } ----------------------------------------- */ 357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* */ 367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ========================================================================= */ 377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid* bbs_memcpy( void* dstA, const void* srcA, uint32 sizeA ) 417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( sizeA & 1 ) 437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project bbs_ERROR0( "bbs_memcpy( .... ): sizeA must be even" ); 457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return NULL; 467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return bbs_memcpy16( dstA, srcA, sizeA >> 1 ); 487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/ 507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid* bbs_memcpy16( void* dstA, const void* srcA, uint32 sizeA ) 537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifdef HW_TMS320C5x 557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ( ( int32 ) dstA >> 16 ) == ( ( ( int32 ) dstA + sizeA ) >> 16 ) && 567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ( ( int32 ) srcA >> 16 ) == ( ( ( int32 ) srcA + sizeA ) >> 16 ) ) 577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* fast version, works only if pointers do not cross page boundary. */ 597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstL = ( uint16* )dstA; 607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* srcL = ( uint16* )srcA; 617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 iL; 627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = sizeA; iL--; ) 637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = *srcL++; 657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* safe version */ 707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeA; iL++ ) 727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *( uint16* ) ( ( int32 ) dstA + iL ) = *( uint16* ) ( ( int32 ) srcA + iL ); 747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#else 787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstL = ( uint16* )dstA; 797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* srcL = ( uint16* )srcA; 807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA >= 4; sizeA -= 4 ) 827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 0 ] = srcL[ 0 ]; 847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 1 ] = srcL[ 1 ]; 857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 2 ] = srcL[ 2 ]; 867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 3 ] = srcL[ 3 ]; 877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL += 4; 887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcL += 4; 897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA > 0; sizeA-- ) 927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = *srcL++; 947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif 987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid* bbs_memcpy32( void* dstA, const void* srcA, uint32 sizeA ) 1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifdef HW_TMS320C5x 1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project if( ( ( int32 ) dstA >> 16 ) == ( ( ( int32 ) dstA + ( sizeA << 1 ) ) >> 16 ) && 1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project ( ( int32 ) srcA >> 16 ) == ( ( ( int32 ) srcA + ( sizeA << 1 ) ) >> 16 ) ) 1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* fast version, works only if pointers do not cross page boundary. */ 1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32* dstL = ( uint32* )dstA; 1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint32* srcL = ( uint32* )srcA; 1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16 iL; 1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = sizeA; iL--; ) 1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = *srcL++; 1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project else 1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* safe version */ 1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sizeA <<= 1; 1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeA; iL += 2 ) 1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *( uint32* ) ( ( int32 ) dstA + iL ) = *( uint32* ) ( ( int32 ) srcA + iL ); 1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* 1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstL = ( uint16* )dstA; 1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint16* srcL = ( uint16* )srcA; 1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project // copying with base object-size of 16bit 1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project // is more efficient on 16 bit architecture 1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project sizeA <<= 1; 1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA >= 4; sizeA -= 4 ) 1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 0 ] = srcL[ 0 ]; 1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 1 ] = srcL[ 1 ]; 1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 2 ] = srcL[ 2 ]; 1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 3 ] = srcL[ 3 ]; 1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL += 4; 1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcL += 4; 1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA > 0; sizeA-- ) 1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = *srcL++; 1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project*/ 1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#else /* 32bit architectures */ 1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32* dstL = ( uint32* )dstA; 1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project const uint32* srcL = ( uint32* )srcA; 1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA >= 4; sizeA -= 4 ) 1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 0 ] = srcL[ 0 ]; 1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 1 ] = srcL[ 1 ]; 1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 2 ] = srcL[ 2 ]; 1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL[ 3 ] = srcL[ 3 ]; 1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project dstL += 4; 1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project srcL += 4; 1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( ; sizeA > 0; sizeA-- ) 1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = *srcL++; 1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif 1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid* bbs_memset16( void* dstA, uint16 valA, uint32 sizeA ) 1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint16* dstL = ( uint16* )dstA; 1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* to be optimized */ 1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeA; iL++ ) 1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = valA; 1887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 1897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 1907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 1917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 1937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 1947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid* bbs_memset32( void* dstA, uint32 valA, uint32 sizeA ) 1957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{ 1967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32 iL; 1977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project uint32* dstL = ( uint32* )dstA; 1987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project /* to be optimized */ 1997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project for( iL = 0; iL < sizeA; iL++ ) 2007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project { 2017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *dstL++ = valA; 2027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project } 2037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project return dstA; 2047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project} 2057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 2067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ------------------------------------------------------------------------- */ 2077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project 208