Coverage Report

Created: 2025-10-13 06:41

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
444M
STIN void mdct_butterfly_8(DATA_TYPE *x){
44
45
444M
  REG_TYPE r0   = x[4] + x[0];
46
444M
  REG_TYPE r1   = x[4] - x[0];
47
444M
  REG_TYPE r2   = x[5] + x[1];
48
444M
  REG_TYPE r3   = x[5] - x[1];
49
444M
  REG_TYPE r4   = x[6] + x[2];
50
444M
  REG_TYPE r5   = x[6] - x[2];
51
444M
  REG_TYPE r6   = x[7] + x[3];
52
444M
  REG_TYPE r7   = x[7] - x[3];
53
54
444M
     x[0] = r5   + r3;
55
444M
     x[1] = r7   - r1;
56
444M
     x[2] = r5   - r3;
57
444M
     x[3] = r7   + r1;
58
444M
           x[4] = r4   - r0;
59
444M
     x[5] = r6   - r2;
60
444M
           x[6] = r4   + r0;
61
444M
     x[7] = r6   + r2;
62
444M
     MB();
63
444M
}
64
65
/* 16 point butterfly (in place, 4 register) */
66
222M
STIN void mdct_butterfly_16(DATA_TYPE *x){
67
68
222M
  REG_TYPE r0, r1;
69
70
222M
     r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0];
71
222M
     r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1];
72
222M
     x[ 0] = MULT31((r0 + r1) , cPI2_8);
73
222M
     x[ 1] = MULT31((r1 - r0) , cPI2_8);
74
222M
     MB();
75
76
222M
     r0 = x[10] - x[ 2]; x[10] += x[ 2];
77
222M
     r1 = x[ 3] - x[11]; x[11] += x[ 3];
78
222M
     x[ 2] = r1; x[ 3] = r0;
79
222M
     MB();
80
81
222M
     r0 = x[12] - x[ 4]; x[12] += x[ 4];
82
222M
     r1 = x[13] - x[ 5]; x[13] += x[ 5];
83
222M
     x[ 4] = MULT31((r0 - r1) , cPI2_8);
84
222M
     x[ 5] = MULT31((r0 + r1) , cPI2_8);
85
222M
     MB();
86
87
222M
     r0 = x[14] - x[ 6]; x[14] += x[ 6];
88
222M
     r1 = x[15] - x[ 7]; x[15] += x[ 7];
89
222M
     x[ 6] = r0; x[ 7] = r1;
90
222M
     MB();
91
92
222M
     mdct_butterfly_8(x);
93
222M
     mdct_butterfly_8(x+8);
94
222M
}
95
96
/* 32 point butterfly (in place, 4 register) */
97
111M
STIN void mdct_butterfly_32(DATA_TYPE *x){
98
99
111M
  REG_TYPE r0, r1;
100
101
111M
     r0 = x[30] - x[14]; x[30] += x[14];           
102
111M
     r1 = x[31] - x[15]; x[31] += x[15];
103
111M
     x[14] = r0; x[15] = r1;
104
111M
     MB();
105
106
111M
     r0 = x[28] - x[12]; x[28] += x[12];           
107
111M
     r1 = x[29] - x[13]; x[29] += x[13];
108
111M
     XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] );
109
111M
     MB();
110
111
111M
     r0 = x[26] - x[10]; x[26] += x[10];
112
111M
     r1 = x[27] - x[11]; x[27] += x[11];
113
111M
     x[10] = MULT31((r0 - r1) , cPI2_8);
114
111M
     x[11] = MULT31((r0 + r1) , cPI2_8);
115
111M
     MB();
116
117
111M
     r0 = x[24] - x[ 8]; x[24] += x[ 8];
118
111M
     r1 = x[25] - x[ 9]; x[25] += x[ 9];
119
111M
     XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] );
120
111M
     MB();
121
122
111M
     r0 = x[22] - x[ 6]; x[22] += x[ 6];
123
111M
     r1 = x[ 7] - x[23]; x[23] += x[ 7];
124
111M
     x[ 6] = r1; x[ 7] = r0;
125
111M
     MB();
126
127
111M
     r0 = x[ 4] - x[20]; x[20] += x[ 4];
128
111M
     r1 = x[ 5] - x[21]; x[21] += x[ 5];
129
111M
     XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] );
130
111M
     MB();
131
132
111M
     r0 = x[ 2] - x[18]; x[18] += x[ 2];
133
111M
     r1 = x[ 3] - x[19]; x[19] += x[ 3];
134
111M
     x[ 2] = MULT31((r1 + r0) , cPI2_8);
135
111M
     x[ 3] = MULT31((r1 - r0) , cPI2_8);
136
111M
     MB();
137
138
111M
     r0 = x[ 0] - x[16]; x[16] += x[ 0];
