1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald 20*df25739fSMilanka Ringwald /********************************************************************************** 21*df25739fSMilanka Ringwald $Revision: #1 $ 22*df25739fSMilanka Ringwald ***********************************************************************************/ 23*df25739fSMilanka Ringwald 24*df25739fSMilanka Ringwald /** 25*df25739fSMilanka Ringwald @file 26*df25739fSMilanka Ringwald Checksum and header-related functions. 27*df25739fSMilanka Ringwald 28*df25739fSMilanka Ringwald @ingroup codec_internal 29*df25739fSMilanka Ringwald */ 30*df25739fSMilanka Ringwald 31*df25739fSMilanka Ringwald /** 32*df25739fSMilanka Ringwald @addtogroup codec_internal 33*df25739fSMilanka Ringwald @{ 34*df25739fSMilanka Ringwald */ 35*df25739fSMilanka Ringwald 36*df25739fSMilanka Ringwald #include "oi_codec_sbc_private.h" 37*df25739fSMilanka Ringwald #include "oi_assert.h" 38*df25739fSMilanka Ringwald 39*df25739fSMilanka Ringwald 40*df25739fSMilanka Ringwald /* asdasd */ 41*df25739fSMilanka Ringwald 42*df25739fSMilanka Ringwald #define USE_NIBBLEWISE_CRC 43*df25739fSMilanka Ringwald 44*df25739fSMilanka Ringwald /* #define PRINT_SAMPLES */ 45*df25739fSMilanka Ringwald /* #define PRINT_SCALEFACTORS */ 46*df25739fSMilanka Ringwald /* #define DEBUG_CRC */ 47*df25739fSMilanka Ringwald 48*df25739fSMilanka Ringwald /* 49*df25739fSMilanka Ringwald * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup 50*df25739fSMilanka Ringwald */ 51*df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 52*df25739fSMilanka Ringwald /* Save space if a char is 16 bits, such as on the C54x */ 53*df25739fSMilanka Ringwald const OI_BYTE crc8_wide[128] = { 54*df25739fSMilanka 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, 55*df25739fSMilanka Ringwald }; 56*df25739fSMilanka Ringwald #elif defined(USE_NIBBLEWISE_CRC) 57*df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[16] = { 58*df25739fSMilanka Ringwald 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb 59*df25739fSMilanka Ringwald }; 60*df25739fSMilanka Ringwald #else 61*df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[256] = { 62*df25739fSMilanka 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 63*df25739fSMilanka Ringwald }; 64*df25739fSMilanka Ringwald #endif 65*df25739fSMilanka Ringwald const OI_UINT32 dequant_long_scaled[17] = { 66*df25739fSMilanka Ringwald 0, 67*df25739fSMilanka Ringwald 0, 68*df25739fSMilanka Ringwald 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/ 69*df25739fSMilanka Ringwald 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/ 70*df25739fSMilanka Ringwald 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/ 71*df25739fSMilanka Ringwald 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/ 72*df25739fSMilanka Ringwald 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/ 73*df25739fSMilanka Ringwald 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/ 74*df25739fSMilanka Ringwald 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/ 75*df25739fSMilanka Ringwald 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/ 76*df25739fSMilanka Ringwald 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/ 77*df25739fSMilanka Ringwald 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/ 78*df25739fSMilanka Ringwald 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/ 79*df25739fSMilanka Ringwald 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/ 80*df25739fSMilanka Ringwald 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/ 81*df25739fSMilanka Ringwald 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/ 82*df25739fSMilanka Ringwald 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/ 83*df25739fSMilanka Ringwald }; 84*df25739fSMilanka Ringwald 85*df25739fSMilanka Ringwald 86*df25739fSMilanka Ringwald const OI_UINT32 dequant_long_unscaled[17] = { 87*df25739fSMilanka Ringwald 0, 88*df25739fSMilanka Ringwald 0, 89*df25739fSMilanka Ringwald 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/ 90*df25739fSMilanka Ringwald 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/ 91*df25739fSMilanka Ringwald 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/ 92*df25739fSMilanka Ringwald 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/ 93*df25739fSMilanka Ringwald 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/ 94*df25739fSMilanka Ringwald 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/ 95*df25739fSMilanka Ringwald 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/ 96*df25739fSMilanka Ringwald 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/ 97*df25739fSMilanka Ringwald 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/ 98*df25739fSMilanka Ringwald 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/ 99*df25739fSMilanka Ringwald 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/ 100*df25739fSMilanka Ringwald 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/ 101*df25739fSMilanka Ringwald 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/ 102*df25739fSMilanka Ringwald 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/ 103*df25739fSMilanka Ringwald 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/ 104*df25739fSMilanka Ringwald }; 105*df25739fSMilanka Ringwald 106*df25739fSMilanka Ringwald #if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS) 107*df25739fSMilanka Ringwald #include <stdio.h> 108*df25739fSMilanka Ringwald #endif 109*df25739fSMilanka Ringwald 110*df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 111*df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next) 112*df25739fSMilanka Ringwald { 113*df25739fSMilanka Ringwald OI_UINT crc; 114*df25739fSMilanka Ringwald OI_UINT idx; 115*df25739fSMilanka Ringwald idx = oldcrc^next; 116*df25739fSMilanka Ringwald crc = crc8_wide[idx >> 1]; 117*df25739fSMilanka Ringwald if (idx%2) { 118*df25739fSMilanka Ringwald crc &= 0xff; 119*df25739fSMilanka Ringwald } else { 120*df25739fSMilanka Ringwald crc >>= 8; 121*df25739fSMilanka Ringwald } 122*df25739fSMilanka Ringwald 123*df25739fSMilanka Ringwald return crc; 124*df25739fSMilanka Ringwald } 125*df25739fSMilanka Ringwald 126*df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 127*df25739fSMilanka Ringwald { 128*df25739fSMilanka Ringwald OI_UINT crc; 129*df25739fSMilanka Ringwald OI_UINT idx; 130*df25739fSMilanka Ringwald idx = (oldcrc ^ next) >> 4; 131*df25739fSMilanka Ringwald crc = crc8_wide[idx>>1]; 132*df25739fSMilanka Ringwald if (idx%2) { 133*df25739fSMilanka Ringwald crc &= 0xff; 134*df25739fSMilanka Ringwald } else { 135*df25739fSMilanka Ringwald crc >>= 8; 136*df25739fSMilanka Ringwald } 137*df25739fSMilanka Ringwald 138*df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc; 139*df25739fSMilanka Ringwald } 140*df25739fSMilanka Ringwald 141*df25739fSMilanka Ringwald #else // USE_WIDE_CRC 142*df25739fSMilanka Ringwald 143*df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 144*df25739fSMilanka Ringwald { 145*df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4]; 146*df25739fSMilanka Ringwald } 147*df25739fSMilanka Ringwald 148*df25739fSMilanka Ringwald #ifdef USE_NIBBLEWISE_CRC 149*df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 150*df25739fSMilanka Ringwald { 151*df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4]; 152*df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf]; 153*df25739fSMilanka Ringwald 154*df25739fSMilanka Ringwald return crc; 155*df25739fSMilanka Ringwald } 156*df25739fSMilanka Ringwald 157*df25739fSMilanka Ringwald #else // USE_NIBBLEWISE_CRC 158*df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 159*df25739fSMilanka Ringwald { 160*df25739fSMilanka Ringwald return crc8_narrow[crc^next]; 161*df25739fSMilanka Ringwald } 162*df25739fSMilanka Ringwald 163*df25739fSMilanka Ringwald #endif // USE_NIBBLEWISE_CRC 164*df25739fSMilanka Ringwald 165*df25739fSMilanka Ringwald #endif // USE_WIDE_CRC 166*df25739fSMilanka Ringwald 167*df25739fSMilanka Ringwald 168*df25739fSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) 169*df25739fSMilanka Ringwald { 170*df25739fSMilanka Ringwald OI_UINT i; 171*df25739fSMilanka Ringwald OI_UINT8 crc = 0x0f; 172*df25739fSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one 173*df25739fSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is 174*df25739fSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper 175*df25739fSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a 176*df25739fSMilanka Ringwald * bottleneck routine in the first place. */ 177*df25739fSMilanka Ringwald OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4; 178*df25739fSMilanka Ringwald 179*df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) { 180*df25739fSMilanka Ringwald count++; 181*df25739fSMilanka Ringwald } 182*df25739fSMilanka Ringwald 183*df25739fSMilanka Ringwald for (i = 1; i < count; i++) { 184*df25739fSMilanka Ringwald if (i != 3) { 185*df25739fSMilanka Ringwald crc = crc_iterate(crc,data[i]); 186*df25739fSMilanka Ringwald } 187*df25739fSMilanka Ringwald } 188*df25739fSMilanka Ringwald 189*df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) { 190*df25739fSMilanka Ringwald crc = crc_iterate_top4(crc, data[i]); 191*df25739fSMilanka Ringwald } 192*df25739fSMilanka Ringwald 193*df25739fSMilanka Ringwald return crc; 194*df25739fSMilanka Ringwald } 195*df25739fSMilanka Ringwald 196*df25739fSMilanka Ringwald void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame) 197*df25739fSMilanka Ringwald { 198*df25739fSMilanka Ringwald frame->nrof_blocks = block_values[frame->blocks]; 199*df25739fSMilanka Ringwald frame->nrof_subbands = band_values[frame->subbands]; 200*df25739fSMilanka Ringwald 201*df25739fSMilanka Ringwald frame->frequency = freq_values[frame->freqIndex]; 202*df25739fSMilanka Ringwald frame->nrof_channels = channel_values[frame->mode]; 203*df25739fSMilanka Ringwald } 204*df25739fSMilanka Ringwald 205*df25739fSMilanka Ringwald /** 206*df25739fSMilanka Ringwald * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory 207*df25739fSMilanka Ringwald */ 208*df25739fSMilanka Ringwald #define COPY4WORDS_BACK(_dest, _src) \ 209*df25739fSMilanka Ringwald do { \ 210*df25739fSMilanka Ringwald OI_INT32 _a, _b, _c, _d; \ 211*df25739fSMilanka Ringwald _a = *--_src; \ 212*df25739fSMilanka Ringwald _b = *--_src; \ 213*df25739fSMilanka Ringwald _c = *--_src; \ 214*df25739fSMilanka Ringwald _d = *--_src; \ 215*df25739fSMilanka Ringwald *--_dest = _a; \ 216*df25739fSMilanka Ringwald *--_dest = _b; \ 217*df25739fSMilanka Ringwald *--_dest = _c; \ 218*df25739fSMilanka Ringwald *--_dest = _d; \ 219*df25739fSMilanka Ringwald } while (0) 220*df25739fSMilanka Ringwald 221*df25739fSMilanka Ringwald 222*df25739fSMilanka Ringwald #if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY) 223*df25739fSMilanka Ringwald #include <string.h> 224*df25739fSMilanka Ringwald #endif 225*df25739fSMilanka Ringwald PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount) 226*df25739fSMilanka Ringwald { 227*df25739fSMilanka Ringwald #ifdef USE_PLATFORM_MEMMOVE 228*df25739fSMilanka Ringwald memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 229*df25739fSMilanka Ringwald #elif defined(USE_PLATFORM_MEMCPY) 230*df25739fSMilanka Ringwald OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest)); 231*df25739fSMilanka Ringwald memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 232*df25739fSMilanka Ringwald #else 233*df25739fSMilanka Ringwald OI_UINT n; 234*df25739fSMilanka Ringwald OI_INT32 *d; 235*df25739fSMilanka Ringwald OI_INT32 *s; 236*df25739fSMilanka Ringwald n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest)); 237*df25739fSMilanka Ringwald OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount); 238*df25739fSMilanka Ringwald 239*df25739fSMilanka Ringwald d = (OI_INT32*)(dest + wordCount); 240*df25739fSMilanka Ringwald s = (OI_INT32*)(src + wordCount); 241*df25739fSMilanka Ringwald 242*df25739fSMilanka Ringwald do { 243*df25739fSMilanka Ringwald COPY4WORDS_BACK(d, s); 244*df25739fSMilanka Ringwald } while (--n); 245*df25739fSMilanka Ringwald #endif 246*df25739fSMilanka Ringwald } 247*df25739fSMilanka Ringwald /** 248*df25739fSMilanka Ringwald @} 249*df25739fSMilanka Ringwald */ 250