1
/* Discrete Cosine Tansform (DCT) for subband synthesis.
3
* This code is optimized for 80486. It should be compiled with gcc
6
* Note: This code does not give the necessary accuracy. Moreover, no
7
* overflow test are done.
9
* (c) 1998 Fabrice Bellard.
11
* Rewrite to asm with algorithm and memory optimization
13
* (c) 2000 Petr Salinger
31
#define COS_0_10 31869
32
#define COS_0_11 38320
33
#define COS_0_12 48633
34
#define COS_0_13 67429
35
#define COS_0_14 111660
36
#define COS_0_15 333906
44
#define COS_1_7 167154
53
#define SETOUT(out,n,expr) out[FIR_BUFFER_SIZE*(n)]=(expr)
54
#define MUL(a,b) (((a)*(b)) >> 15)
55
#define MULL(a,b) (((long long)(a)*(long long)(b)) >> 15)
56
#define TOINT(a) ((int)((a)*32768.0))
58
void dct64_1_486_a(real *samples, int *bx);
60
void dct64_1_486_b(int *out0, int *out1, int *b1)
86
SETOUT(out0,16,b1[0x00]);
87
SETOUT(out0,12,b1[0x04]);
88
SETOUT(out0, 8,b1[0x02]);
89
SETOUT(out0, 4,b1[0x06]);
90
SETOUT(out0, 0,b1[0x01]);
91
SETOUT(out1, 0,b1[0x01]);
92
SETOUT(out1, 4,b1[0x05]);
93
SETOUT(out1, 8,b1[0x03]);
94
SETOUT(out1,12,b1[0x07]);
96
SETOUT(out0,14, b1[0x08] + b1[0x0C]);
97
SETOUT(out0,10, b1[0x0C] + b1[0x0A]);
98
SETOUT(out0, 6, b1[0x0A] + b1[0x0E]);
99
SETOUT(out0, 2, b1[0x0E] + b1[0x09]);
100
SETOUT(out1, 2, b1[0x09] + b1[0x0D]);
101
SETOUT(out1, 6, b1[0x0D] + b1[0x0B]);
102
SETOUT(out1,10, b1[0x0B] + b1[0x0F]);
103
SETOUT(out1,14, b1[0x0F]);
105
b1[0x18] += b1[0x1C];
106
SETOUT(out0,15,b1[0x10] + b1[0x18]);
107
SETOUT(out0,13,b1[0x18] + b1[0x14]);
108
b1[0x1C] += b1[0x1a];
109
SETOUT(out0,11,b1[0x14] + b1[0x1C]);
110
SETOUT(out0, 9,b1[0x1C] + b1[0x12]);
111
b1[0x1A] += b1[0x1E];
112
SETOUT(out0, 7,b1[0x12] + b1[0x1A]);
113
SETOUT(out0, 5,b1[0x1A] + b1[0x16]);
114
b1[0x1E] += b1[0x19];
115
SETOUT(out0, 3,b1[0x16] + b1[0x1E]);
116
SETOUT(out0, 1,b1[0x1E] + b1[0x11]);
117
b1[0x19] += b1[0x1D];
118
SETOUT(out1, 1,b1[0x11] + b1[0x19]);
119
SETOUT(out1, 3,b1[0x19] + b1[0x15]);
120
b1[0x1D] += b1[0x1B];
121
SETOUT(out1, 5,b1[0x15] + b1[0x1D]);
122
SETOUT(out1, 7,b1[0x1D] + b1[0x13]);
123
b1[0x1B] += b1[0x1F];
124
SETOUT(out1, 9,b1[0x13] + b1[0x1B]);
125
SETOUT(out1,11,b1[0x1B] + b1[0x17]);
126
SETOUT(out1,13,b1[0x17] + b1[0x1F]);
127
SETOUT(out1,15,b1[0x1F]);
133
void dct64_486(int *a,int *b,real *samples)
135
int bufs[33]; /* 32 + 1 extra for 8B store from x87 */
137
dct64_1_486_a(samples,bufs);
138
dct64_1_486_b(a,b,bufs);