139
111M
     r1 = x[ 1] - x[17]; x[17] += x[ 1];
140
111M
     XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] );
141
111M
     MB();
142
143
111M
     mdct_butterfly_16(x);
144
111M
     mdct_butterfly_16(x+16);
145
111M
}
146
147
/* N/stage point generic N stage butterfly (in place, 2 register) */
148
108M
STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){
149
150
108M
  LOOKUP_T *T   = sincos_lookup0;
151
108M
  DATA_TYPE *x1        = x + points      - 8;
152
108M
  DATA_TYPE *x2        = x + (points>>1) - 8;
153
108M
  REG_TYPE   r0;
154
108M
  REG_TYPE   r1;
155
156
363M
  do{
157
363M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
158
363M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
159
363M
    XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step;
160
161
363M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
162
363M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
163
363M
    XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step;
164
165
363M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
166
363M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
167
363M
    XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step;
168
169
363M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
170
363M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
171
363M
    XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step;
172
173
363M
    x1-=8; x2-=8;
174
363M
  }while(T<sincos_lookup0+1024);
175
363M
  do{
176
363M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
177
363M
    r1 = x1[7] - x2[7]; x1[7] += x2[7];
178
363M
    XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step;
179
180
363M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
181
363M
    r1 = x1[5] - x2[5]; x1[5] += x2[5];
182
363M
    XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step;
183
184
363M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
185
363M
    r1 = x1[3] - x2[3]; x1[3] += x2[3];
186
363M
    XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step;
187
188
363M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
189
363M
    r1 = x1[1] - x2[1]; x1[1] += x2[1];
190
363M
    XNPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T-=step;
191
192
363M
    x1-=8; x2-=8;
193
363M
  }while(T>sincos_lookup0);
194
363M
  do{
195
363M
    r0 = x2[6] - x1[6]; x1[6] += x2[6];
196
363M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
197
363M
    XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step;
198
199
363M
    r0 = x2[4] - x1[4]; x1[4] += x2[4];
200
363M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
201
363M
    XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step;
202
203
363M
    r0 = x2[2] - x1[2]; x1[2] += x2[2];
204
363M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
205
363M
    XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step;
206
207
363M
    r0 = x2[0] - x1[0]; x1[0] += x2[0];
208
363M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
209
363M
    XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step;
210
211
363M
    x1-=8; x2-=8;
212
363M
  }while(T<sincos_lookup0+1024);
213
363M
  do{
214
363M
    r0 = x1[6] - x2[6]; x1[6] += x2[6];
215
363M
    r1 = x2[7] - x1[7]; x1[7] += x2[7];
216
363M
    XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step;
217
218
363M
    r0 = x1[4] - x2[4]; x1[4] += x2[4];
219
363M
    r1 = x2[5] - x1[5]; x1[5] += x2[5];
220
363M
    XNPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T-=step;
221
222
363M
    r0 = x1[2] - x2[2]; x1[2] += x2[2];
223
363M
    r1 = x2[3] - x1[3]; x1[3] += x2[3];
224
363M
    XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step;
225
226
363M
    r0 = x1[0] - x2[0]; x1[0] += x2[0];
227
363M
    r1 = x2[1] - x1[1]; x1[1] += x2[1];
228
363M
    XNPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T-=step;
229
230
363M
    x1-=8; x2-=8;
231
363M
  }while(T>sincos_lookup0);
232
108M
}
233
234
2.87M
STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){
235
236
2.87M
  int stages=8-shift;
237
2.87M
  int i,j;
238
  
239
11.3M
  for(i=0;--stages>0;i++){
240
116M
    for(j=0;j<(1<<i);j++)
241
108M
      mdct_butterfly_generic(x+(points>>i)*j,points>>i,4<<(i+shift));
242
8.48M
  }
243
244
113M
  for(j=0;j<points;j+=32)
245
111M
    mdct_butterfly_32(x+j);
246
247
2.87M
}
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
888M
STIN int bitrev12(int x){
252
888M
  return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8);
253
888M
}
254
255
2.87M
STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
256
257
2.87M
  int          bit   = 0;
258
2.87M
  DATA_TYPE   *w0    = x;
259
2.87M
  DATA_TYPE   *w1    = x = w0+(n>>1);
260
2.87M
  LOOKUP_T    *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1;
261
2.87M
  LOOKUP_T    *Ttop  = T+1024;
262
2.87M
  DATA_TYPE    r2;
