Coverage Report

Created: 2025-11-24 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tremor/mdct.c
Line
Count
Source
1
/********************************************************************
2
 *                                                                  *
3
 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
4
 *                                                                  *
5
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
6
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
7
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
8
 *                                                                  *
9
 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002    *
10
 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
11
 *                                                                  *
12
 ********************************************************************
13
14
 function: normalized modified discrete cosine transform
15
           power of two length transform only [64 <= n ]
16
 last mod: $Id$
17
18
 Original algorithm adapted long ago from _The use of multirate filter
19
 banks for coding of high quality digital audio_, by T. Sporer,
20
 K. Brandenburg and B. Edler, collection of the European Signal
21
 Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp
22
 211-214
23
24
 The below code implements an algorithm that no longer looks much like
25
 that presented in the paper, but the basic structure remains if you
26
 dig deep enough to see it.
27
28
 This module DOES NOT INCLUDE code to generate/apply the window
29
 function.  Everybody has their own weird favorite including me... I
30
 happen to like the properties of y=sin(.5PI*sin^2(x)), but others may
31
 vehemently disagree.
32
33
 ********************************************************************/
34
35
#include "ivorbiscodec.h"
36
#include "codebook.h"
37
#include "misc.h"
38
#include "mdct.h"
39
#include "mdct_lookup.h"
40
41
42
/* 8 point butterfly (in place) */
43
403M
STIN void mdct_butterfly_8(DATA_TYPE *x){
44
45
403M
  REG_TYPE r0   = x[4] + x[0];
46
403M
  REG_TYPE r1   = x[4] - x[0];
47
403M
  REG_TYPE r2   = x[5] + x[1];
48
403M
  REG_TYPE r3   = x[5] - x[1];
49
403M
  REG_TYPE r4   = x[6] + x[2];
50
403M
  REG_TYPE r5   = x[6] - x[2];
51
403M
  REG_TYPE r6   = x[7] + x[3];
52
403M
  REG_TYPE r7   = x[7] - x[3];
53
54
403M
     x[0] = r5   + r3;
55
403M
     x[1] = r7   - r1;
56
403M
     x[2] = r5   - r3;
57
403M
     x[3] = r7   + r1;
58
403M
           x[4] = r4   - r0;
59
403M
     x[5] = r6   - r2;
60
403M
           x[6] = r4   + r0;
61
403M
     x[7] = r6   + r2;
62
403M
     MB();
63
403M
}
64
65
/* 16 point butterfly (in place, 4 register) */
66
201M
STIN void mdct_butterfly_16(DATA_TYPE *x){
67
68
201M
  REG_TYPE r0, r1;
69
70
201M
     r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0];
71
201M
     r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1];
72
201M
     x[ 0] = MULT31((r0 + r1) , cPI2_8);
73
201M
     x[ 1] = MULT31((r1 - r0) , cPI2_8);
74
201M
     MB();
75
76
201M
     r0 = x[10] - x[ 2]; x[10] += x[ 2];
77
201M
     r1 = x[ 3] - x[11]; x[11] += x[ 3];
78
201M
     x[ 2] = r1; x[ 3] = r0;
79
201M
     MB();
80
81
201M
     r0 = x[12] - x[ 4]; x[12] += x[ 4];
82
201M
     r1 = x[13] - x[ 5]; x[13] += x[ 5];
83
201M
     x[ 4] = MULT31((r0 - r1) , cPI2_8);
84
201M
     x[ 5] = MULT31((r0 + r1) , cPI2_8);
85
201M
     MB();
86
87
201M
     r0 = x[14] - x[ 6]; x[14] += x[ 6];
88
201M
     r1 = x[15] - x[ 7]; x[15] += x[ 7];
89
201M
     x[ 6] = r0; x[ 7] = r1;
90
201M
     MB();
91
92
201M
     mdct_butterfly_8(x);
93
201M
     mdct_butterfly_8(x+8);
