1df25739fSMilanka Ringwald /****************************************************************************** 2df25739fSMilanka Ringwald * 3df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5df25739fSMilanka Ringwald * 6df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9df25739fSMilanka Ringwald * 10df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11df25739fSMilanka Ringwald * 12df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16df25739fSMilanka Ringwald * limitations under the License. 17df25739fSMilanka Ringwald * 18df25739fSMilanka Ringwald ******************************************************************************/ 19df25739fSMilanka Ringwald 20df25739fSMilanka Ringwald /********************************************************************************** 21df25739fSMilanka Ringwald $Revision: #1 $ 22df25739fSMilanka Ringwald ***********************************************************************************/ 23df25739fSMilanka Ringwald 24df25739fSMilanka Ringwald /** 25df25739fSMilanka Ringwald @file 26df25739fSMilanka Ringwald Checksum and header-related functions. 27df25739fSMilanka Ringwald 28df25739fSMilanka Ringwald @ingroup codec_internal 29df25739fSMilanka Ringwald */ 30df25739fSMilanka Ringwald 31df25739fSMilanka Ringwald /** 32df25739fSMilanka Ringwald @addtogroup codec_internal 33df25739fSMilanka Ringwald @{ 34df25739fSMilanka Ringwald */ 35df25739fSMilanka Ringwald 36df25739fSMilanka Ringwald #include "oi_codec_sbc_private.h" 37df25739fSMilanka Ringwald #include "oi_assert.h" 38df25739fSMilanka Ringwald 39df25739fSMilanka Ringwald 40df25739fSMilanka Ringwald /* asdasd */ 41df25739fSMilanka Ringwald 42df25739fSMilanka Ringwald #define USE_NIBBLEWISE_CRC 43df25739fSMilanka Ringwald 44df25739fSMilanka Ringwald /* #define PRINT_SAMPLES */ 45df25739fSMilanka Ringwald /* #define PRINT_SCALEFACTORS */ 46df25739fSMilanka Ringwald /* #define DEBUG_CRC */ 47df25739fSMilanka Ringwald 48df25739fSMilanka Ringwald /* 49df25739fSMilanka Ringwald * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup 50df25739fSMilanka Ringwald */ 51df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 52df25739fSMilanka Ringwald /* Save space if a char is 16 bits, such as on the C54x */ 53df25739fSMilanka Ringwald const OI_BYTE crc8_wide[128] = { 54df25739fSMilanka Ringwald 0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4, 55df25739fSMilanka Ringwald }; 56df25739fSMilanka Ringwald #elif defined(USE_NIBBLEWISE_CRC) 57df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[16] = { 58df25739fSMilanka Ringwald 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb 59df25739fSMilanka Ringwald }; 60df25739fSMilanka Ringwald #else 61df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[256] = { 62df25739fSMilanka Ringwald 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4 63df25739fSMilanka Ringwald }; 64df25739fSMilanka Ringwald #endif 65df25739fSMilanka Ringwald const OI_UINT32 dequant_long_scaled[17] = { 66df25739fSMilanka Ringwald 0, 67df25739fSMilanka Ringwald 0, 68df25739fSMilanka Ringwald 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/ 69df25739fSMilanka Ringwald 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/ 70df25739fSMilanka Ringwald 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/ 71df25739fSMilanka Ringwald 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/ 72df25739fSMilanka Ringwald 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/ 73df25739fSMilanka Ringwald 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/ 74df25739fSMilanka Ringwald 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/ 75df25739fSMilanka Ringwald 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/ 76df25739fSMilanka Ringwald 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/ 77df25739fSMilanka Ringwald 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/ 78df25739fSMilanka Ringwald 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/ 79df25739fSMilanka Ringwald 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/ 80df25739fSMilanka Ringwald 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/ 81df25739fSMilanka Ringwald 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/ 82df25739fSMilanka Ringwald 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/ 83df25739fSMilanka Ringwald }; 84df25739fSMilanka Ringwald 85df25739fSMilanka Ringwald 86df25739fSMilanka Ringwald const OI_UINT32 dequant_long_unscaled[17] = { 87df25739fSMilanka Ringwald 0, 88df25739fSMilanka Ringwald 0, 89df25739fSMilanka Ringwald 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/ 90df25739fSMilanka Ringwald 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/ 91df25739fSMilanka Ringwald 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/ 92df25739fSMilanka Ringwald 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/ 93df25739fSMilanka Ringwald 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/ 94df25739fSMilanka Ringwald 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/ 95df25739fSMilanka Ringwald 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/ 96df25739fSMilanka Ringwald 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/ 97df25739fSMilanka Ringwald 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/ 98df25739fSMilanka Ringwald 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/ 99df25739fSMilanka Ringwald 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/ 100df25739fSMilanka Ringwald 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/ 101df25739fSMilanka Ringwald 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/ 102df25739fSMilanka Ringwald 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/ 103df25739fSMilanka Ringwald 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/ 104df25739fSMilanka Ringwald }; 105df25739fSMilanka Ringwald 106df25739fSMilanka Ringwald #if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS) 107df25739fSMilanka Ringwald #include <stdio.h> 108df25739fSMilanka Ringwald #endif 109df25739fSMilanka Ringwald 110df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 111*08b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next); 112df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next) 113df25739fSMilanka Ringwald { 114df25739fSMilanka Ringwald OI_UINT crc; 115df25739fSMilanka Ringwald OI_UINT idx; 116df25739fSMilanka Ringwald idx = oldcrc^next; 117df25739fSMilanka Ringwald crc = crc8_wide[idx >> 1]; 118df25739fSMilanka Ringwald if (idx%2) { 119df25739fSMilanka Ringwald crc &= 0xff; 120df25739fSMilanka Ringwald } else { 121df25739fSMilanka Ringwald crc >>= 8; 122df25739fSMilanka Ringwald } 123df25739fSMilanka Ringwald 124df25739fSMilanka Ringwald return crc; 125df25739fSMilanka Ringwald } 126df25739fSMilanka Ringwald 127*08b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next); 128df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 129df25739fSMilanka Ringwald { 130df25739fSMilanka Ringwald OI_UINT crc; 131df25739fSMilanka Ringwald OI_UINT idx; 132df25739fSMilanka Ringwald idx = (oldcrc ^ next) >> 4; 133df25739fSMilanka Ringwald crc = crc8_wide[idx>>1]; 134df25739fSMilanka Ringwald if (idx%2) { 135df25739fSMilanka Ringwald crc &= 0xff; 136df25739fSMilanka Ringwald } else { 137df25739fSMilanka Ringwald crc >>= 8; 138df25739fSMilanka Ringwald } 139df25739fSMilanka Ringwald 140df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc; 141df25739fSMilanka Ringwald } 142df25739fSMilanka Ringwald 143df25739fSMilanka Ringwald #else // USE_WIDE_CRC 144df25739fSMilanka Ringwald 145*08b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next); 146df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 147df25739fSMilanka Ringwald { 148df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4]; 149df25739fSMilanka Ringwald } 150df25739fSMilanka Ringwald 151df25739fSMilanka Ringwald #ifdef USE_NIBBLEWISE_CRC 152*08b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next); 153df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 154df25739fSMilanka Ringwald { 155df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4]; 156df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf]; 157df25739fSMilanka Ringwald 158df25739fSMilanka Ringwald return crc; 159df25739fSMilanka Ringwald } 160df25739fSMilanka Ringwald 161df25739fSMilanka Ringwald #else // USE_NIBBLEWISE_CRC 162*08b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next); 163df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 164df25739fSMilanka Ringwald { 165df25739fSMilanka Ringwald return crc8_narrow[crc^next]; 166df25739fSMilanka Ringwald } 167df25739fSMilanka Ringwald 168df25739fSMilanka Ringwald #endif // USE_NIBBLEWISE_CRC 169df25739fSMilanka Ringwald 170df25739fSMilanka Ringwald #endif // USE_WIDE_CRC 171df25739fSMilanka Ringwald 172df25739fSMilanka Ringwald 173df25739fSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) 174df25739fSMilanka Ringwald { 175df25739fSMilanka Ringwald OI_UINT i; 176df25739fSMilanka Ringwald OI_UINT8 crc = 0x0f; 177df25739fSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one 178df25739fSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is 179df25739fSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper 180df25739fSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a 181df25739fSMilanka Ringwald * bottleneck routine in the first place. */ 182df25739fSMilanka Ringwald OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4; 183df25739fSMilanka Ringwald 184df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) { 185df25739fSMilanka Ringwald count++; 186df25739fSMilanka Ringwald } 187df25739fSMilanka Ringwald 188df25739fSMilanka Ringwald for (i = 1; i < count; i++) { 189df25739fSMilanka Ringwald if (i != 3) { 190df25739fSMilanka Ringwald crc = crc_iterate(crc,data[i]); 191df25739fSMilanka Ringwald } 192df25739fSMilanka Ringwald } 193df25739fSMilanka Ringwald 194df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) { 195df25739fSMilanka Ringwald crc = crc_iterate_top4(crc, data[i]); 196df25739fSMilanka Ringwald } 197df25739fSMilanka Ringwald 198df25739fSMilanka Ringwald return crc; 199df25739fSMilanka Ringwald } 200df25739fSMilanka Ringwald 201df25739fSMilanka Ringwald void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame) 202df25739fSMilanka Ringwald { 203df25739fSMilanka Ringwald frame->nrof_blocks = block_values[frame->blocks]; 204df25739fSMilanka Ringwald frame->nrof_subbands = band_values[frame->subbands]; 205df25739fSMilanka Ringwald 206df25739fSMilanka Ringwald frame->frequency = freq_values[frame->freqIndex]; 207df25739fSMilanka Ringwald frame->nrof_channels = channel_values[frame->mode]; 208df25739fSMilanka Ringwald } 209df25739fSMilanka Ringwald 210df25739fSMilanka Ringwald /** 211df25739fSMilanka Ringwald * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory 212df25739fSMilanka Ringwald */ 213df25739fSMilanka Ringwald #define COPY4WORDS_BACK(_dest, _src) \ 214df25739fSMilanka Ringwald do { \ 215df25739fSMilanka Ringwald OI_INT32 _a, _b, _c, _d; \ 216df25739fSMilanka Ringwald _a = *--_src; \ 217df25739fSMilanka Ringwald _b = *--_src; \ 218df25739fSMilanka Ringwald _c = *--_src; \ 219df25739fSMilanka Ringwald _d = *--_src; \ 220df25739fSMilanka Ringwald *--_dest = _a; \ 221df25739fSMilanka Ringwald *--_dest = _b; \ 222df25739fSMilanka Ringwald *--_dest = _c; \ 223df25739fSMilanka Ringwald *--_dest = _d; \ 224df25739fSMilanka Ringwald } while (0) 225df25739fSMilanka Ringwald 226df25739fSMilanka Ringwald 227df25739fSMilanka Ringwald #if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY) 228df25739fSMilanka Ringwald #include <string.h> 229df25739fSMilanka Ringwald #endif 230df25739fSMilanka Ringwald PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount) 231df25739fSMilanka Ringwald { 232df25739fSMilanka Ringwald #ifdef USE_PLATFORM_MEMMOVE 233df25739fSMilanka Ringwald memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 234df25739fSMilanka Ringwald #elif defined(USE_PLATFORM_MEMCPY) 235df25739fSMilanka Ringwald OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest)); 236df25739fSMilanka Ringwald memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 237df25739fSMilanka Ringwald #else 238df25739fSMilanka Ringwald OI_UINT n; 239df25739fSMilanka Ringwald OI_INT32 *d; 240df25739fSMilanka Ringwald OI_INT32 *s; 241df25739fSMilanka Ringwald n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest)); 242df25739fSMilanka Ringwald OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount); 243df25739fSMilanka Ringwald 244df25739fSMilanka Ringwald d = (OI_INT32*)(dest + wordCount); 245df25739fSMilanka Ringwald s = (OI_INT32*)(src + wordCount); 246df25739fSMilanka Ringwald 247df25739fSMilanka Ringwald do { 248df25739fSMilanka Ringwald COPY4WORDS_BACK(d, s); 249df25739fSMilanka Ringwald } while (--n); 250df25739fSMilanka Ringwald #endif 251df25739fSMilanka Ringwald } 252df25739fSMilanka Ringwald /** 253df25739fSMilanka Ringwald @} 254df25739fSMilanka Ringwald */ 255