/*
* 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;
}
/* ------------------------------------------------------------------------- */