94
201M
}
95
96
/* 32 point butterfly (in place, 4 register) */
97
100M
STIN void mdct_butterfly_32(DATA_TYPE *x){
98
99
100M
  REG_TYPE r0, r1;
100
101
100M
     r0 = x[30] - x[14]; x[30] += x[14];           
102
100M
     r1 = x[31] - x[15]; x[31] += x[15];
103
100M
     x[14] = r0; x[15] = r1;
104
100M
     MB();
105
106
100M
     r0 = x[28] - x[12]; x[28] += x[12];           
107
100M
     r1 = x[29] - x[13]; x[29] += x[13];
108
100M
     XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] );
109
100M
     MB();
110
111
100M
     r0 = x[26] - x[10]; x[26] += x[10];
112
100M
     r1 = x[27] - x[11]; x[27] += x[11];
113
100M
     x[10] = MULT31((r0 - r1) , cPI2_8);
114
100M
     x[11] = MULT31((r0 + r1) , cPI2_8);
115
100M
     MB();
116
117
100M
     r0 = x[24] - x[ 8]; x[24] += x[ 8];
118
100M
     r1 = x[25] - x[ 9]; x[25] += x[ 9];
119
100M
     XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] );
120
100M
     MB();
121
122
100M
     r0 = x[22] - x[ 6]; x[22] += x[ 6];
123
100M
     r1 = x[ 7] - x[23]; x[23] += x[ 7];
124
100M
     x[ 6] = r1; x[ 7] = r0;
125
100M
     MB();
126
127
100M
     r0 = x[ 4] - x[20]; x[20] += x[ 4];
128
100M
     r1 = x[ 5] - x[21]; x[21] += x[ 5];
129
100M
     XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] );
130
100M
     MB();
131
132
100M
     r0 = x[ 2] - x[18]; x[18] += x[ 2];
133
100M
     r1 = x[ 3] - x[19]; x[19] += x[ 3];
134
100M
     x[ 2] = MULT31((r1 + r0) , cPI2_8);
135
100M
     x[ 3] = MULT31((r1 - r0) , cPI2_8);
136
100M
     MB();
137
138
100M
     r0 = x[ 0] - x[16]; x[16] += x[ 0];
139
100M
     r1 = x[ 1] - x[17]; x[17] += x[ 1];
140
100M
     XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] );
141
100M
     MB();
142
143
100M
     mdct_butterfly_16(x);
144
100M
     mdct_butterfly_16(x+16);