263
264
222M
  do{
265
222M
    DATA_TYPE r3     = bitrev12(bit++);
266
222M
    DATA_TYPE *x0    = x + ((r3 ^ 0xfff)>>shift) -1;
267
222M
    DATA_TYPE *x1    = x + (r3>>shift);
268
269
222M
    REG_TYPE  r0     = x0[0]  + x1[0];
270
222M
    REG_TYPE  r1     = x1[1]  - x0[1];
271
272
222M
        XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step;
273
274
222M
        w1    -= 4;
275
276
222M
        r0     = (x0[1] + x1[1])>>1;
277
222M
              r1     = (x0[0] - x1[0])>>1;
278
222M
        w0[0]  = r0     + r2;
279
222M
        w0[1]  = r1     + r3;
280
222M
        w1[2]  = r0     - r2;
281
222M
        w1[3]  = r3     - r1;
282
283
222M
        r3     = bitrev12(bit++);
284
222M
              x0     = x + ((r3 ^ 0xfff)>>shift) -1;
285
222M
              x1     = x + (r3>>shift);
286
287
222M
              r0     = x0[0]  + x1[0];
288
222M
              r1     = x1[1]  - x0[1];
289
290
222M
        XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step;
291
292
222M
              r0     = (x0[1] + x1[1])>>1;
293
222M
              r1     = (x0[0] - x1[0])>>1;
294
222M
        w0[2]  = r0     + r2;
295
222M
        w0[3]  = r1     + r3;
296
222M
        w1[0]  = r0     - r2;
297
222M
        w1[1]  = r3     - r1;
298
299
222M
        w0    += 4;
300
222M
  }while(T<Ttop);
301
222M
  do{
302
222M
    DATA_TYPE r3     = bitrev12(bit++);
303
222M
    DATA_TYPE *x0    = x + ((r3 ^ 0xfff)>>shift) -1;
304
222M
    DATA_TYPE *x1    = x + (r3>>shift);
305
306
222M
    REG_TYPE  r0     = x0[0]  + x1[0];
307
222M
    REG_TYPE  r1     = x1[1]  - x0[1];
308
309
222M
        T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 );
310
311
222M
        w1    -= 4;
312
313
222M
        r0     = (x0[1] + x1[1])>>1;
314
222M
              r1     = (x0[0] - x1[0])>>1;
315
222M
        w0[0]  = r0     + r2;
316
222M
        w0[1]  = r1     + r3;
317
222M
        w1[2]  = r0     - r2;
318
222M
        w1[3]  = r3     - r1;
319
320
222M
        r3     = bitrev12(bit++);
321
222M
              x0     = x + ((r3 ^ 0xfff)>>shift) -1;
322
222M
              x1     = x + (r3>>shift);
323
324
222M
              r0     = x0[0]  + x1[0];
325
222M
              r1     = x1[1]  - x0[1];
326
327
222M
        T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 );
328
329
222M
              r0     = (x0[1] + x1[1])>>1;
330
222M
              r1     = (x0[0] - x1[0])>>1;
331
222M
        w0[2]  = r0     + r2;
332
222M
        w0[3]  = r1     + r3;
333
222M
        w1[0]  = r0     - r2;
334
222M
        w1[1]  = r3     - r1;
335
336
222M
        w0    += 4;
337
222M
  }while(w0<w1);
338
2.87M
}
339
340
2.87M
void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){
341
2.87M
  int n2=n>>1;
342
2.87M
  int n4=n>>2;
343
2.87M
  DATA_TYPE *iX;
344
2.87M
  DATA_TYPE *oX;
345
2.87M
  LOOKUP_T *T;
346
2.87M
  LOOKUP_T *V;
347
2.87M
  int shift;
348
2.87M
  int step;
349
350
11.3M
  for (shift=6;!(n&(1<<shift));shift++);
351
2.87M
  shift=13-shift;
352
2.87M
  step=2<<shift;
353
   
354
  /* rotate */
355
356
2.87M
  iX            = in+n2-7;
357
2.87M
  oX            = out+n2+n4;
358
2.87M
  T             = sincos_lookup0;
359
360
222M
  do{
361
222M
    oX-=4;
362
222M
    XPROD31( iX[4], iX[6], T[0], T[1], &oX[2], &oX[3] ); T+=step;
363
222M
    XPROD31( iX[0], iX[2], T[0], T[1], &oX[0], &oX[1] ); T+=step;
364
222M
    iX-=8;
365
222M
  }while(iX>=in+n4);
366
222M
  do{
367
222M
    oX-=4;
368
222M
    XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step;
369
222M
    XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step;
370
222M
    iX-=8;
371
222M
  }while(iX>=in);
372
373
2.87M
  iX            = in+n2-8;
374
2.87M
  oX            = out+n2+n4;
375
2.87M
  T             = sincos_lookup0;
376
377
222M
  do{
378
222M
    T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] );
379
222M
    T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] );
380
222M
    iX-=8;
381
222M
    oX+=4;
382
222M
  }while(iX>=in+n4);
383
222M
  do{
384
222M
    T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] );
385
222M
    T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] );
386
222M
    iX-=8;
