/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* ---- includes ----------------------------------------------------------- */ #include "b_BasicEm/Memory.h" #include "b_BasicEm/Functions.h" /* #include <string.h> */ /* ---- related objects --------------------------------------------------- */ /* ---- typedefs ----------------------------------------------------------- */ /* ---- constants ---------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ========================================================================= */ /* */ /* ---- \ghd{ external functions } ----------------------------------------- */ /* */ /* ========================================================================= */ /* ------------------------------------------------------------------------- */ /* void* bbs_memcpy( void* dstA, const void* srcA, uint32 sizeA ) { if( sizeA & 1 ) { bbs_ERROR0( "bbs_memcpy( .... ): sizeA must be even" ); return NULL; } return bbs_memcpy16( dstA, srcA, sizeA >> 1 ); } */ /* ------------------------------------------------------------------------- */ void* bbs_memcpy16( void* dstA, const void* srcA, uint32 sizeA ) { #ifdef HW_TMS320C5x if( ( ( int32 ) dstA >> 16 ) == ( ( ( int32 ) dstA + sizeA ) >> 16 ) && ( ( int32 ) srcA >> 16 ) == ( ( ( int32 ) srcA + sizeA ) >> 16 ) ) { /* fast version, works only if pointers do not cross page boundary. */ uint16* dstL = ( uint16* )dstA; const uint16* srcL = ( uint16* )srcA; uint16 iL; for( iL = sizeA; iL--; ) { *dstL++ = *srcL++; } } else { /* safe version */ uint32 iL; for( iL = 0; iL < sizeA; iL++ ) { *( uint16* ) ( ( int32 ) dstA + iL ) = *( uint16* ) ( ( int32 ) srcA + iL ); } } return dstA; #else uint16* dstL = ( uint16* )dstA; const uint16* srcL = ( uint16* )srcA; for( ; sizeA >= 4; sizeA -= 4 ) { dstL[ 0 ] = srcL[ 0 ]; dstL[ 1 ] = srcL[ 1 ]; dstL[ 2 ] = srcL[ 2 ]; dstL[ 3 ] = srcL[ 3 ]; dstL += 4; srcL += 4; } for( ; sizeA > 0; sizeA-- ) { *dstL++ = *srcL++; } return dstA; #endif } /* ------------------------------------------------------------------------- */ void* bbs_memcpy32( void* dstA, const void* srcA, uint32 sizeA ) { #ifdef HW_TMS320C5x if( ( ( int32 ) dstA >> 16 ) == ( ( ( int32 ) dstA + ( sizeA << 1 ) ) >> 16 ) && ( ( int32 ) srcA >> 16 ) == ( ( ( int32 ) srcA + ( sizeA << 1 ) ) >> 16 ) ) { /* fast version, works only if pointers do not cross page boundary. */ uint32* dstL = ( uint32* )dstA; const uint32* srcL = ( uint32* )srcA; uint16 iL; for( iL = sizeA; iL--; ) { *dstL++ = *srcL++; } } else { /* safe version */ uint32 iL; sizeA <<= 1; for( iL = 0; iL < sizeA; iL += 2 ) { *( uint32* ) ( ( int32 ) dstA + iL ) = *( uint32* ) ( ( int32 ) srcA + iL ); } } return dstA; /* uint16* dstL = ( uint16* )dstA; const uint16* srcL = ( uint16* )srcA; // copying with base object-size of 16bit // is more efficient on 16 bit architecture sizeA <<= 1; for( ; sizeA >= 4; sizeA -= 4 ) { dstL[ 0 ] = srcL[ 0 ]; dstL[ 1 ] = srcL[ 1 ]; dstL[ 2 ] = srcL[ 2 ]; dstL[ 3 ] = srcL[ 3 ]; dstL += 4; srcL += 4; } for( ; sizeA > 0; sizeA-- ) { *dstL++ = *srcL++; } return dstA; */ #else /* 32bit architectures */ uint32* dstL = ( uint32* )dstA; const uint32* srcL = ( uint32* )srcA; for( ; sizeA >= 4; sizeA -= 4 ) { dstL[ 0 ] = srcL[ 0 ]; dstL[ 1 ] = srcL[ 1 ]; dstL[ 2 ] = srcL[ 2 ]; dstL[ 3 ] = srcL[ 3 ]; dstL += 4; srcL += 4; } for( ; sizeA > 0; sizeA-- ) { *dstL++ = *srcL++; } return dstA; #endif } /* ------------------------------------------------------------------------- */ void* bbs_memset16( void* dstA, uint16 valA, uint32 sizeA ) { uint32 iL; uint16* dstL = ( uint16* )dstA; /* to be optimized */ for( iL = 0; iL < sizeA; iL++ ) { *dstL++ = valA; } return dstA; } /* ------------------------------------------------------------------------- */ void* bbs_memset32( void* dstA, uint32 valA, uint32 sizeA ) { uint32 iL; uint32* dstL = ( uint32* )dstA; /* to be optimized */ for( iL = 0; iL < sizeA; iL++ ) { *dstL++ = valA; } return dstA; } /* ------------------------------------------------------------------------- */