145
100M
}
146
147
/* N/stage point generic N stage butterfly (in place, 2 register) */
148
97.5M
STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){
149
150
97.5M
  LOOKUP_T *T   = sincos_lookup0;
151
97.5M
  DATA_TYPE *x1        = x + points      - 8;
152
97.5M
  DATA_TYPE *x2        = x + (points>>1) - 8;
153
97.5M
  REG_TYPE   r0;
154
97.5M
  REG_TYPE   r1;
155
156
321M
  do{
157
321M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
158
321M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
159
321M
    XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step;
160
161
321M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
162
321M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
163
321M
    XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step;
164
165
321M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
166
321M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
167
321M
    XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step;
168
169
321M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
170
321M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
171
321M
    XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step;
172
173
321M
    x1-=8; x2-=8;
174
321M
  }while(T<sincos_lookup0+1024);
175
321M
  do{
176
321M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
177
321M
    r1 = x1[7] - x2[7]; x1[7] += x2[7];
178
321M
    XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step;
179
180
321M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
181
321M
    r1 = x1[5] - x2[5]; x1[5] += x2[5];
182
321M
    XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step;
183
184
321M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
185
321M
    r1 = x1[3] - x2[3]; x1[3] += x2[3];
186
321M
    XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step;
187
188
321M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
189
321M
    r1 = x1[1] - x2[1]; x1[1] += x2[1];
190
321M
    XNPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T-=step;
191
192
321M
    x1-=8; x2-=8;
193
321M
  }while(T>sincos_lookup0);
194
321M
  do{
195
321M
    r0 = x2[6] - x1[6]; x1[6] += x2[6];
196
321M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
197
321M
    XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step;
198
199
321M
    r0 = x2[4] - x1[4]; x1[4] += x2[4];
200
321M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
201
321M
    XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step;
202
203
321M
    r0 = x2[2] - x1[2]; x1[2] += x2[2];
204
321M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
205
321M
    XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step;
206
207
321M
    r0 = x2[0] - x1[0]; x1[0] += x2[0];
208
321M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
209
321M
    XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step;
210
211
321M
    x1-=8; x2-=8;
212
321M
  }while(T<sincos_lookup0+1024);
213
321M
  do{
214
321M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
215
321M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
216
321M
    XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step;
217
218
321M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
219
321M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
220
321M
    XNPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T-=step;
221
222
321M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
223
321M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
224
321M
    XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step;
225
226
321M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
227
321M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
228
321M
    XNPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T-=step;
229
230
321M
    x1-=8; x2-=8;
231
321M
  }while(T>sincos_lookup0);
232
97.5M
}
233
234
3.41M
STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){
235
236
3.41M
  int stages=8-shift;
237
3.41M
  int i,j;
238
  
239
12.2M
  for(i=0;--stages>0;i++){
240
106M
    for(j=0;j<(1<<i);j++)
241
97.5M
      mdct_butterfly_generic(x+(points>>i)*j,points>>i,4<<(i+shift));
242
8.81M
  }
243
244
104M
  for(j=0;j<points;j+=32)
245
100M
    mdct_butterfly_32(x+j);
246
247
3.41M
}
248
249
static unsigned char bitrev[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
250
251
807M
STIN int bitrev12(int x){
252
807M
  return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8);
253
807M
}
254
255
3.41M
STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
256
257
3.41M
  int          bit   = 0;
258
3.41M
  DATA_TYPE   *w0    = x;
259
3.41M
  DATA_TYPE   *w1    = x = w0+(n>>1);
260
3.41M
  LOOKUP_T    *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1;
261
3.41M
  LOOKUP_T    *Ttop  = T+1024;
262
3.41M
  DATA_TYPE    r2;
263
264
201M
  do{
265
201M
    DATA_TYPE r3     = bitrev12(bit++);
266
201M
    DATA_TYPE *x0    = x + ((r3 ^ 0xfff)>>shift) -1;
267
201M
    DATA_TYPE *x1    = x + (r3>>shift);
268
269
201M
    REG_TYPE  r0     = x0[0]  + x1[0];
270
201M
    REG_TYPE  r1     = x1[1]  - x0[1];
271
272
201M
        XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step;
273
274
201M
        w1    -= 4;
275
276
201M
        r0     = (x0[1] + x1[1])>>1;
277
201M
              r1     = (x0[0] - x1[0])>>1;
278
201M
        w0[0]  = r0     + r2;
279
201M
        w0[1]  = r1     + r3;
280
201M
        w1[2]  = r0     - r2;
281
201M
        w1[3]  = r3     - r1;
282
283
201M
        r3     = bitrev12(bit++);
284
201M
              x0     = x + ((r3 ^ 0xfff)>>shift) -1;
285
201M
              x1     = x + (r3>>shift);
286
287
201M
              r0     = x0[0]  + x1[0];
288
201M
              r1     = x1[1]  - x0[1];
289
290
201M
        XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step;
291
292
201M
              r0     = (x0[1] + x1[1])>>1;
293
201M
              r1     = (x0[0] - x1[0])>>1;
294
201M
        w0[2]  = r0     + r2;
295
201M
        w0[3]  = r1     + r3;
296
201M
        w1[0]  = r0     - r2;
297
201M
        w1[1]  = r3     - r1;
298
299
201M
        w0    += 4;
300
201M
  }while(T<Ttop);
301
201M
  do{
302
201M
    DATA_TYPE r3     = bitrev12(bit++);
303
201M
    DATA_TYPE *x0    = x + ((r3 ^ 0xfff)>>shift) -1;
304
201M
    DATA_TYPE *x1    = x + (r3>>shift);
305
306
201M
    REG_TYPE  r0     = x0[0]  + x1[0];
307
201M
    REG_TYPE  r1     = x1[1]  - x0[1];
308
309
201M
        T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 );