387
222M
    oX+=4;
388
222M
  }while(iX>=in);
389
390
2.87M
  mdct_butterflies(out+n2,n2,shift);
391
2.87M
  mdct_bitreverse(out,n,step,shift);
392
393
  /* rotate + window */
394
395
2.87M
  step>>=2;
396
2.87M
  {
397
2.87M
    DATA_TYPE *oX1=out+n2+n4;
398
2.87M
    DATA_TYPE *oX2=out+n2+n4;
399
2.87M
    DATA_TYPE *iX =out;
400
401
2.87M
    switch(step) {
402
1.98M
      default: {
403
1.98M
        T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1;
404
41.9M
        do{
405
41.9M
          oX1-=4;
406
41.9M
    XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step;
407
41.9M
    XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step;
408
41.9M
    XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step;
409
41.9M
    XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step;
410
41.9M
    oX2+=4;
411
41.9M
    iX+=8;
412
41.9M
  }while(iX<oX1);
413
1.98M
  break;
414
0
      }
415
416
206k
      case 1: {
417
        /* linear interpolation between table values: offset=0.5, step=1 */
418
206k
  REG_TYPE  t0,t1,v0,v1;
419
206k
        T         = sincos_lookup0;
420
206k
        V         = sincos_lookup1;
421
206k
  t0        = (*T++)>>1;
422
206k
  t1        = (*T++)>>1;
423
52.7M
        do{
424
52.7M
          oX1-=4;
425
426
52.7M
    t0 += (v0 = (*V++)>>1);
427
52.7M
    t1 += (v1 = (*V++)>>1);
428
52.7M
    XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] );
429
52.7M
    v0 += (t0 = (*T++)>>1);
430
52.7M
    v1 += (t1 = (*T++)>>1);
431
52.7M
    XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] );
432
52.7M
    t0 += (v0 = (*V++)>>1);
433
52.7M
    t1 += (v1 = (*V++)>>1);
434
52.7M
    XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] );
435
52.7M
    v0 += (t0 = (*T++)>>1);
436
52.7M
    v1 += (t1 = (*T++)>>1);
437
52.7M
    XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] );
438
439
52.7M
    oX2+=4;
440
52.7M
    iX+=8;
441
52.7M
  }while(iX<oX1);
442
206k
  break;
443
0
      }
444
445
683k
      case 0: {
446
        /* linear interpolation between table values: offset=0.25, step=0.5 */
447
683k
  REG_TYPE  t0,t1,v0,v1,q0,q1;
448
683k
        T         = sincos_lookup0;
449
683k
        V         = sincos_lookup1;
450
683k
  t0        = *T++;
451
683k
  t1        = *T++;
452
349M
        do{
453
349M
          oX1-=4;
454
455
349M
    v0  = *V++;
456
349M
    v1  = *V++;
457
349M
    t0 +=  (q0 = (v0-t0)>>2);
458
349M
    t1 +=  (q1 = (v1-t1)>>2);
459
349M
    XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] );
460
349M
    t0  = v0-q0;
461
349M
    t1  = v1-q1;
462
349M
    XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] );
463
464
349M
    t0  = *T++;
465
349M
    t1  = *T++;
466
349M
    v0 += (q0 = (t0-v0)>>2);
467
349M
    v1 += (q1 = (t1-v1)>>2);
468
349M
    XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] );
469
349M
    v0  = t0-q0;
470
349M
    v1  = t1-q1;
471
349M
    XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] );
472
473
349M
    oX2+=4;
474
349M
    iX+=8;
475
349M
  }while(iX<oX1);
476
683k
  break;
477
0
      }
478
2.87M
    }
479
480
2.87M
    iX=out+n2+n4;
481
2.87M
    oX1=out+n4;
482
2.87M
    oX2=oX1;
483
484
444M
    do{
485
444M
      oX1-=4;
486
444M
      iX-=4;
487
488
444M
      oX2[0] = -(oX1[3] = iX[3]);
489
444M
      oX2[1] = -(oX1[2] = iX[2]);
490
444M
      oX2[2] = -(oX1[1] = iX[1]);
491
444M
      oX2[3] = -(oX1[0] = iX[0]);
492
493
444M
      oX2+=4;
494
444M
    }while(oX2<iX);
495
496
2.87M
    iX=out+n2+n4;
497
2.87M
    oX1=out+n2+n4;
498
2.87M
    oX2=out+n2;
499
500
444M
    do{
501
444M
      oX1-=4;
502
444M
      oX1[0]= iX[3];
503
444M
      oX1[1]= iX[2];
504
444M
      oX1[2]= iX[1];
505
444M
      oX1[3]= iX[0];
506
444M
      iX+=4;
507
444M
    }while(oX1>oX2);
508
2.87M
  }
509
2.87M
}
510