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