310
311
201M
        w1    -= 4;
312
313
201M
        r0     = (x0[1] + x1[1])>>1;
314
201M
              r1     = (x0[0] - x1[0])>>1;
315
201M
        w0[0]  = r0     + r2;
316
201M
        w0[1]  = r1     + r3;
317
201M
        w1[2]  = r0     - r2;
318
201M
        w1[3]  = r3     - r1;
319
320
201M
        r3     = bitrev12(bit++);
321
201M
              x0     = x + ((r3 ^ 0xfff)>>shift) -1;
322
201M
              x1     = x + (r3>>shift);
323
324
201M
              r0     = x0[0]  + x1[0];
325
201M
              r1     = x1[1]  - x0[1];
326
327
201M
        T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 );
328
329
201M
              r0     = (x0[1] + x1[1])>>1;
330
201M
              r1     = (x0[0] - x1[0])>>1;
331
201M
        w0[2]  = r0     + r2;
332
201M
        w0[3]  = r1     + r3;
333
201M
        w1[0]  = r0     - r2;
334
201M
        w1[1]  = r3     - r1;
335
336
201M
        w0    += 4;
337
201M
  }while(w0<w1);
338
3.41M
}
339
340
3.41M
void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){
341
3.41M
  int n2=n>>1;
342
3.41M
  int n4=n>>2;
343
3.41M
  DATA_TYPE *iX;
344
3.41M
  DATA_TYPE *oX;
345
3.41M
  LOOKUP_T *T;
346
3.41M
  LOOKUP_T *V;
347
3.41M
  int shift;
348
3.41M
  int step;
349
350
12.2M
  for (shift=6;!(n&(1<<shift));shift++);
351
3.41M
  shift=13-shift;
352
3.41M
  step=2<<shift;
353
   
354
  /* rotate */
355
356
3.41M
  iX            = in+n2-7;
357
3.41M
  oX            = out+n2+n4;
358
3.41M
  T             = sincos_lookup0;
359
360
201M
  do{
361
201M
    oX-=4;
362
201M
    XPROD31( iX[4], iX[6], T[0], T[1], &oX[2], &oX[3] ); T+=step;
363
201M
    XPROD31( iX[0], iX[2], T[0], T[1], &oX[0], &oX[1] ); T+=step;
364
201M
    iX-=8;
365
201M
  }while(iX>=in+n4);
366
201M
  do{
367
201M
    oX-=4;
368
201M
    XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step;
369
201M
    XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step;
370
201M
    iX-=8;
371
201M
  }while(iX>=in);
372
373
3.41M
  iX            = in+n2-8;
374
3.41M
  oX            = out+n2+n4;
375
3.41M
  T             = sincos_lookup0;
376
377
201M
  do{
378
201M
    T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] );
379
201M
    T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] );
380
201M
    iX-=8;
381
201M
    oX+=4;
382
201M
  }while(iX>=in+n4);
383
201M
  do{
384
201M
    T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] );
385
201M
    T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] );
386
201M
    iX-=8;
387
201M
    oX+=4;
388
201M
  }while(iX>=in);
389
390
3.41M
  mdct_butterflies(out+n2,n2,shift);
391
3.41M
  mdct_bitreverse(out,n,step,shift);
392
393
  /* rotate + window */
394
395
3.41M
  step>>=2;
