1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus-rsp-hle - mp3.c *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2014 Bobby Smiles *
5 * Copyright (C) 2009 Richard Goedeken *
6 * Copyright (C) 2002 Hacktarux *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
22 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
23
24 #include <string.h>
25 #include <stdint.h>
26
27 #include "arithmetics.h"
28 #include "hle_internal.h"
29 #include "memory.h"
30
31 static void InnerLoop(struct hle_t* hle,
32 uint32_t outPtr, uint32_t inPtr,
33 uint32_t t6, uint32_t t5, uint32_t t4);
34
35 static const uint16_t DeWindowLUT [0x420] = {
36 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E,
37 0x7FFF, 0x3FF2, 0x0B37, 0x08CA, 0x037A, 0x00C8, 0x005D, 0x000D,
38 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E,
39 0x7FFF, 0x3FF2, 0x0B37, 0x08CA, 0x037A, 0x00C8, 0x005D, 0x000D,
40 0x0000, 0xFFF2, 0x005F, 0xFF1D, 0x0369, 0xF697, 0x0A2A, 0xBCE7,
41 0x7FEB, 0x3CCB, 0x0C2B, 0x082B, 0x0385, 0x00AF, 0x005B, 0x000B,
42 0x0000, 0xFFF2, 0x005F, 0xFF1D, 0x0369, 0xF697, 0x0A2A, 0xBCE7,
43 0x7FEB, 0x3CCB, 0x0C2B, 0x082B, 0x0385, 0x00AF, 0x005B, 0x000B,
44 0x0000, 0xFFF1, 0x0061, 0xFF02, 0x0354, 0xF5F9, 0x0905, 0xB9C4,
45 0x7FB0, 0x39A4, 0x0D08, 0x078C, 0x038C, 0x0098, 0x0058, 0x000A,
46 0x0000, 0xFFF1, 0x0061, 0xFF02, 0x0354, 0xF5F9, 0x0905, 0xB9C4,
47 0x7FB0, 0x39A4, 0x0D08, 0x078C, 0x038C, 0x0098, 0x0058, 0x000A,
48 0x0000, 0xFFEF, 0x0062, 0xFEE6, 0x033B, 0xF55C, 0x07C8, 0xB6A4,
49 0x7F4D, 0x367E, 0x0DCE, 0x06EE, 0x038F, 0x0080, 0x0056, 0x0009,
50 0x0000, 0xFFEF, 0x0062, 0xFEE6, 0x033B, 0xF55C, 0x07C8, 0xB6A4,
51 0x7F4D, 0x367E, 0x0DCE, 0x06EE, 0x038F, 0x0080, 0x0056, 0x0009,
52 0x0000, 0xFFEE, 0x0063, 0xFECA, 0x031C, 0xF4C3, 0x0671, 0xB38C,
53 0x7EC2, 0x335D, 0x0E7C, 0x0652, 0x038E, 0x006B, 0x0053, 0x0008,
54 0x0000, 0xFFEE, 0x0063, 0xFECA, 0x031C, 0xF4C3, 0x0671, 0xB38C,
55 0x7EC2, 0x335D, 0x0E7C, 0x0652, 0x038E, 0x006B, 0x0053, 0x0008,
56 0x0000, 0xFFEC, 0x0064, 0xFEAC, 0x02F7, 0xF42C, 0x0502, 0xB07C,
57 0x7E12, 0x3041, 0x0F14, 0x05B7, 0x038A, 0x0056, 0x0050, 0x0007,
58 0x0000, 0xFFEC, 0x0064, 0xFEAC, 0x02F7, 0xF42C, 0x0502, 0xB07C,
59 0x7E12, 0x3041, 0x0F14, 0x05B7, 0x038A, 0x0056, 0x0050, 0x0007,
60 0x0000, 0xFFEB, 0x0064, 0xFE8E, 0x02CE, 0xF399, 0x037A, 0xAD75,
61 0x7D3A, 0x2D2C, 0x0F97, 0x0520, 0x0382, 0x0043, 0x004D, 0x0007,
62 0x0000, 0xFFEB, 0x0064, 0xFE8E, 0x02CE, 0xF399, 0x037A, 0xAD75,
63 0x7D3A, 0x2D2C, 0x0F97, 0x0520, 0x0382, 0x0043, 0x004D, 0x0007,
64 0xFFFF, 0xFFE9, 0x0063, 0xFE6F, 0x029E, 0xF30B, 0x01D8, 0xAA7B,
65 0x7C3D, 0x2A1F, 0x1004, 0x048B, 0x0377, 0x0030, 0x004A, 0x0006,
66 0xFFFF, 0xFFE9, 0x0063, 0xFE6F, 0x029E, 0xF30B, 0x01D8, 0xAA7B,
67 0x7C3D, 0x2A1F, 0x1004, 0x048B, 0x0377, 0x0030, 0x004A, 0x0006,
68 0xFFFF, 0xFFE7, 0x0062, 0xFE4F, 0x0269, 0xF282, 0x001F, 0xA78D,
69 0x7B1A, 0x271C, 0x105D, 0x03F9, 0x036A, 0x001F, 0x0046, 0x0006,
70 0xFFFF, 0xFFE7, 0x0062, 0xFE4F, 0x0269, 0xF282, 0x001F, 0xA78D,
71 0x7B1A, 0x271C, 0x105D, 0x03F9, 0x036A, 0x001F, 0x0046, 0x0006,
72 0xFFFF, 0xFFE4, 0x0061, 0xFE2F, 0x022F, 0xF1FF, 0xFE4C, 0xA4AF,
73 0x79D3, 0x2425, 0x10A2, 0x036C, 0x0359, 0x0010, 0x0043, 0x0005,
74 0xFFFF, 0xFFE4, 0x0061, 0xFE2F, 0x022F, 0xF1FF, 0xFE4C, 0xA4AF,
75 0x79D3, 0x2425, 0x10A2, 0x036C, 0x0359, 0x0010, 0x0043, 0x0005,
76 0xFFFF, 0xFFE2, 0x005E, 0xFE10, 0x01EE, 0xF184, 0xFC61, 0xA1E1,
77 0x7869, 0x2139, 0x10D3, 0x02E3, 0x0346, 0x0001, 0x0040, 0x0004,
78 0xFFFF, 0xFFE2, 0x005E, 0xFE10, 0x01EE, 0xF184, 0xFC61, 0xA1E1,
79 0x7869, 0x2139, 0x10D3, 0x02E3, 0x0346, 0x0001, 0x0040, 0x0004,
80 0xFFFF, 0xFFE0, 0x005B, 0xFDF0, 0x01A8, 0xF111, 0xFA5F, 0x9F27,
81 0x76DB, 0x1E5C, 0x10F2, 0x025E, 0x0331, 0xFFF3, 0x003D, 0x0004,
82 0xFFFF, 0xFFE0, 0x005B, 0xFDF0, 0x01A8, 0xF111, 0xFA5F, 0x9F27,
83 0x76DB, 0x1E5C, 0x10F2, 0x025E, 0x0331, 0xFFF3, 0x003D, 0x0004,
84 0xFFFF, 0xFFDE, 0x0057, 0xFDD0, 0x015B, 0xF0A7, 0xF845, 0x9C80,
85 0x752C, 0x1B8E, 0x1100, 0x01DE, 0x0319, 0xFFE7, 0x003A, 0x0003,
86 0xFFFF, 0xFFDE, 0x0057, 0xFDD0, 0x015B, 0xF0A7, 0xF845, 0x9C80,
87 0x752C, 0x1B8E, 0x1100, 0x01DE, 0x0319, 0xFFE7, 0x003A, 0x0003,
88 0xFFFE, 0xFFDB, 0x0053, 0xFDB0, 0x0108, 0xF046, 0xF613, 0x99EE,
89 0x735C, 0x18D1, 0x10FD, 0x0163, 0x0300, 0xFFDC, 0x0037, 0x0003,
90 0xFFFE, 0xFFDB, 0x0053, 0xFDB0, 0x0108, 0xF046, 0xF613, 0x99EE,
91 0x735C, 0x18D1, 0x10FD, 0x0163, 0x0300, 0xFFDC, 0x0037, 0x0003,
92 0xFFFE, 0xFFD8, 0x004D, 0xFD90, 0x00B0, 0xEFF0, 0xF3CC, 0x9775,
93 0x716C, 0x1624, 0x10EA, 0x00EE, 0x02E5, 0xFFD2, 0x0033, 0x0003,
94 0xFFFE, 0xFFD8, 0x004D, 0xFD90, 0x00B0, 0xEFF0, 0xF3CC, 0x9775,
95 0x716C, 0x1624, 0x10EA, 0x00EE, 0x02E5, 0xFFD2, 0x0033, 0x0003,
96 0xFFFE, 0xFFD6, 0x0047, 0xFD72, 0x0051, 0xEFA6, 0xF16F, 0x9514,
97 0x6F5E, 0x138A, 0x10C8, 0x007E, 0x02CA, 0xFFC9, 0x0030, 0x0003,
98 0xFFFE, 0xFFD6, 0x0047, 0xFD72, 0x0051, 0xEFA6, 0xF16F, 0x9514,
99 0x6F5E, 0x138A, 0x10C8, 0x007E, 0x02CA, 0xFFC9, 0x0030, 0x0003,
100 0xFFFE, 0xFFD3, 0x0040, 0xFD54, 0xFFEC, 0xEF68, 0xEEFC, 0x92CD,
101 0x6D33, 0x1104, 0x1098, 0x0014, 0x02AC, 0xFFC0, 0x002D, 0x0002,
102 0xFFFE, 0xFFD3, 0x0040, 0xFD54, 0xFFEC, 0xEF68, 0xEEFC, 0x92CD,
103 0x6D33, 0x1104, 0x1098, 0x0014, 0x02AC, 0xFFC0, 0x002D, 0x0002,
104 0x0030, 0xFFC9, 0x02CA, 0x007E, 0x10C8, 0x138A, 0x6F5E, 0x9514,
105 0xF16F, 0xEFA6, 0x0051, 0xFD72, 0x0047, 0xFFD6, 0xFFFE, 0x0003,
106 0x0030, 0xFFC9, 0x02CA, 0x007E, 0x10C8, 0x138A, 0x6F5E, 0x9514,
107 0xF16F, 0xEFA6, 0x0051, 0xFD72, 0x0047, 0xFFD6, 0xFFFE, 0x0003,
108 0x0033, 0xFFD2, 0x02E5, 0x00EE, 0x10EA, 0x1624, 0x716C, 0x9775,
109 0xF3CC, 0xEFF0, 0x00B0, 0xFD90, 0x004D, 0xFFD8, 0xFFFE, 0x0003,
110 0x0033, 0xFFD2, 0x02E5, 0x00EE, 0x10EA, 0x1624, 0x716C, 0x9775,
111 0xF3CC, 0xEFF0, 0x00B0, 0xFD90, 0x004D, 0xFFD8, 0xFFFE, 0x0003,
112 0x0037, 0xFFDC, 0x0300, 0x0163, 0x10FD, 0x18D1, 0x735C, 0x99EE,
113 0xF613, 0xF046, 0x0108, 0xFDB0, 0x0053, 0xFFDB, 0xFFFE, 0x0003,
114 0x0037, 0xFFDC, 0x0300, 0x0163, 0x10FD, 0x18D1, 0x735C, 0x99EE,
115 0xF613, 0xF046, 0x0108, 0xFDB0, 0x0053, 0xFFDB, 0xFFFE, 0x0003,
116 0x003A, 0xFFE7, 0x0319, 0x01DE, 0x1100, 0x1B8E, 0x752C, 0x9C80,
117 0xF845, 0xF0A7, 0x015B, 0xFDD0, 0x0057, 0xFFDE, 0xFFFF, 0x0003,
118 0x003A, 0xFFE7, 0x0319, 0x01DE, 0x1100, 0x1B8E, 0x752C, 0x9C80,
119 0xF845, 0xF0A7, 0x015B, 0xFDD0, 0x0057, 0xFFDE, 0xFFFF, 0x0004,
120 0x003D, 0xFFF3, 0x0331, 0x025E, 0x10F2, 0x1E5C, 0x76DB, 0x9F27,
121 0xFA5F, 0xF111, 0x01A8, 0xFDF0, 0x005B, 0xFFE0, 0xFFFF, 0x0004,
122 0x003D, 0xFFF3, 0x0331, 0x025E, 0x10F2, 0x1E5C, 0x76DB, 0x9F27,
123 0xFA5F, 0xF111, 0x01A8, 0xFDF0, 0x005B, 0xFFE0, 0xFFFF, 0x0004,
124 0x0040, 0x0001, 0x0346, 0x02E3, 0x10D3, 0x2139, 0x7869, 0xA1E1,
125 0xFC61, 0xF184, 0x01EE, 0xFE10, 0x005E, 0xFFE2, 0xFFFF, 0x0004,
126 0x0040, 0x0001, 0x0346, 0x02E3, 0x10D3, 0x2139, 0x7869, 0xA1E1,
127 0xFC61, 0xF184, 0x01EE, 0xFE10, 0x005E, 0xFFE2, 0xFFFF, 0x0005,
128 0x0043, 0x0010, 0x0359, 0x036C, 0x10A2, 0x2425, 0x79D3, 0xA4AF,
129 0xFE4C, 0xF1FF, 0x022F, 0xFE2F, 0x0061, 0xFFE4, 0xFFFF, 0x0005,
130 0x0043, 0x0010, 0x0359, 0x036C, 0x10A2, 0x2425, 0x79D3, 0xA4AF,
131 0xFE4C, 0xF1FF, 0x022F, 0xFE2F, 0x0061, 0xFFE4, 0xFFFF, 0x0006,
132 0x0046, 0x001F, 0x036A, 0x03F9, 0x105D, 0x271C, 0x7B1A, 0xA78D,
133 0x001F, 0xF282, 0x0269, 0xFE4F, 0x0062, 0xFFE7, 0xFFFF, 0x0006,
134 0x0046, 0x001F, 0x036A, 0x03F9, 0x105D, 0x271C, 0x7B1A, 0xA78D,
135 0x001F, 0xF282, 0x0269, 0xFE4F, 0x0062, 0xFFE7, 0xFFFF, 0x0006,
136 0x004A, 0x0030, 0x0377, 0x048B, 0x1004, 0x2A1F, 0x7C3D, 0xAA7B,
137 0x01D8, 0xF30B, 0x029E, 0xFE6F, 0x0063, 0xFFE9, 0xFFFF, 0x0006,
138 0x004A, 0x0030, 0x0377, 0x048B, 0x1004, 0x2A1F, 0x7C3D, 0xAA7B,
139 0x01D8, 0xF30B, 0x029E, 0xFE6F, 0x0063, 0xFFE9, 0xFFFF, 0x0007,
140 0x004D, 0x0043, 0x0382, 0x0520, 0x0F97, 0x2D2C, 0x7D3A, 0xAD75,
141 0x037A, 0xF399, 0x02CE, 0xFE8E, 0x0064, 0xFFEB, 0x0000, 0x0007,
142 0x004D, 0x0043, 0x0382, 0x0520, 0x0F97, 0x2D2C, 0x7D3A, 0xAD75,
143 0x037A, 0xF399, 0x02CE, 0xFE8E, 0x0064, 0xFFEB, 0x0000, 0x0007,
144 0x0050, 0x0056, 0x038A, 0x05B7, 0x0F14, 0x3041, 0x7E12, 0xB07C,
145 0x0502, 0xF42C, 0x02F7, 0xFEAC, 0x0064, 0xFFEC, 0x0000, 0x0007,
146 0x0050, 0x0056, 0x038A, 0x05B7, 0x0F14, 0x3041, 0x7E12, 0xB07C,
147 0x0502, 0xF42C, 0x02F7, 0xFEAC, 0x0064, 0xFFEC, 0x0000, 0x0008,
148 0x0053, 0x006B, 0x038E, 0x0652, 0x0E7C, 0x335D, 0x7EC2, 0xB38C,
149 0x0671, 0xF4C3, 0x031C, 0xFECA, 0x0063, 0xFFEE, 0x0000, 0x0008,
150 0x0053, 0x006B, 0x038E, 0x0652, 0x0E7C, 0x335D, 0x7EC2, 0xB38C,
151 0x0671, 0xF4C3, 0x031C, 0xFECA, 0x0063, 0xFFEE, 0x0000, 0x0009,
152 0x0056, 0x0080, 0x038F, 0x06EE, 0x0DCE, 0x367E, 0x7F4D, 0xB6A4,
153 0x07C8, 0xF55C, 0x033B, 0xFEE6, 0x0062, 0xFFEF, 0x0000, 0x0009,
154 0x0056, 0x0080, 0x038F, 0x06EE, 0x0DCE, 0x367E, 0x7F4D, 0xB6A4,
155 0x07C8, 0xF55C, 0x033B, 0xFEE6, 0x0062, 0xFFEF, 0x0000, 0x000A,
156 0x0058, 0x0098, 0x038C, 0x078C, 0x0D08, 0x39A4, 0x7FB0, 0xB9C4,
157 0x0905, 0xF5F9, 0x0354, 0xFF02, 0x0061, 0xFFF1, 0x0000, 0x000A,
158 0x0058, 0x0098, 0x038C, 0x078C, 0x0D08, 0x39A4, 0x7FB0, 0xB9C4,
159 0x0905, 0xF5F9, 0x0354, 0xFF02, 0x0061, 0xFFF1, 0x0000, 0x000B,
160 0x005B, 0x00AF, 0x0385, 0x082B, 0x0C2B, 0x3CCB, 0x7FEB, 0xBCE7,
161 0x0A2A, 0xF697, 0x0369, 0xFF1D, 0x005F, 0xFFF2, 0x0000, 0x000B,
162 0x005B, 0x00AF, 0x0385, 0x082B, 0x0C2B, 0x3CCB, 0x7FEB, 0xBCE7,
163 0x0A2A, 0xF697, 0x0369, 0xFF1D, 0x005F, 0xFFF2, 0x0000, 0x000D,
164 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E,
165 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x000D,
166 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E,
167 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x0000
168 };
169
MP3AB0(int32_t * v)170 static void MP3AB0(int32_t* v)
171 {
172 /* Part 2 - 100% Accurate */
173 static const uint16_t LUT2[8] = {
174 0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4,
175 0x1916, 0x4A50, 0xA268, 0x78AE
176 };
177 static const uint16_t LUT3[4] = { 0xFB14, 0xD4DC, 0x31F2, 0x8E3A };
178 int i;
179
180 for (i = 0; i < 8; i++) {
181 v[16 + i] = v[0 + i] + v[8 + i];
182 v[24 + i] = ((v[0 + i] - v[8 + i]) * LUT2[i]) >> 0x10;
183 }
184
185 /* Part 3: 4-wide butterflies */
186
187 for (i = 0; i < 4; i++) {
188 v[0 + i] = v[16 + i] + v[20 + i];
189 v[4 + i] = ((v[16 + i] - v[20 + i]) * LUT3[i]) >> 0x10;
190
191 v[8 + i] = v[24 + i] + v[28 + i];
192 v[12 + i] = ((v[24 + i] - v[28 + i]) * LUT3[i]) >> 0x10;
193 }
194
195 /* Part 4: 2-wide butterflies - 100% Accurate */
196
197 for (i = 0; i < 16; i += 4) {
198 v[16 + i] = v[0 + i] + v[2 + i];
199 v[18 + i] = ((v[0 + i] - v[2 + i]) * 0xEC84) >> 0x10;
200
201 v[17 + i] = v[1 + i] + v[3 + i];
202 v[19 + i] = ((v[1 + i] - v[3 + i]) * 0x61F8) >> 0x10;
203 }
204 }
205
mp3_task(struct hle_t * hle,unsigned int index,uint32_t address)206 void mp3_task(struct hle_t* hle, unsigned int index, uint32_t address)
207 {
208 uint32_t t6;/* = 0x08A0; - I think these are temporary storage buffers */
209 uint32_t t5;/* = 0x0AC0; */
210 uint32_t t4;/* = (w1 & 0x1E); */
211
212 /* Initialization Code */
213 uint32_t readPtr; /* s5 */
214 uint32_t writePtr; /* s6 */
215 uint32_t tmp;
216 int cnt, cnt2;
217
218 /* I think these are temporary storage buffers */
219 t6 = 0x08A0;
220 t5 = 0x0AC0;
221 t4 = index;
222
223 writePtr = readPtr = address;
224 /* Just do that for efficiency... may remove and use directly later anyway */
225 memcpy(hle->mp3_buffer + 0xCE8, hle->dram + readPtr, 8);
226 /* This must be a header byte or whatnot */
227 readPtr += 8;
228
229 for (cnt = 0; cnt < 0x480; cnt += 0x180)
230 {
231 uint32_t inPtr, outPtr;
232
233 /* DMA: 0xCF0 <- RDRAM[s5] : 0x180 */
234 memcpy(hle->mp3_buffer + 0xCF0, hle->dram + readPtr, 0x180);
235 inPtr = 0xCF0; /* s7 */
236 outPtr = 0xE70; /* s3 */
237 /* --------------- Inner Loop Start -------------------- */
238 for (cnt2 = 0; cnt2 < 0x180; cnt2 += 0x40) {
239 t6 &= 0xFFE0;
240 t5 &= 0xFFE0;
241 t6 |= t4;
242 t5 |= t4;
243 InnerLoop(hle, outPtr, inPtr, t6, t5, t4);
244 t4 = (t4 - 2) & 0x1E;
245 tmp = t6;
246 t6 = t5;
247 t5 = tmp;
248 inPtr += 0x40;
249 outPtr += 0x40;
250 }
251 /* --------------- Inner Loop End -------------------- */
252 memcpy(hle->dram + writePtr, hle->mp3_buffer + 0xe70, 0x180);
253 writePtr += 0x180;
254 readPtr += 0x180;
255 }
256 }
257
InnerLoop(struct hle_t * hle,uint32_t outPtr,uint32_t inPtr,uint32_t t6,uint32_t t5,uint32_t t4)258 static void InnerLoop(struct hle_t* hle,
259 uint32_t outPtr, uint32_t inPtr,
260 uint32_t t6, uint32_t t5, uint32_t t4)
261 {
262 /* Part 1: 100% Accurate */
263
264 /* 0, 1, 3, 2, 7, 6, 4, 5, 7, 6, 4, 5, 0, 1, 3, 2 */
265 static const uint16_t LUT6[16] = {
266 0xFFB2, 0xFD3A, 0xF10A, 0xF854,
267 0xBDAE, 0xCDA0, 0xE76C, 0xDB94,
268 0x1920, 0x4B20, 0xAC7C, 0x7C68,
269 0xABEC, 0x9880, 0xDAE8, 0x839C
270 };
271 int i;
272 uint32_t t0;
273 uint32_t t1;
274 uint32_t t2;
275 uint32_t t3;
276 int32_t v2 = 0, v4 = 0, v6 = 0, v8 = 0;
277 uint32_t offset;
278 uint32_t addptr;
279 int x;
280 int32_t mult6;
281 int32_t mult4;
282 int tmp;
283 int32_t hi0;
284 int32_t hi1;
285 int32_t v[32];
286
287 v[0] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x00 ^ S16));
288 v[31] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3E ^ S16));
289 v[0] += v[31];
290 v[1] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x02 ^ S16));
291 v[30] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3C ^ S16));
292 v[1] += v[30];
293 v[2] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x06 ^ S16));
294 v[28] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x38 ^ S16));
295 v[2] += v[28];
296 v[3] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x04 ^ S16));
297 v[29] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3A ^ S16));
298 v[3] += v[29];
299
300 v[4] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0E ^ S16));
301 v[24] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x30 ^ S16));
302 v[4] += v[24];
303 v[5] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0C ^ S16));
304 v[25] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x32 ^ S16));
305 v[5] += v[25];
306 v[6] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x08 ^ S16));
307 v[27] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x36 ^ S16));
308 v[6] += v[27];
309 v[7] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0A ^ S16));
310 v[26] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x34 ^ S16));
311 v[7] += v[26];
312
313 v[8] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1E ^ S16));
314 v[16] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x20 ^ S16));
315 v[8] += v[16];
316 v[9] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1C ^ S16));
317 v[17] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x22 ^ S16));
318 v[9] += v[17];
319 v[10] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x18 ^ S16));
320 v[19] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x26 ^ S16));
321 v[10] += v[19];
322 v[11] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1A ^ S16));
323 v[18] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x24 ^ S16));
324 v[11] += v[18];
325
326 v[12] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x10 ^ S16));
327 v[23] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2E ^ S16));
328 v[12] += v[23];
329 v[13] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x12 ^ S16));
330 v[22] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2C ^ S16));
331 v[13] += v[22];
332 v[14] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x16 ^ S16));
333 v[20] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x28 ^ S16));
334 v[14] += v[20];
335 v[15] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x14 ^ S16));
336 v[21] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2A ^ S16));
337 v[15] += v[21];
338
339 /* Part 2-4 */
340
341 MP3AB0(v);
342
343 /* Part 5 - 1-Wide Butterflies - 100% Accurate but need SSVs!!! */
344
345 t0 = t6 + 0x100;
346 t1 = t6 + 0x200;
347 t2 = t5 + 0x100;
348 t3 = t5 + 0x200;
349
350 /* 0x13A8 */
351 v[1] = 0;
352 v[11] = ((v[16] - v[17]) * 0xB504) >> 0x10;
353
354 v[16] = -v[16] - v[17];
355 v[2] = v[18] + v[19];
356 /* ** Store v[11] -> (T6 + 0)** */
357 *(int16_t *)(hle->mp3_buffer + ((t6 + (short)0x0))) = (short)v[11];
358
359
360 v[11] = -v[11];
361 /* ** Store v[16] -> (T3 + 0)** */
362 *(int16_t *)(hle->mp3_buffer + ((t3 + (short)0x0))) = (short)v[16];
363 /* ** Store v[11] -> (T5 + 0)** */
364 *(int16_t *)(hle->mp3_buffer + ((t5 + (short)0x0))) = (short)v[11];
365 /* 0x13E8 - Verified.... */
366 v[2] = -v[2];
367 /* ** Store v[2] -> (T2 + 0)** */
368 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0x0))) = (short)v[2];
369 v[3] = (((v[18] - v[19]) * 0x16A09) >> 0x10) + v[2];
370 /* ** Store v[3] -> (T0 + 0)** */
371 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0x0))) = (short)v[3];
372 /* 0x1400 - Verified */
373 v[4] = -v[20] - v[21];
374 v[6] = v[22] + v[23];
375 v[5] = ((v[20] - v[21]) * 0x16A09) >> 0x10;
376 /* ** Store v[4] -> (T3 + 0xFF80) */
377 *(int16_t *)(hle->mp3_buffer + ((t3 + (short)0xFF80))) = (short)v[4];
378 v[7] = ((v[22] - v[23]) * 0x2D413) >> 0x10;
379 v[5] = v[5] - v[4];
380 v[7] = v[7] - v[5];
381 v[6] = v[6] + v[6];
382 v[5] = v[5] - v[6];
383 v[4] = -v[4] - v[6];
384 /* *** Store v[7] -> (T1 + 0xFF80) */
385 *(int16_t *)(hle->mp3_buffer + ((t1 + (short)0xFF80))) = (short)v[7];
386 /* *** Store v[4] -> (T2 + 0xFF80) */
387 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0xFF80))) = (short)v[4];
388 /* *** Store v[5] -> (T0 + 0xFF80) */
389 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0xFF80))) = (short)v[5];
390 v[8] = v[24] + v[25];
391
392
393 v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10;
394 v[2] = v[8] + v[9];
395 v[11] = ((v[26] - v[27]) * 0x2D413) >> 0x10;
396 v[13] = ((v[28] - v[29]) * 0x2D413) >> 0x10;
397
398 v[10] = v[26] + v[27];
399 v[10] = v[10] + v[10];
400 v[12] = v[28] + v[29];
401 v[12] = v[12] + v[12];
402 v[14] = v[30] + v[31];
403 v[3] = v[8] + v[10];
404 v[14] = v[14] + v[14];
405 v[13] = (v[13] - v[2]) + v[12];
406 v[15] = (((v[30] - v[31]) * 0x5A827) >> 0x10) - (v[11] + v[2]);
407 v[14] = -(v[14] + v[14]) + v[3];
408 v[17] = v[13] - v[10];
409 v[9] = v[9] + v[14];
410 /* ** Store v[9] -> (T6 + 0x40) */
411 *(int16_t *)(hle->mp3_buffer + ((t6 + (short)0x40))) = (short)v[9];
412 v[11] = v[11] - v[13];
413 /* ** Store v[17] -> (T0 + 0xFFC0) */
414 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0xFFC0))) = (short)v[17];
415 v[12] = v[8] - v[12];
416 /* ** Store v[11] -> (T0 + 0x40) */
417 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0x40))) = (short)v[11];
418 v[8] = -v[8];
419 /* ** Store v[15] -> (T1 + 0xFFC0) */
420 *(int16_t *)(hle->mp3_buffer + ((t1 + (short)0xFFC0))) = (short)v[15];
421 v[10] = -v[10] - v[12];
422 /* ** Store v[12] -> (T2 + 0x40) */
423 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0x40))) = (short)v[12];
424 /* ** Store v[8] -> (T3 + 0xFFC0) */
425 *(int16_t *)(hle->mp3_buffer + ((t3 + (short)0xFFC0))) = (short)v[8];
426 /* ** Store v[14] -> (T5 + 0x40) */
427 *(int16_t *)(hle->mp3_buffer + ((t5 + (short)0x40))) = (short)v[14];
428 /* ** Store v[10] -> (T2 + 0xFFC0) */
429 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0xFFC0))) = (short)v[10];
430 /* 0x14FC - Verified... */
431
432 /* Part 6 - 100% Accurate */
433
434 v[0] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x00 ^ S16));
435 v[31] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3E ^ S16));
436 v[0] -= v[31];
437 v[1] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x02 ^ S16));
438 v[30] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3C ^ S16));
439 v[1] -= v[30];
440 v[2] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x06 ^ S16));
441 v[28] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x38 ^ S16));
442 v[2] -= v[28];
443 v[3] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x04 ^ S16));
444 v[29] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x3A ^ S16));
445 v[3] -= v[29];
446
447 v[4] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0E ^ S16));
448 v[24] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x30 ^ S16));
449 v[4] -= v[24];
450 v[5] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0C ^ S16));
451 v[25] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x32 ^ S16));
452 v[5] -= v[25];
453 v[6] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x08 ^ S16));
454 v[27] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x36 ^ S16));
455 v[6] -= v[27];
456 v[7] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x0A ^ S16));
457 v[26] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x34 ^ S16));
458 v[7] -= v[26];
459
460 v[8] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1E ^ S16));
461 v[16] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x20 ^ S16));
462 v[8] -= v[16];
463 v[9] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1C ^ S16));
464 v[17] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x22 ^ S16));
465 v[9] -= v[17];
466 v[10] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x18 ^ S16));
467 v[19] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x26 ^ S16));
468 v[10] -= v[19];
469 v[11] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x1A ^ S16));
470 v[18] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x24 ^ S16));
471 v[11] -= v[18];
472
473 v[12] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x10 ^ S16));
474 v[23] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2E ^ S16));
475 v[12] -= v[23];
476 v[13] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x12 ^ S16));
477 v[22] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2C ^ S16));
478 v[13] -= v[22];
479 v[14] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x16 ^ S16));
480 v[20] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x28 ^ S16));
481 v[14] -= v[20];
482 v[15] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x14 ^ S16));
483 v[21] = *(int16_t *)(hle->mp3_buffer + inPtr + (0x2A ^ S16));
484 v[15] -= v[21];
485
486 for (i = 0; i < 16; i++)
487 v[0 + i] = (v[0 + i] * LUT6[i]) >> 0x10;
488 v[0] = v[0] + v[0];
489 v[1] = v[1] + v[1];
490 v[2] = v[2] + v[2];
491 v[3] = v[3] + v[3];
492 v[4] = v[4] + v[4];
493 v[5] = v[5] + v[5];
494 v[6] = v[6] + v[6];
495 v[7] = v[7] + v[7];
496 v[12] = v[12] + v[12];
497 v[13] = v[13] + v[13];
498 v[15] = v[15] + v[15];
499
500 MP3AB0(v);
501
502 /* Part 7: - 100% Accurate + SSV - Unoptimized */
503
504 v[0] = (v[17] + v[16]) >> 1;
505 v[1] = ((v[17] * (int)((short)0xA57E * 2)) + (v[16] * 0xB504)) >> 0x10;
506 v[2] = -v[18] - v[19];
507 v[3] = ((v[18] - v[19]) * 0x16A09) >> 0x10;
508 v[4] = v[20] + v[21] + v[0];
509 v[5] = (((v[20] - v[21]) * 0x16A09) >> 0x10) + v[1];
510 v[6] = (((v[22] + v[23]) << 1) + v[0]) - v[2];
511 v[7] = (((v[22] - v[23]) * 0x2D413) >> 0x10) + v[0] + v[1] + v[3];
512 /* 0x16A8 */
513 /* Save v[0] -> (T3 + 0xFFE0) */
514 *(int16_t *)(hle->mp3_buffer + ((t3 + (short)0xFFE0))) = (short) - v[0];
515 v[8] = v[24] + v[25];
516 v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10;
517 v[10] = ((v[26] + v[27]) << 1) + v[8];
518 v[11] = (((v[26] - v[27]) * 0x2D413) >> 0x10) + v[8] + v[9];
519 v[12] = v[4] - ((v[28] + v[29]) << 1);
520 /* ** Store v12 -> (T2 + 0x20) */
521 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0x20))) = (short)v[12];
522 v[13] = (((v[28] - v[29]) * 0x2D413) >> 0x10) - v[12] - v[5];
523 v[14] = v[30] + v[31];
524 v[14] = v[14] + v[14];
525 v[14] = v[14] + v[14];
526 v[14] = v[6] - v[14];
527 v[15] = (((v[30] - v[31]) * 0x5A827) >> 0x10) - v[7];
528 /* Store v14 -> (T5 + 0x20) */
529 *(int16_t *)(hle->mp3_buffer + ((t5 + (short)0x20))) = (short)v[14];
530 v[14] = v[14] + v[1];
531 /* Store v[14] -> (T6 + 0x20) */
532 *(int16_t *)(hle->mp3_buffer + ((t6 + (short)0x20))) = (short)v[14];
533 /* Store v[15] -> (T1 + 0xFFE0) */
534 *(int16_t *)(hle->mp3_buffer + ((t1 + (short)0xFFE0))) = (short)v[15];
535 v[9] = v[9] + v[10];
536 v[1] = v[1] + v[6];
537 v[6] = v[10] - v[6];
538 v[1] = v[9] - v[1];
539 /* Store v[6] -> (T5 + 0x60) */
540 *(int16_t *)(hle->mp3_buffer + ((t5 + (short)0x60))) = (short)v[6];
541 v[10] = v[10] + v[2];
542 v[10] = v[4] - v[10];
543 /* Store v[10] -> (T2 + 0xFFA0) */
544 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0xFFA0))) = (short)v[10];
545 v[12] = v[2] - v[12];
546 /* Store v[12] -> (T2 + 0xFFE0) */
547 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0xFFE0))) = (short)v[12];
548 v[5] = v[4] + v[5];
549 v[4] = v[8] - v[4];
550 /* Store v[4] -> (T2 + 0x60) */
551 *(int16_t *)(hle->mp3_buffer + ((t2 + (short)0x60))) = (short)v[4];
552 v[0] = v[0] - v[8];
553 /* Store v[0] -> (T3 + 0xFFA0) */
554 *(int16_t *)(hle->mp3_buffer + ((t3 + (short)0xFFA0))) = (short)v[0];
555 v[7] = v[7] - v[11];
556 /* Store v[7] -> (T1 + 0xFFA0) */
557 *(int16_t *)(hle->mp3_buffer + ((t1 + (short)0xFFA0))) = (short)v[7];
558 v[11] = v[11] - v[3];
559 /* Store v[1] -> (T6 + 0x60) */
560 *(int16_t *)(hle->mp3_buffer + ((t6 + (short)0x60))) = (short)v[1];
561 v[11] = v[11] - v[5];
562 /* Store v[11] -> (T0 + 0x60) */
563 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0x60))) = (short)v[11];
564 v[3] = v[3] - v[13];
565 /* Store v[3] -> (T0 + 0x20) */
566 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0x20))) = (short)v[3];
567 v[13] = v[13] + v[2];
568 /* Store v[13] -> (T0 + 0xFFE0) */
569 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0xFFE0))) = (short)v[13];
570 v[2] = (v[5] - v[2]) - v[9];
571 /* Store v[2] -> (T0 + 0xFFA0) */
572 *(int16_t *)(hle->mp3_buffer + ((t0 + (short)0xFFA0))) = (short)v[2];
573 /* 0x7A8 - Verified... */
574
575 /* Step 8 - Dewindowing */
576
577 addptr = t6 & 0xFFE0;
578
579 offset = 0x10 - (t4 >> 1);
580 for (x = 0; x < 8; x++) {
581 int32_t v0;
582 int32_t v18;
583 v2 = v4 = v6 = v8 = 0;
584
585 for (i = 7; i >= 0; i--) {
586 v2 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
587 v4 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
588 v6 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF;
589 v8 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF;
590 addptr += 2;
591 offset++;
592 }
593 v0 = v2 + v4;
594 v18 = v6 + v8;
595 /* Clamp(v0); */
596 /* Clamp(v18); */
597 /* clamp??? */
598 *(int16_t *)(hle->mp3_buffer + (outPtr ^ S16)) = v0;
599 *(int16_t *)(hle->mp3_buffer + ((outPtr + 2)^S16)) = v18;
600 outPtr += 4;
601 addptr += 0x30;
602 offset += 0x38;
603 }
604
605 offset = 0x10 - (t4 >> 1) + 8 * 0x40;
606 v2 = v4 = 0;
607 for (i = 0; i < 4; i++) {
608 v2 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
609 v2 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
610 addptr += 2;
611 offset++;
612 v4 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
613 v4 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
614 addptr += 2;
615 offset++;
616 }
617 mult6 = *(int32_t *)(hle->mp3_buffer + 0xCE8);
618 mult4 = *(int32_t *)(hle->mp3_buffer + 0xCEC);
619 if (t4 & 0x2) {
620 v2 = (v2 **(uint32_t *)(hle->mp3_buffer + 0xCE8)) >> 0x10;
621 *(int16_t *)(hle->mp3_buffer + (outPtr ^ S16)) = v2;
622 } else {
623 v4 = (v4 **(uint32_t *)(hle->mp3_buffer + 0xCE8)) >> 0x10;
624 *(int16_t *)(hle->mp3_buffer + (outPtr ^ S16)) = v4;
625 mult4 = *(uint32_t *)(hle->mp3_buffer + 0xCE8);
626 }
627 addptr -= 0x50;
628
629 for (x = 0; x < 8; x++) {
630 int32_t v0;
631 int32_t v18;
632 v2 = v4 = v6 = v8 = 0;
633
634 offset = (0x22F - (t4 >> 1) + x * 0x40);
635
636 for (i = 0; i < 4; i++) {
637 v2 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
638 v2 -= ((int) * (int16_t *)(hle->mp3_buffer + ((addptr + 2)) + 0x20) * (short)DeWindowLUT[offset + 0x01] + 0x4000) >> 0xF;
639 v4 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
640 v4 -= ((int) * (int16_t *)(hle->mp3_buffer + ((addptr + 2)) + 0x30) * (short)DeWindowLUT[offset + 0x09] + 0x4000) >> 0xF;
641 v6 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF;
642 v6 -= ((int) * (int16_t *)(hle->mp3_buffer + ((addptr + 2)) + 0x00) * (short)DeWindowLUT[offset + 0x21] + 0x4000) >> 0xF;
643 v8 += ((int) * (int16_t *)(hle->mp3_buffer + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF;
644 v8 -= ((int) * (int16_t *)(hle->mp3_buffer + ((addptr + 2)) + 0x10) * (short)DeWindowLUT[offset + 0x29] + 0x4000) >> 0xF;
645 addptr += 4;
646 offset += 2;
647 }
648 v0 = v2 + v4;
649 v18 = v6 + v8;
650 /* Clamp(v0); */
651 /* Clamp(v18); */
652 /* clamp??? */
653 *(int16_t *)(hle->mp3_buffer + ((outPtr + 2)^S16)) = v0;
654 *(int16_t *)(hle->mp3_buffer + ((outPtr + 4)^S16)) = v18;
655 outPtr += 4;
656 addptr -= 0x50;
657 }
658
659 tmp = outPtr;
660 hi0 = mult6;
661 hi1 = mult4;
662
663 hi0 = (int)hi0 >> 0x10;
664 hi1 = (int)hi1 >> 0x10;
665 for (i = 0; i < 8; i++)
666 {
667 /* v0 */
668 int32_t vt = (*(int16_t *)(hle->mp3_buffer + ((tmp - 0x40)^S16)) * hi0);
669 *(int16_t *)((uint8_t *)hle->mp3_buffer + ((tmp - 0x40)^S16)) = clamp_s16(vt);
670
671 /* v17 */
672 vt = (*(int16_t *)(hle->mp3_buffer + ((tmp - 0x30)^S16)) * hi0);
673 *(int16_t *)((uint8_t *)hle->mp3_buffer + ((tmp - 0x30)^S16)) = clamp_s16(vt);
674
675 /* v2 */
676 vt = (*(int16_t *)(hle->mp3_buffer + ((tmp - 0x1E)^S16)) * hi1);
677 *(int16_t *)((uint8_t *)hle->mp3_buffer + ((tmp - 0x1E)^S16)) = clamp_s16(vt);
678
679 /* v4 */
680 vt = (*(int16_t *)(hle->mp3_buffer + ((tmp - 0xE)^S16)) * hi1);
681 *(int16_t *)((uint8_t *)hle->mp3_buffer + ((tmp - 0xE)^S16)) = clamp_s16(vt);
682
683 tmp += 2;
684 }
685 }
686
687