Coverage Report

Created: 2026-04-12 06:28

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