396
3.41M
  {
397
3.41M
    DATA_TYPE *oX1=out+n2+n4;
398
3.41M
    DATA_TYPE *oX2=out+n2+n4;
399
3.41M
    DATA_TYPE *iX =out;
400
401
3.41M
    switch(step) {
402
2.66M
      default: {
403
2.66M
        T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1;
404
63.4M
        do{
405
63.4M
          oX1-=4;
406
63.4M
    XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step;
407
63.4M
    XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step;
408
63.4M
    XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step;
409
63.4M
    XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step;
410
63.4M
    oX2+=4;
411
63.4M
    iX+=8;
412
63.4M
  }while(iX<oX1);
413
2.66M
  break;
414
0
      }
415
416
166k
      case 1: {
417
        /* linear interpolation between table values: offset=0.5, step=1 */
418
166k
  REG_TYPE  t0,t1,v0,v1;
419
166k
        T         = sincos_lookup0;
420
166k
        V         = sincos_lookup1;
421
166k
  t0        = (*T++)>>1;
422
166k
  t1        = (*T++)>>1;
423
42.5M
        do{
424
42.5M
          oX1-=4;
425
426
42.5M
    t0 += (v0 = (*V++)>>1);
427
42.5M
    t1 += (v1 = (*V++)>>1);
428
42.5M
    XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] );
429
42.5M
    v0 += (t0 = (*T++)>>1);
430
42.5M
    v1 += (t1 = (*T++)>>1);
431
42.5M
    XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] );
432
42.5M
    t0 += (v0 = (*V++)>>1);
433
42.5M
    t1 += (v1 = (*V++)>>1);
434
42.5M
    XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] );
435
42.5M
    v0 += (t0 = (*T++)>>1);
436
42.5M
    v1 += (t1 = (*T++)>>1);
437
42.5M
    XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] );
438
439
42.5M
    oX2+=4;
440
42.5M
    iX+=8;
441
42.5M
  }while(iX<oX1);
442
166k
  break;
443
0
      }
444
445
581k
      case 0: {
446
        /* linear interpolation between table values: offset=0.25, step=0.5 */
447
581k
  REG_TYPE  t0,t1,v0,v1,q0,q1;
448
581k
        T         = sincos_lookup0;
449
581k
        V         = sincos_lookup1;
450
581k
  t0        = *T++;
451
581k
  t1        = *T++;
452
297M
        do{
453
297M
          oX1-=4;
454
455
297M
    v0  = *V++;
456
297M
    v1  = *V++;
457
297M
    t0 +=  (q0 = (v0-t0)>>2);
458
297M
    t1 +=  (q1 = (v1-t1)>>2);
459
297M
    XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] );
460
297M
    t0  = v0-q0;
461
297M
    t1  = v1-q1;
462
297M
    XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] );
463
464
297M
    t0  = *T++;
465
297M
    t1  = *T++;
466
297M
    v0 += (q0 = (t0-v0)>>2);
467
297M
    v1 += (q1 = (t1-v1)>>2);
468
297M
    XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] );
469
297M
    v0  = t0-q0;
470
297M
    v1  = t1-q1;
471
297M
    XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] );
472
473
297M
    oX2+=4;
474
297M
    iX+=8;
475
297M
  }while(iX<oX1);
476
581k
  break;
477
0
      }
478
3.41M
    }
479
480
3.41M
    iX=out+n2+n4;
481
3.41M
    oX1=out+n4;
482
3.41M
    oX2=oX1;
483
484
403M
    do{
485
403M
      oX1-=4;
486
403M
      iX-=4;
487
488
403M
      oX2[0] = -(oX1[3] = iX[3]);
489
403M
      oX2[1] = -(oX1[2] = iX[2]);
490
403M
      oX2[2] = -(oX1[1] = iX[1]);
491
403M
      oX2[3] = -(oX1[0] = iX[0]);
492
493
403M
      oX2+=4;
494
403M
    }while(oX2<iX);
495
496
3.41M
    iX=out+n2+n4;
497
3.41M
    oX1=out+n2+n4;
498
3.41M
    oX2=out+n2;
499
500
403M
    do{
501
403M
      oX1-=4;
502
403M
      oX1[0]= iX[3];
503
403M
      oX1[1]= iX[2];
504
403M
      oX1[2]= iX[1];
505
403M
      oX1[3]= iX[0];
506
403M
      iX+=4;
507
403M
    }while(oX1>oX2);
508
3.41M
  }
509
3.41M
}
510