Coverage Report

Created: 2026-10-17 07:08

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