/[pearpc]/src/cpu/cpu_jitc_x86/ppc_dec.cc
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/cpu/cpu_jitc_x86/ppc_dec.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (12 years, 3 months ago) by dpavlin
File size: 40385 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * PearPC
3     * ppc_dec.cc
4     *
5     * Copyright (C) 2003, 2004 Sebastian Biallas (sb@biallas.net)
6     * Copyright (C) 2004 Daniel Foesch (dfoesch@cs.nmsu.edu)
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 version 2 as
10     * published by the Free Software Foundation.
11     *
12     * This program is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with this program; if not, write to the Free Software
19     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20     */
21    
22    
23     #include <cstring>
24    
25     #include "system/types.h"
26     #include "debug/tracers.h"
27     #include "cpu/cpu.h"
28     #include "ppc_alu.h"
29     #include "ppc_cpu.h"
30     #include "ppc_dec.h"
31     #include "ppc_esc.h"
32     #include "ppc_exc.h"
33     #include "ppc_fpu.h"
34     #include "ppc_vec.h"
35     #include "ppc_mmu.h"
36     #include "ppc_opc.h"
37     #include "jitc_asm.h"
38     #include "x86asm.h"
39    
40     #include "io/prom/promosi.h"
41    
42     static void ppc_opc_invalid()
43     {
44     SINGLESTEP("unknown instruction\n");
45     }
46    
47     static JITCFlow ppc_opc_gen_invalid()
48     {
49     // PPC_DEC_WARN("invalid instruction 0x%08x\n", gJITC.current_opc);
50     jitcClobberAll();
51     asmALURegImm(X86_MOV, ESI, gJITC.pc);
52     asmALURegImm(X86_MOV, EDX, gJITC.current_opc);
53     asmALURegImm(X86_MOV, ECX, PPC_EXC_PROGRAM_ILL);
54     asmJMP((NativeAddress)ppc_program_exception_asm);
55     return flowEndBlockUnreachable;
56     }
57    
58     static void ppc_opc_special()
59     {
60     if (gCPU.pc == gPromOSIEntry && gCPU.current_opc == PROM_MAGIC_OPCODE) {
61     call_prom_osi();
62     return;
63     }
64     if (gCPU.current_opc == 0x00333301) {
65     // memset(r3, r4, r5)
66     uint32 dest = gCPU.gpr[3];
67     uint32 c = gCPU.gpr[4];
68     uint32 size = gCPU.gpr[5];
69     if (dest & 0xfff) {
70     byte *dst;
71     ppc_direct_effective_memory_handle(dest, dst);
72     uint32 a = 4096 - (dest & 0xfff);
73     memset(dst, c, a);
74     size -= a;
75     dest += a;
76     }
77     while (size >= 4096) {
78     byte *dst;
79     ppc_direct_effective_memory_handle(dest, dst);
80     memset(dst, c, 4096);
81     dest += 4096;
82     size -= 4096;
83     }
84     if (size) {
85     byte *dst;
86     ppc_direct_effective_memory_handle(dest, dst);
87     memset(dst, c, size);
88     }
89     gCPU.pc = gCPU.npc;
90     return;
91     }
92     if (gCPU.current_opc == 0x00333302) {
93     // memcpy
94     uint32 dest = gCPU.gpr[3];
95     uint32 src = gCPU.gpr[4];
96     uint32 size = gCPU.gpr[5];
97     byte *d, *s;
98     ppc_direct_effective_memory_handle(dest, d);
99     ppc_direct_effective_memory_handle(src, s);
100     while (size--) {
101     if (!(dest & 0xfff)) ppc_direct_effective_memory_handle(dest, d);
102     if (!(src & 0xfff)) ppc_direct_effective_memory_handle(src, s);
103     *d = *s;
104     src++; dest++; d++; s++;
105     }
106     gCPU.pc = gCPU.npc;
107     return;
108     }
109     ppc_opc_invalid();
110     }
111    
112     static JITCFlow ppc_opc_gen_special()
113     {
114     if (gJITC.current_opc == PPC_OPC_ESCAPE_VM) {
115     jitcGetClientRegister(PPC_GPR(3), NATIVE_REG | EAX);
116     jitcClobberAll();
117     asmALURegReg(X86_MOV, EDX, ESP);
118     asmALURegImm(X86_MOV, ECX, gJITC.pc);
119     PPC_ESC_TRACE("pc = %08x\n", gJITC.pc);
120     asmCALL((NativeAddress)&ppc_escape_vm);
121     return flowEndBlock;
122     }
123     if (gJITC.pc == (gPromOSIEntry&0xfff) && gJITC.current_opc == PROM_MAGIC_OPCODE) {
124     jitcClobberAll();
125    
126     asmMOVRegDMem(EAX, (uint32)&gCPU.current_code_base);
127     asmALURegImm(X86_ADD, EAX, gJITC.pc);
128     asmMOVDMemReg((uint32)&gCPU.pc, EAX);
129     asmCALL((NativeAddress)&call_prom_osi);
130     return flowEndBlock;
131     }
132     return ppc_opc_gen_invalid();
133     }
134    
135     // main opcode 19
136     static void ppc_opc_group_1()
137     {
138     uint32 ext = PPC_OPC_EXT(gCPU.current_opc);
139     if (ext & 1) {
140     // crxxx
141     if (ext <= 225) {
142     switch (ext) {
143     case 33: ppc_opc_crnor(); return;
144     case 129: ppc_opc_crandc(); return;
145     case 193: ppc_opc_crxor(); return;
146     case 225: ppc_opc_crnand(); return;
147     }
148     } else {
149     switch (ext) {
150     case 257: ppc_opc_crand(); return;
151     case 289: ppc_opc_creqv(); return;
152     case 417: ppc_opc_crorc(); return;
153     case 449: ppc_opc_cror(); return;
154     }
155     }
156     } else if (ext & (1<<9)) {
157     // bcctrx
158     if (ext == 528) {
159     ppc_opc_bcctrx();
160     return;
161     }
162     } else {
163     switch (ext) {
164     case 16: ppc_opc_bclrx(); return;
165     case 0: ppc_opc_mcrf(); return;
166     case 50: ppc_opc_rfi(); return;
167     case 150: ppc_opc_isync(); return;
168     }
169     }
170     return ppc_opc_invalid();
171     }
172     static JITCFlow ppc_opc_gen_group_1()
173     {
174     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
175     if (ext & 1) {
176     // crxxx
177     if (ext <= 225) {
178     switch (ext) {
179     case 33: return ppc_opc_gen_crnor();
180     case 129: return ppc_opc_gen_crandc();
181     case 193: return ppc_opc_gen_crxor();
182     case 225: return ppc_opc_gen_crnand();
183     }
184     } else {
185     switch (ext) {
186     case 257: return ppc_opc_gen_crand();
187     case 289: return ppc_opc_gen_creqv();
188     case 417: return ppc_opc_gen_crorc();
189     case 449: return ppc_opc_gen_cror();
190     }
191     }
192     } else if (ext & (1<<9)) {
193     // bcctrx
194     if (ext == 528) {
195     return ppc_opc_gen_bcctrx();
196     }
197     } else {
198     switch (ext) {
199     case 16: return ppc_opc_gen_bclrx();
200     case 0: return ppc_opc_gen_mcrf();
201     case 50: return ppc_opc_gen_rfi();
202     case 150: return ppc_opc_gen_isync();
203     }
204     }
205     return ppc_opc_gen_invalid();
206     }
207    
208     ppc_opc_function ppc_opc_table_group2[1015];
209     ppc_opc_gen_function ppc_opc_table_gen_group2[1015];
210    
211     // main opcode 31
212     static void ppc_opc_init_group2()
213     {
214     for (uint i=0; i<(sizeof ppc_opc_table_group2 / sizeof ppc_opc_table_group2[0]); i++) {
215     ppc_opc_table_group2[i] = ppc_opc_invalid;
216     ppc_opc_table_gen_group2[i] = ppc_opc_gen_invalid;
217     }
218     ppc_opc_table_group2[0] = ppc_opc_cmp;
219     ppc_opc_table_group2[4] = ppc_opc_tw;
220     ppc_opc_table_group2[8] = ppc_opc_subfcx;//+
221     ppc_opc_table_group2[10] = ppc_opc_addcx;//+
222     ppc_opc_table_group2[11] = ppc_opc_mulhwux;
223     ppc_opc_table_group2[19] = ppc_opc_mfcr;
224     ppc_opc_table_group2[20] = ppc_opc_lwarx;
225     ppc_opc_table_group2[23] = ppc_opc_lwzx;
226     ppc_opc_table_group2[24] = ppc_opc_slwx;
227     ppc_opc_table_group2[26] = ppc_opc_cntlzwx;
228     ppc_opc_table_group2[28] = ppc_opc_andx;
229     ppc_opc_table_group2[32] = ppc_opc_cmpl;
230     ppc_opc_table_group2[40] = ppc_opc_subfx;
231     ppc_opc_table_group2[54] = ppc_opc_dcbst;
232     ppc_opc_table_group2[55] = ppc_opc_lwzux;
233     ppc_opc_table_group2[60] = ppc_opc_andcx;
234     ppc_opc_table_group2[75] = ppc_opc_mulhwx;
235     ppc_opc_table_group2[83] = ppc_opc_mfmsr;
236     ppc_opc_table_group2[86] = ppc_opc_dcbf;
237     ppc_opc_table_group2[87] = ppc_opc_lbzx;
238     ppc_opc_table_group2[104] = ppc_opc_negx;
239     ppc_opc_table_group2[119] = ppc_opc_lbzux;
240     ppc_opc_table_group2[124] = ppc_opc_norx;
241     ppc_opc_table_group2[136] = ppc_opc_subfex;//+
242     ppc_opc_table_group2[138] = ppc_opc_addex;//+
243     ppc_opc_table_group2[144] = ppc_opc_mtcrf;
244     ppc_opc_table_group2[146] = ppc_opc_mtmsr;
245     ppc_opc_table_group2[150] = ppc_opc_stwcx_;
246     ppc_opc_table_group2[151] = ppc_opc_stwx;
247     ppc_opc_table_group2[183] = ppc_opc_stwux;
248     ppc_opc_table_group2[200] = ppc_opc_subfzex;//+
249     ppc_opc_table_group2[202] = ppc_opc_addzex;//+
250     ppc_opc_table_group2[210] = ppc_opc_mtsr;
251     ppc_opc_table_group2[215] = ppc_opc_stbx;
252     ppc_opc_table_group2[232] = ppc_opc_subfmex;//+
253     ppc_opc_table_group2[234] = ppc_opc_addmex;
254     ppc_opc_table_group2[235] = ppc_opc_mullwx;//+
255     ppc_opc_table_group2[242] = ppc_opc_mtsrin;
256     ppc_opc_table_group2[246] = ppc_opc_dcbtst;
257     ppc_opc_table_group2[247] = ppc_opc_stbux;
258     ppc_opc_table_group2[266] = ppc_opc_addx;//+
259     ppc_opc_table_group2[278] = ppc_opc_dcbt;
260     ppc_opc_table_group2[279] = ppc_opc_lhzx;
261     ppc_opc_table_group2[284] = ppc_opc_eqvx;
262     ppc_opc_table_group2[306] = ppc_opc_tlbie;
263     ppc_opc_table_group2[310] = ppc_opc_eciwx;
264     ppc_opc_table_group2[311] = ppc_opc_lhzux;
265     ppc_opc_table_group2[316] = ppc_opc_xorx;
266     ppc_opc_table_group2[339] = ppc_opc_mfspr;
267     ppc_opc_table_group2[343] = ppc_opc_lhax;
268     ppc_opc_table_group2[370] = ppc_opc_tlbia;
269     ppc_opc_table_group2[371] = ppc_opc_mftb;
270     ppc_opc_table_group2[375] = ppc_opc_lhaux;
271     ppc_opc_table_group2[407] = ppc_opc_sthx;
272     ppc_opc_table_group2[412] = ppc_opc_orcx;
273     ppc_opc_table_group2[438] = ppc_opc_ecowx;
274     ppc_opc_table_group2[439] = ppc_opc_sthux;
275     ppc_opc_table_group2[444] = ppc_opc_orx;
276     ppc_opc_table_group2[459] = ppc_opc_divwux;//+
277     ppc_opc_table_group2[467] = ppc_opc_mtspr;
278     ppc_opc_table_group2[470] = ppc_opc_dcbi;
279     ppc_opc_table_group2[476] = ppc_opc_nandx;
280     ppc_opc_table_group2[491] = ppc_opc_divwx;//+
281     ppc_opc_table_group2[512] = ppc_opc_mcrxr;
282     ppc_opc_table_group2[533] = ppc_opc_lswx;
283     ppc_opc_table_group2[534] = ppc_opc_lwbrx;
284     ppc_opc_table_group2[535] = ppc_opc_lfsx;
285     ppc_opc_table_group2[536] = ppc_opc_srwx;
286     ppc_opc_table_group2[566] = ppc_opc_tlbsync;
287     ppc_opc_table_group2[567] = ppc_opc_lfsux;
288     ppc_opc_table_group2[595] = ppc_opc_mfsr;
289     ppc_opc_table_group2[597] = ppc_opc_lswi;
290     ppc_opc_table_group2[598] = ppc_opc_sync;
291     ppc_opc_table_group2[599] = ppc_opc_lfdx;
292     ppc_opc_table_group2[631] = ppc_opc_lfdux;
293     ppc_opc_table_group2[659] = ppc_opc_mfsrin;
294     ppc_opc_table_group2[661] = ppc_opc_stswx;
295     ppc_opc_table_group2[662] = ppc_opc_stwbrx;
296     ppc_opc_table_group2[663] = ppc_opc_stfsx;
297     ppc_opc_table_group2[695] = ppc_opc_stfsux;
298     ppc_opc_table_group2[725] = ppc_opc_stswi;
299     ppc_opc_table_group2[727] = ppc_opc_stfdx;
300     ppc_opc_table_group2[758] = ppc_opc_dcba;
301     ppc_opc_table_group2[759] = ppc_opc_stfdux;
302     ppc_opc_table_group2[790] = ppc_opc_lhbrx;
303     ppc_opc_table_group2[792] = ppc_opc_srawx;
304     ppc_opc_table_group2[824] = ppc_opc_srawix;
305     ppc_opc_table_group2[854] = ppc_opc_eieio;
306     ppc_opc_table_group2[918] = ppc_opc_sthbrx;
307     ppc_opc_table_group2[922] = ppc_opc_extshx;
308     ppc_opc_table_group2[954] = ppc_opc_extsbx;
309     ppc_opc_table_group2[982] = ppc_opc_icbi;
310     ppc_opc_table_group2[983] = ppc_opc_stfiwx;
311     ppc_opc_table_group2[1014] = ppc_opc_dcbz;
312     ppc_opc_table_gen_group2[0] = ppc_opc_gen_cmp;
313     ppc_opc_table_gen_group2[4] = ppc_opc_gen_tw;
314     ppc_opc_table_gen_group2[8] = ppc_opc_gen_subfcx;//+
315     ppc_opc_table_gen_group2[10] = ppc_opc_gen_addcx;//+
316     ppc_opc_table_gen_group2[11] = ppc_opc_gen_mulhwux;
317     ppc_opc_table_gen_group2[19] = ppc_opc_gen_mfcr;
318     ppc_opc_table_gen_group2[20] = ppc_opc_gen_lwarx;
319     ppc_opc_table_gen_group2[23] = ppc_opc_gen_lwzx;
320     ppc_opc_table_gen_group2[24] = ppc_opc_gen_slwx;
321     ppc_opc_table_gen_group2[26] = ppc_opc_gen_cntlzwx;
322     ppc_opc_table_gen_group2[28] = ppc_opc_gen_andx;
323     ppc_opc_table_gen_group2[32] = ppc_opc_gen_cmpl;
324     ppc_opc_table_gen_group2[40] = ppc_opc_gen_subfx;
325     ppc_opc_table_gen_group2[54] = ppc_opc_gen_dcbst;
326     ppc_opc_table_gen_group2[55] = ppc_opc_gen_lwzux;
327     ppc_opc_table_gen_group2[60] = ppc_opc_gen_andcx;
328     ppc_opc_table_gen_group2[75] = ppc_opc_gen_mulhwx;
329     ppc_opc_table_gen_group2[83] = ppc_opc_gen_mfmsr;
330     ppc_opc_table_gen_group2[86] = ppc_opc_gen_dcbf;
331     ppc_opc_table_gen_group2[87] = ppc_opc_gen_lbzx;
332     ppc_opc_table_gen_group2[104] = ppc_opc_gen_negx;
333     ppc_opc_table_gen_group2[119] = ppc_opc_gen_lbzux;
334     ppc_opc_table_gen_group2[124] = ppc_opc_gen_norx;
335     ppc_opc_table_gen_group2[136] = ppc_opc_gen_subfex;//+
336     ppc_opc_table_gen_group2[138] = ppc_opc_gen_addex;//+
337     ppc_opc_table_gen_group2[144] = ppc_opc_gen_mtcrf;
338     ppc_opc_table_gen_group2[146] = ppc_opc_gen_mtmsr;
339     ppc_opc_table_gen_group2[150] = ppc_opc_gen_stwcx_;
340     ppc_opc_table_gen_group2[151] = ppc_opc_gen_stwx;
341     ppc_opc_table_gen_group2[183] = ppc_opc_gen_stwux;
342     ppc_opc_table_gen_group2[200] = ppc_opc_gen_subfzex;//+
343     ppc_opc_table_gen_group2[202] = ppc_opc_gen_addzex;//+
344     ppc_opc_table_gen_group2[210] = ppc_opc_gen_mtsr;
345     ppc_opc_table_gen_group2[215] = ppc_opc_gen_stbx;
346     ppc_opc_table_gen_group2[232] = ppc_opc_gen_subfmex;//+
347     ppc_opc_table_gen_group2[234] = ppc_opc_gen_addmex;
348     ppc_opc_table_gen_group2[235] = ppc_opc_gen_mullwx;//+
349     ppc_opc_table_gen_group2[242] = ppc_opc_gen_mtsrin;
350     ppc_opc_table_gen_group2[246] = ppc_opc_gen_dcbtst;
351     ppc_opc_table_gen_group2[247] = ppc_opc_gen_stbux;
352     ppc_opc_table_gen_group2[266] = ppc_opc_gen_addx;//+
353     ppc_opc_table_gen_group2[278] = ppc_opc_gen_dcbt;
354     ppc_opc_table_gen_group2[279] = ppc_opc_gen_lhzx;
355     ppc_opc_table_gen_group2[284] = ppc_opc_gen_eqvx;
356     ppc_opc_table_gen_group2[306] = ppc_opc_gen_tlbie;
357     ppc_opc_table_gen_group2[310] = ppc_opc_gen_eciwx;
358     ppc_opc_table_gen_group2[311] = ppc_opc_gen_lhzux;
359     ppc_opc_table_gen_group2[316] = ppc_opc_gen_xorx;
360     ppc_opc_table_gen_group2[339] = ppc_opc_gen_mfspr;
361     ppc_opc_table_gen_group2[343] = ppc_opc_gen_lhax;
362     ppc_opc_table_gen_group2[370] = ppc_opc_gen_tlbia;
363     ppc_opc_table_gen_group2[371] = ppc_opc_gen_mftb;
364     ppc_opc_table_gen_group2[375] = ppc_opc_gen_lhaux;
365     ppc_opc_table_gen_group2[407] = ppc_opc_gen_sthx;
366     ppc_opc_table_gen_group2[412] = ppc_opc_gen_orcx;
367     ppc_opc_table_gen_group2[438] = ppc_opc_gen_ecowx;
368     ppc_opc_table_gen_group2[439] = ppc_opc_gen_sthux;
369     ppc_opc_table_gen_group2[444] = ppc_opc_gen_orx;
370     ppc_opc_table_gen_group2[459] = ppc_opc_gen_divwux;//+
371     ppc_opc_table_gen_group2[467] = ppc_opc_gen_mtspr;
372     ppc_opc_table_gen_group2[470] = ppc_opc_gen_dcbi;
373     ppc_opc_table_gen_group2[476] = ppc_opc_gen_nandx;
374     ppc_opc_table_gen_group2[491] = ppc_opc_gen_divwx;//+
375     ppc_opc_table_gen_group2[512] = ppc_opc_gen_mcrxr;
376     ppc_opc_table_gen_group2[533] = ppc_opc_gen_lswx;
377     ppc_opc_table_gen_group2[534] = ppc_opc_gen_lwbrx;
378     ppc_opc_table_gen_group2[535] = ppc_opc_gen_lfsx;
379     ppc_opc_table_gen_group2[536] = ppc_opc_gen_srwx;
380     ppc_opc_table_gen_group2[566] = ppc_opc_gen_tlbsync;
381     ppc_opc_table_gen_group2[567] = ppc_opc_gen_lfsux;
382     ppc_opc_table_gen_group2[595] = ppc_opc_gen_mfsr;
383     ppc_opc_table_gen_group2[597] = ppc_opc_gen_lswi;
384     ppc_opc_table_gen_group2[598] = ppc_opc_gen_sync;
385     ppc_opc_table_gen_group2[599] = ppc_opc_gen_lfdx;
386     ppc_opc_table_gen_group2[631] = ppc_opc_gen_lfdux;
387     ppc_opc_table_gen_group2[659] = ppc_opc_gen_mfsrin;
388     ppc_opc_table_gen_group2[661] = ppc_opc_gen_stswx;
389     ppc_opc_table_gen_group2[662] = ppc_opc_gen_stwbrx;
390     ppc_opc_table_gen_group2[663] = ppc_opc_gen_stfsx;
391     ppc_opc_table_gen_group2[695] = ppc_opc_gen_stfsux;
392     ppc_opc_table_gen_group2[725] = ppc_opc_gen_stswi;
393     ppc_opc_table_gen_group2[727] = ppc_opc_gen_stfdx;
394     ppc_opc_table_gen_group2[758] = ppc_opc_gen_dcba;
395     ppc_opc_table_gen_group2[759] = ppc_opc_gen_stfdux;
396     ppc_opc_table_gen_group2[790] = ppc_opc_gen_lhbrx;
397     ppc_opc_table_gen_group2[792] = ppc_opc_gen_srawx;
398     ppc_opc_table_gen_group2[824] = ppc_opc_gen_srawix;
399     ppc_opc_table_gen_group2[854] = ppc_opc_gen_eieio;
400     ppc_opc_table_gen_group2[918] = ppc_opc_gen_sthbrx;
401     ppc_opc_table_gen_group2[922] = ppc_opc_gen_extshx;
402     ppc_opc_table_gen_group2[954] = ppc_opc_gen_extsbx;
403     ppc_opc_table_gen_group2[982] = ppc_opc_gen_icbi;
404     ppc_opc_table_gen_group2[983] = ppc_opc_gen_stfiwx;
405     ppc_opc_table_gen_group2[1014] = ppc_opc_gen_dcbz;
406    
407     if ((ppc_cpu_get_pvr(0) & 0xffff0000) == 0x000c0000) {
408     /* Added for Altivec support */
409     ppc_opc_table_group2[6] = ppc_opc_lvsl;
410     ppc_opc_table_group2[7] = ppc_opc_lvebx;
411     ppc_opc_table_group2[38] = ppc_opc_lvsr;
412     ppc_opc_table_group2[39] = ppc_opc_lvehx;
413     ppc_opc_table_group2[71] = ppc_opc_lvewx;
414     ppc_opc_table_group2[103] = ppc_opc_lvx;
415     ppc_opc_table_group2[135] = ppc_opc_stvebx;
416     ppc_opc_table_group2[167] = ppc_opc_stvehx;
417     ppc_opc_table_group2[199] = ppc_opc_stvewx;
418     ppc_opc_table_group2[231] = ppc_opc_stvx;
419     ppc_opc_table_group2[342] = ppc_opc_dst;
420     ppc_opc_table_group2[359] = ppc_opc_lvxl;
421     ppc_opc_table_group2[374] = ppc_opc_dstst;
422     ppc_opc_table_group2[487] = ppc_opc_stvxl;
423     ppc_opc_table_group2[822] = ppc_opc_dss;
424    
425     ppc_opc_table_gen_group2[6] = ppc_opc_gen_lvsl;
426     ppc_opc_table_gen_group2[7] = ppc_opc_gen_lvebx;
427     ppc_opc_table_gen_group2[38] = ppc_opc_gen_lvsr;
428     ppc_opc_table_gen_group2[39] = ppc_opc_gen_lvehx;
429     ppc_opc_table_gen_group2[71] = ppc_opc_gen_lvewx;
430     ppc_opc_table_gen_group2[103] = ppc_opc_gen_lvx;
431     ppc_opc_table_gen_group2[135] = ppc_opc_gen_stvebx;
432     ppc_opc_table_gen_group2[167] = ppc_opc_gen_stvehx;
433     ppc_opc_table_gen_group2[199] = ppc_opc_gen_stvewx;
434     ppc_opc_table_gen_group2[231] = ppc_opc_gen_stvx;
435     ppc_opc_table_gen_group2[342] = ppc_opc_gen_dst;
436     ppc_opc_table_gen_group2[359] = ppc_opc_gen_lvxl;
437     ppc_opc_table_gen_group2[374] = ppc_opc_gen_dstst;
438     ppc_opc_table_gen_group2[487] = ppc_opc_gen_stvxl;
439     ppc_opc_table_gen_group2[822] = ppc_opc_gen_dss;
440     }
441     }
442    
443     // main opcode 31
444     static void ppc_opc_group_2()
445     {
446     uint32 ext = PPC_OPC_EXT(gCPU.current_opc);
447     if (ext >= (sizeof ppc_opc_table_group2 / sizeof ppc_opc_table_group2[0])) {
448     ppc_opc_invalid();
449     }
450     ppc_opc_table_group2[ext]();
451     }
452     static JITCFlow ppc_opc_gen_group_2()
453     {
454     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
455     if (ext >= (sizeof ppc_opc_table_group2 / sizeof ppc_opc_table_group2[0])) {
456     return ppc_opc_gen_invalid();
457     }
458     return ppc_opc_table_gen_group2[ext]();
459     }
460    
461     // main opcode 59
462     static void ppc_opc_group_f1()
463     {
464     if ((gCPU.msr & MSR_FP) == 0) {
465     ppc_exception(PPC_EXC_NO_FPU);
466     return;
467     }
468     uint32 ext = PPC_OPC_EXT(gCPU.current_opc);
469     switch (ext & 0x1f) {
470     case 18: ppc_opc_fdivsx(); return;
471     case 20: ppc_opc_fsubsx(); return;
472     case 21: ppc_opc_faddsx(); return;
473     case 22: ppc_opc_fsqrtsx(); return;
474     case 24: ppc_opc_fresx(); return;
475     case 25: ppc_opc_fmulsx(); return;
476     case 28: ppc_opc_fmsubsx(); return;
477     case 29: ppc_opc_fmaddsx(); return;
478     case 30: ppc_opc_fnmsubsx(); return;
479     case 31: ppc_opc_fnmaddsx(); return;
480     }
481     ppc_opc_invalid();
482     }
483     static JITCFlow ppc_opc_gen_group_f1()
484     {
485     ppc_opc_gen_check_fpu();
486     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
487     switch (ext & 0x1f) {
488     case 18: return ppc_opc_gen_fdivsx();
489     case 20: return ppc_opc_gen_fsubsx();
490     case 21: return ppc_opc_gen_faddsx();
491     case 22: return ppc_opc_gen_fsqrtsx();
492     case 24: return ppc_opc_gen_fresx();
493     case 25: return ppc_opc_gen_fmulsx();
494     case 28: return ppc_opc_gen_fmsubsx();
495     case 29: return ppc_opc_gen_fmaddsx();
496     case 30: return ppc_opc_gen_fnmsubsx();
497     case 31: return ppc_opc_gen_fnmaddsx();
498     }
499     return ppc_opc_gen_invalid();
500     }
501    
502     // main opcode 63
503     static void ppc_opc_group_f2()
504     {
505     if ((gCPU.msr & MSR_FP) == 0) {
506     ppc_exception(PPC_EXC_NO_FPU);
507     return;
508     }
509     uint32 ext = PPC_OPC_EXT(gCPU.current_opc);
510     if (ext & 16) {
511     switch (ext & 0x1f) {
512     case 18: ppc_opc_fdivx(); return;
513     case 20: ppc_opc_fsubx(); return;
514     case 21: ppc_opc_faddx(); return;
515     case 22: ppc_opc_fsqrtx(); return;
516     case 23: ppc_opc_fselx(); return;
517     case 25: ppc_opc_fmulx(); return;
518     case 26: ppc_opc_frsqrtex(); return;
519     case 28: ppc_opc_fmsubx(); return;
520     case 29: ppc_opc_fmaddx(); return;
521     case 30: ppc_opc_fnmsubx(); return;
522     case 31: ppc_opc_fnmaddx(); return;
523     }
524     } else {
525     switch (ext) {
526     case 0: ppc_opc_fcmpu(); return;
527     case 12: ppc_opc_frspx(); return;
528     case 14: ppc_opc_fctiwx(); return;
529     case 15: ppc_opc_fctiwzx(); return;
530     //--
531     case 32: ppc_opc_fcmpo(); return;
532     case 38: ppc_opc_mtfsb1x(); return;
533     case 40: ppc_opc_fnegx(); return;
534     case 64: ppc_opc_mcrfs(); return;
535     case 70: ppc_opc_mtfsb0x(); return;
536     case 72: ppc_opc_fmrx(); return;
537     case 134: ppc_opc_mtfsfix(); return;
538     case 136: ppc_opc_fnabsx(); return;
539     case 264: ppc_opc_fabsx(); return;
540     case 583: ppc_opc_mffsx(); return;
541     case 711: ppc_opc_mtfsfx(); return;
542     }
543     }
544     ppc_opc_invalid();
545     }
546     static JITCFlow ppc_opc_gen_group_f2()
547     {
548     ppc_opc_gen_check_fpu();
549     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
550     if (ext & 16) {
551     switch (ext & 0x1f) {
552     case 18: return ppc_opc_gen_fdivx();
553     case 20: return ppc_opc_gen_fsubx();
554     case 21: return ppc_opc_gen_faddx();
555     case 22: return ppc_opc_gen_fsqrtx();
556     case 23: return ppc_opc_gen_fselx();
557     case 25: return ppc_opc_gen_fmulx();
558     case 26: return ppc_opc_gen_frsqrtex();
559     case 28: return ppc_opc_gen_fmsubx();
560     case 29: return ppc_opc_gen_fmaddx();
561     case 30: return ppc_opc_gen_fnmsubx();
562     case 31: return ppc_opc_gen_fnmaddx();
563     }
564     } else {
565     switch (ext) {
566     case 0: return ppc_opc_gen_fcmpu();
567     case 12: return ppc_opc_gen_frspx();
568     case 14: return ppc_opc_gen_fctiwx();
569     case 15: return ppc_opc_gen_fctiwzx();
570     //--
571     case 32: return ppc_opc_gen_fcmpo();
572     case 38: return ppc_opc_gen_mtfsb1x();
573     case 40: return ppc_opc_gen_fnegx();
574     case 64: return ppc_opc_gen_mcrfs();
575     case 70: return ppc_opc_gen_mtfsb0x();
576     case 72: return ppc_opc_gen_fmrx();
577     case 134: return ppc_opc_gen_mtfsfix();
578     case 136: return ppc_opc_gen_fnabsx();
579     case 264: return ppc_opc_gen_fabsx();
580     case 583: return ppc_opc_gen_mffsx();
581     case 711: return ppc_opc_gen_mtfsfx();
582     }
583     }
584     return ppc_opc_gen_invalid();
585     }
586    
587     ppc_opc_function ppc_opc_table_groupv[965];
588     ppc_opc_gen_function ppc_opc_table_gen_groupv[965];
589    
590     static void ppc_opc_init_groupv()
591     {
592     for (uint i=0; i<(sizeof ppc_opc_table_groupv / sizeof ppc_opc_table_groupv[0]);i++) {
593     ppc_opc_table_groupv[i] = ppc_opc_invalid;
594     ppc_opc_table_gen_groupv[i] = ppc_opc_gen_invalid;
595     }
596     ppc_opc_table_groupv[0] = ppc_opc_vaddubm;
597     ppc_opc_table_groupv[1] = ppc_opc_vmaxub;
598     ppc_opc_table_groupv[2] = ppc_opc_vrlb;
599     ppc_opc_table_groupv[4] = ppc_opc_vmuloub;
600     ppc_opc_table_groupv[5] = ppc_opc_vaddfp;
601     ppc_opc_table_groupv[6] = ppc_opc_vmrghb;
602     ppc_opc_table_groupv[7] = ppc_opc_vpkuhum;
603     ppc_opc_table_groupv[32] = ppc_opc_vadduhm;
604     ppc_opc_table_groupv[33] = ppc_opc_vmaxuh;
605     ppc_opc_table_groupv[34] = ppc_opc_vrlh;
606     ppc_opc_table_groupv[36] = ppc_opc_vmulouh;
607     ppc_opc_table_groupv[37] = ppc_opc_vsubfp;
608     ppc_opc_table_groupv[38] = ppc_opc_vmrghh;
609     ppc_opc_table_groupv[39] = ppc_opc_vpkuwum;
610     ppc_opc_table_groupv[42] = ppc_opc_vpkpx;
611     ppc_opc_table_groupv[64] = ppc_opc_vadduwm;
612     ppc_opc_table_groupv[65] = ppc_opc_vmaxuw;
613     ppc_opc_table_groupv[66] = ppc_opc_vrlw;
614     ppc_opc_table_groupv[70] = ppc_opc_vmrghw;
615     ppc_opc_table_groupv[71] = ppc_opc_vpkuhus;
616     ppc_opc_table_groupv[103] = ppc_opc_vpkuwus;
617     ppc_opc_table_groupv[129] = ppc_opc_vmaxsb;
618     ppc_opc_table_groupv[130] = ppc_opc_vslb;
619     ppc_opc_table_groupv[132] = ppc_opc_vmulosb;
620     ppc_opc_table_groupv[133] = ppc_opc_vrefp;
621     ppc_opc_table_groupv[134] = ppc_opc_vmrglb;
622     ppc_opc_table_groupv[135] = ppc_opc_vpkshus;
623     ppc_opc_table_groupv[161] = ppc_opc_vmaxsh;
624     ppc_opc_table_groupv[162] = ppc_opc_vslh;
625     ppc_opc_table_groupv[164] = ppc_opc_vmulosh;
626     ppc_opc_table_groupv[165] = ppc_opc_vrsqrtefp;
627     ppc_opc_table_groupv[166] = ppc_opc_vmrglh;
628     ppc_opc_table_groupv[167] = ppc_opc_vpkswus;
629     ppc_opc_table_groupv[192] = ppc_opc_vaddcuw;
630     ppc_opc_table_groupv[193] = ppc_opc_vmaxsw;
631     ppc_opc_table_groupv[194] = ppc_opc_vslw;
632     ppc_opc_table_groupv[197] = ppc_opc_vexptefp;
633     ppc_opc_table_groupv[198] = ppc_opc_vmrglw;
634     ppc_opc_table_groupv[199] = ppc_opc_vpkshss;
635     ppc_opc_table_groupv[226] = ppc_opc_vsl;
636     ppc_opc_table_groupv[229] = ppc_opc_vlogefp;
637     ppc_opc_table_groupv[231] = ppc_opc_vpkswss;
638     ppc_opc_table_groupv[256] = ppc_opc_vaddubs;
639     ppc_opc_table_groupv[257] = ppc_opc_vminub;
640     ppc_opc_table_groupv[258] = ppc_opc_vsrb;
641     ppc_opc_table_groupv[260] = ppc_opc_vmuleub;
642     ppc_opc_table_groupv[261] = ppc_opc_vrfin;
643     ppc_opc_table_groupv[262] = ppc_opc_vspltb;
644     ppc_opc_table_groupv[263] = ppc_opc_vupkhsb;
645     ppc_opc_table_groupv[288] = ppc_opc_vadduhs;
646     ppc_opc_table_groupv[289] = ppc_opc_vminuh;
647     ppc_opc_table_groupv[290] = ppc_opc_vsrh;
648     ppc_opc_table_groupv[292] = ppc_opc_vmuleuh;
649     ppc_opc_table_groupv[293] = ppc_opc_vrfiz;
650     ppc_opc_table_groupv[294] = ppc_opc_vsplth;
651     ppc_opc_table_groupv[295] = ppc_opc_vupkhsh;
652     ppc_opc_table_groupv[320] = ppc_opc_vadduws;
653     ppc_opc_table_groupv[321] = ppc_opc_vminuw;
654     ppc_opc_table_groupv[322] = ppc_opc_vsrw;
655     ppc_opc_table_groupv[325] = ppc_opc_vrfip;
656     ppc_opc_table_groupv[326] = ppc_opc_vspltw;
657     ppc_opc_table_groupv[327] = ppc_opc_vupklsb;
658     ppc_opc_table_groupv[354] = ppc_opc_vsr;
659     ppc_opc_table_groupv[357] = ppc_opc_vrfim;
660     ppc_opc_table_groupv[359] = ppc_opc_vupklsh;
661     ppc_opc_table_groupv[384] = ppc_opc_vaddsbs;
662     ppc_opc_table_groupv[385] = ppc_opc_vminsb;
663     ppc_opc_table_groupv[386] = ppc_opc_vsrab;
664     ppc_opc_table_groupv[388] = ppc_opc_vmulesb;
665     ppc_opc_table_groupv[389] = ppc_opc_vcfux;
666     ppc_opc_table_groupv[390] = ppc_opc_vspltisb;
667     ppc_opc_table_groupv[391] = ppc_opc_vpkpx;
668     ppc_opc_table_groupv[416] = ppc_opc_vaddshs;
669     ppc_opc_table_groupv[417] = ppc_opc_vminsh;
670     ppc_opc_table_groupv[418] = ppc_opc_vsrah;
671     ppc_opc_table_groupv[420] = ppc_opc_vmulesh;
672     ppc_opc_table_groupv[421] = ppc_opc_vcfsx;
673     ppc_opc_table_groupv[422] = ppc_opc_vspltish;
674     ppc_opc_table_groupv[423] = ppc_opc_vupkhpx;
675     ppc_opc_table_groupv[448] = ppc_opc_vaddsws;
676     ppc_opc_table_groupv[449] = ppc_opc_vminsw;
677     ppc_opc_table_groupv[450] = ppc_opc_vsraw;
678     ppc_opc_table_groupv[453] = ppc_opc_vctuxs;
679     ppc_opc_table_groupv[454] = ppc_opc_vspltisw;
680     ppc_opc_table_groupv[485] = ppc_opc_vctsxs;
681     ppc_opc_table_groupv[487] = ppc_opc_vupklpx;
682     ppc_opc_table_groupv[512] = ppc_opc_vsububm;
683     ppc_opc_table_groupv[513] = ppc_opc_vavgub;
684     ppc_opc_table_groupv[514] = ppc_opc_vand;
685     ppc_opc_table_groupv[517] = ppc_opc_vmaxfp;
686     ppc_opc_table_groupv[518] = ppc_opc_vslo;
687     ppc_opc_table_groupv[544] = ppc_opc_vsubuhm;
688     ppc_opc_table_groupv[545] = ppc_opc_vavguh;
689     ppc_opc_table_groupv[546] = ppc_opc_vandc;
690     ppc_opc_table_groupv[549] = ppc_opc_vminfp;
691     ppc_opc_table_groupv[550] = ppc_opc_vsro;
692     ppc_opc_table_groupv[576] = ppc_opc_vsubuwm;
693     ppc_opc_table_groupv[577] = ppc_opc_vavguw;
694     ppc_opc_table_groupv[578] = ppc_opc_vor;
695     ppc_opc_table_groupv[610] = ppc_opc_vxor;
696     ppc_opc_table_groupv[641] = ppc_opc_vavgsb;
697     ppc_opc_table_groupv[642] = ppc_opc_vnor;
698     ppc_opc_table_groupv[673] = ppc_opc_vavgsh;
699     ppc_opc_table_groupv[704] = ppc_opc_vsubcuw;
700     ppc_opc_table_groupv[705] = ppc_opc_vavgsw;
701     ppc_opc_table_groupv[768] = ppc_opc_vsububs;
702     ppc_opc_table_groupv[770] = ppc_opc_mfvscr;
703     ppc_opc_table_groupv[772] = ppc_opc_vsum4ubs;
704     ppc_opc_table_groupv[800] = ppc_opc_vsubuhs;
705     ppc_opc_table_groupv[802] = ppc_opc_mtvscr;
706     ppc_opc_table_groupv[804] = ppc_opc_vsum4shs;
707     ppc_opc_table_groupv[832] = ppc_opc_vsubuws;
708     ppc_opc_table_groupv[836] = ppc_opc_vsum2sws;
709     ppc_opc_table_groupv[896] = ppc_opc_vsubsbs;
710     ppc_opc_table_groupv[900] = ppc_opc_vsum4sbs;
711     ppc_opc_table_groupv[928] = ppc_opc_vsubshs;
712     ppc_opc_table_groupv[960] = ppc_opc_vsubsws;
713     ppc_opc_table_groupv[964] = ppc_opc_vsumsws;
714    
715     ppc_opc_table_gen_groupv[0] = ppc_opc_gen_vaddubm;
716     ppc_opc_table_gen_groupv[1] = ppc_opc_gen_vmaxub;
717     ppc_opc_table_gen_groupv[2] = ppc_opc_gen_vrlb;
718     ppc_opc_table_gen_groupv[4] = ppc_opc_gen_vmuloub;
719     ppc_opc_table_gen_groupv[5] = ppc_opc_gen_vaddfp;
720     ppc_opc_table_gen_groupv[6] = ppc_opc_gen_vmrghb;
721     ppc_opc_table_gen_groupv[7] = ppc_opc_gen_vpkuhum;
722     ppc_opc_table_gen_groupv[32] = ppc_opc_gen_vadduhm;
723     ppc_opc_table_gen_groupv[33] = ppc_opc_gen_vmaxuh;
724     ppc_opc_table_gen_groupv[34] = ppc_opc_gen_vrlh;
725     ppc_opc_table_gen_groupv[36] = ppc_opc_gen_vmulouh;
726     ppc_opc_table_gen_groupv[37] = ppc_opc_gen_vsubfp;
727     ppc_opc_table_gen_groupv[38] = ppc_opc_gen_vmrghh;
728     ppc_opc_table_gen_groupv[39] = ppc_opc_gen_vpkuwum;
729     ppc_opc_table_gen_groupv[42] = ppc_opc_gen_vpkpx;
730     ppc_opc_table_gen_groupv[64] = ppc_opc_gen_vadduwm;
731     ppc_opc_table_gen_groupv[65] = ppc_opc_gen_vmaxuw;
732     ppc_opc_table_gen_groupv[66] = ppc_opc_gen_vrlw;
733     ppc_opc_table_gen_groupv[70] = ppc_opc_gen_vmrghw;
734     ppc_opc_table_gen_groupv[71] = ppc_opc_gen_vpkuhus;
735     ppc_opc_table_gen_groupv[103] = ppc_opc_gen_vpkuwus;
736     ppc_opc_table_gen_groupv[129] = ppc_opc_gen_vmaxsb;
737     ppc_opc_table_gen_groupv[130] = ppc_opc_gen_vslb;
738     ppc_opc_table_gen_groupv[132] = ppc_opc_gen_vmulosb;
739     ppc_opc_table_gen_groupv[133] = ppc_opc_gen_vrefp;
740     ppc_opc_table_gen_groupv[134] = ppc_opc_gen_vmrglb;
741     ppc_opc_table_gen_groupv[135] = ppc_opc_gen_vpkshus;
742     ppc_opc_table_gen_groupv[161] = ppc_opc_gen_vmaxsh;
743     ppc_opc_table_gen_groupv[162] = ppc_opc_gen_vslh;
744     ppc_opc_table_gen_groupv[164] = ppc_opc_gen_vmulosh;
745     ppc_opc_table_gen_groupv[165] = ppc_opc_gen_vrsqrtefp;
746     ppc_opc_table_gen_groupv[166] = ppc_opc_gen_vmrglh;
747     ppc_opc_table_gen_groupv[167] = ppc_opc_gen_vpkswus;
748     ppc_opc_table_gen_groupv[192] = ppc_opc_gen_vaddcuw;
749     ppc_opc_table_gen_groupv[193] = ppc_opc_gen_vmaxsw;
750     ppc_opc_table_gen_groupv[194] = ppc_opc_gen_vslw;
751     ppc_opc_table_gen_groupv[197] = ppc_opc_gen_vexptefp;
752     ppc_opc_table_gen_groupv[198] = ppc_opc_gen_vmrglw;
753     ppc_opc_table_gen_groupv[199] = ppc_opc_gen_vpkshss;
754     ppc_opc_table_gen_groupv[226] = ppc_opc_gen_vsl;
755     ppc_opc_table_gen_groupv[229] = ppc_opc_gen_vlogefp;
756     ppc_opc_table_gen_groupv[231] = ppc_opc_gen_vpkswss;
757     ppc_opc_table_gen_groupv[256] = ppc_opc_gen_vaddubs;
758     ppc_opc_table_gen_groupv[257] = ppc_opc_gen_vminub;
759     ppc_opc_table_gen_groupv[258] = ppc_opc_gen_vsrb;
760     ppc_opc_table_gen_groupv[260] = ppc_opc_gen_vmuleub;
761     ppc_opc_table_gen_groupv[261] = ppc_opc_gen_vrfin;
762     ppc_opc_table_gen_groupv[262] = ppc_opc_gen_vspltb;
763     ppc_opc_table_gen_groupv[263] = ppc_opc_gen_vupkhsb;
764     ppc_opc_table_gen_groupv[288] = ppc_opc_gen_vadduhs;
765     ppc_opc_table_gen_groupv[289] = ppc_opc_gen_vminuh;
766     ppc_opc_table_gen_groupv[290] = ppc_opc_gen_vsrh;
767     ppc_opc_table_gen_groupv[292] = ppc_opc_gen_vmuleuh;
768     ppc_opc_table_gen_groupv[293] = ppc_opc_gen_vrfiz;
769     ppc_opc_table_gen_groupv[294] = ppc_opc_gen_vsplth;
770     ppc_opc_table_gen_groupv[295] = ppc_opc_gen_vupkhsh;
771     ppc_opc_table_gen_groupv[320] = ppc_opc_gen_vadduws;
772     ppc_opc_table_gen_groupv[321] = ppc_opc_gen_vminuw;
773     ppc_opc_table_gen_groupv[322] = ppc_opc_gen_vsrw;
774     ppc_opc_table_gen_groupv[325] = ppc_opc_gen_vrfip;
775     ppc_opc_table_gen_groupv[326] = ppc_opc_gen_vspltw;
776     ppc_opc_table_gen_groupv[327] = ppc_opc_gen_vupklsb;
777     ppc_opc_table_gen_groupv[354] = ppc_opc_gen_vsr;
778     ppc_opc_table_gen_groupv[357] = ppc_opc_gen_vrfim;
779     ppc_opc_table_gen_groupv[359] = ppc_opc_gen_vupklsh;
780     ppc_opc_table_gen_groupv[384] = ppc_opc_gen_vaddsbs;
781     ppc_opc_table_gen_groupv[385] = ppc_opc_gen_vminsb;
782     ppc_opc_table_gen_groupv[386] = ppc_opc_gen_vsrab;
783     ppc_opc_table_gen_groupv[388] = ppc_opc_gen_vmulesb;
784     ppc_opc_table_gen_groupv[389] = ppc_opc_gen_vcfux;
785     ppc_opc_table_gen_groupv[390] = ppc_opc_gen_vspltisb;
786     ppc_opc_table_gen_groupv[391] = ppc_opc_gen_vpkpx;
787     ppc_opc_table_gen_groupv[416] = ppc_opc_gen_vaddshs;
788     ppc_opc_table_gen_groupv[417] = ppc_opc_gen_vminsh;
789     ppc_opc_table_gen_groupv[418] = ppc_opc_gen_vsrah;
790     ppc_opc_table_gen_groupv[420] = ppc_opc_gen_vmulesh;
791     ppc_opc_table_gen_groupv[421] = ppc_opc_gen_vcfsx;
792     ppc_opc_table_gen_groupv[422] = ppc_opc_gen_vspltish;
793     ppc_opc_table_gen_groupv[423] = ppc_opc_gen_vupkhpx;
794     ppc_opc_table_gen_groupv[448] = ppc_opc_gen_vaddsws;
795     ppc_opc_table_gen_groupv[449] = ppc_opc_gen_vminsw;
796     ppc_opc_table_gen_groupv[450] = ppc_opc_gen_vsraw;
797     ppc_opc_table_gen_groupv[453] = ppc_opc_gen_vctuxs;
798     ppc_opc_table_gen_groupv[454] = ppc_opc_gen_vspltisw;
799     ppc_opc_table_gen_groupv[485] = ppc_opc_gen_vctsxs;
800     ppc_opc_table_gen_groupv[487] = ppc_opc_gen_vupklpx;
801     ppc_opc_table_gen_groupv[512] = ppc_opc_gen_vsububm;
802     ppc_opc_table_gen_groupv[513] = ppc_opc_gen_vavgub;
803     ppc_opc_table_gen_groupv[514] = ppc_opc_gen_vand;
804     ppc_opc_table_gen_groupv[517] = ppc_opc_gen_vmaxfp;
805     ppc_opc_table_gen_groupv[518] = ppc_opc_gen_vslo;
806     ppc_opc_table_gen_groupv[544] = ppc_opc_gen_vsubuhm;
807     ppc_opc_table_gen_groupv[545] = ppc_opc_gen_vavguh;
808     ppc_opc_table_gen_groupv[546] = ppc_opc_gen_vandc;
809     ppc_opc_table_gen_groupv[549] = ppc_opc_gen_vminfp;
810     ppc_opc_table_gen_groupv[550] = ppc_opc_gen_vsro;
811     ppc_opc_table_gen_groupv[576] = ppc_opc_gen_vsubuwm;
812     ppc_opc_table_gen_groupv[577] = ppc_opc_gen_vavguw;
813     ppc_opc_table_gen_groupv[578] = ppc_opc_gen_vor;
814     ppc_opc_table_gen_groupv[610] = ppc_opc_gen_vxor;
815     ppc_opc_table_gen_groupv[641] = ppc_opc_gen_vavgsb;
816     ppc_opc_table_gen_groupv[642] = ppc_opc_gen_vnor;
817     ppc_opc_table_gen_groupv[673] = ppc_opc_gen_vavgsh;
818     ppc_opc_table_gen_groupv[704] = ppc_opc_gen_vsubcuw;
819     ppc_opc_table_gen_groupv[705] = ppc_opc_gen_vavgsw;
820     ppc_opc_table_gen_groupv[768] = ppc_opc_gen_vsububs;
821     ppc_opc_table_gen_groupv[770] = ppc_opc_gen_mfvscr;
822     ppc_opc_table_gen_groupv[772] = ppc_opc_gen_vsum4ubs;
823     ppc_opc_table_gen_groupv[800] = ppc_opc_gen_vsubuhs;
824     ppc_opc_table_gen_groupv[802] = ppc_opc_gen_mtvscr;
825     ppc_opc_table_gen_groupv[804] = ppc_opc_gen_vsum4shs;
826     ppc_opc_table_gen_groupv[832] = ppc_opc_gen_vsubuws;
827     ppc_opc_table_gen_groupv[836] = ppc_opc_gen_vsum2sws;
828     ppc_opc_table_gen_groupv[896] = ppc_opc_gen_vsubsbs;
829     ppc_opc_table_gen_groupv[900] = ppc_opc_gen_vsum4sbs;
830     ppc_opc_table_gen_groupv[928] = ppc_opc_gen_vsubshs;
831     ppc_opc_table_gen_groupv[960] = ppc_opc_gen_vsubsws;
832     ppc_opc_table_gen_groupv[964] = ppc_opc_gen_vsumsws;
833    
834     /* Put any MMX/SSE/SSE2 optimizations here under conditional
835     * of a CPU caps.
836     */
837     }
838    
839     // main opcode 04
840     static void ppc_opc_group_v()
841     {
842     uint32 ext = PPC_OPC_EXT(gCPU.current_opc);
843     #ifndef __VEC_EXC_OFF__
844     if ((gCPU.msr & MSR_VEC) == 0) {
845     ppc_exception(PPC_EXC_NO_VEC);
846     return;
847     }
848     #endif
849     switch(ext & 0x1f) {
850     case 16:
851     if (gCPU.current_opc & PPC_OPC_Rc)
852     return ppc_opc_vmhraddshs();
853     else
854     return ppc_opc_vmhaddshs();
855     case 17: return ppc_opc_vmladduhm();
856     case 18:
857     if (gCPU.current_opc & PPC_OPC_Rc)
858     return ppc_opc_vmsummbm();
859     else
860     return ppc_opc_vmsumubm();
861     case 19:
862     if (gCPU.current_opc & PPC_OPC_Rc)
863     return ppc_opc_vmsumuhs();
864     else
865     return ppc_opc_vmsumuhm();
866     case 20:
867     if (gCPU.current_opc & PPC_OPC_Rc)
868     return ppc_opc_vmsumshs();
869     else
870     return ppc_opc_vmsumshm();
871     case 21:
872     if (gCPU.current_opc & PPC_OPC_Rc)
873     return ppc_opc_vperm();
874     else
875     return ppc_opc_vsel();
876     case 22: return ppc_opc_vsldoi();
877     case 23:
878     if (gCPU.current_opc & PPC_OPC_Rc)
879     return ppc_opc_vnmsubfp();
880     else
881     return ppc_opc_vmaddfp();
882     }
883     switch(ext & 0x1ff)
884     {
885     case 3: return ppc_opc_vcmpequbx();
886     case 35: return ppc_opc_vcmpequhx();
887     case 67: return ppc_opc_vcmpequwx();
888     case 99: return ppc_opc_vcmpeqfpx();
889     case 227: return ppc_opc_vcmpgefpx();
890     case 259: return ppc_opc_vcmpgtubx();
891     case 291: return ppc_opc_vcmpgtuhx();
892     case 323: return ppc_opc_vcmpgtuwx();
893     case 355: return ppc_opc_vcmpgtfpx();
894     case 387: return ppc_opc_vcmpgtsbx();
895     case 419: return ppc_opc_vcmpgtshx();
896     case 451: return ppc_opc_vcmpgtswx();
897     case 483: return ppc_opc_vcmpbfpx();
898     }
899    
900     if (ext >= (sizeof ppc_opc_table_groupv / sizeof ppc_opc_table_groupv[0])) {
901     return ppc_opc_invalid();
902     }
903     return ppc_opc_table_groupv[ext]();
904     }
905    
906     // main opcode 04
907     static JITCFlow ppc_opc_gen_group_v()
908     {
909     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
910     int vrS = (gJITC.current_opc >> 21) & 0x1f;
911    
912     ppc_opc_gen_check_vec();
913    
914     if (vrS == gJITC.nativeVectorReg) {
915     gJITC.nativeVectorReg = VECTREG_NO;
916     }
917    
918     switch(ext & 0x1f) {
919     case 16:
920     if (gJITC.current_opc & PPC_OPC_Rc)
921     return ppc_opc_gen_vmhraddshs();
922     else
923     return ppc_opc_gen_vmhaddshs();
924     case 17: return ppc_opc_gen_vmladduhm();
925     case 18:
926     if (gJITC.current_opc & PPC_OPC_Rc)
927     return ppc_opc_gen_vmsummbm();
928     else
929     return ppc_opc_gen_vmsumubm();
930     case 19:
931     if (gJITC.current_opc & PPC_OPC_Rc)
932     return ppc_opc_gen_vmsumuhs();
933     else
934     return ppc_opc_gen_vmsumuhm();
935     case 20:
936     if (gJITC.current_opc & PPC_OPC_Rc)
937     return ppc_opc_gen_vmsumshs();
938     else
939     return ppc_opc_gen_vmsumshm();
940     case 21:
941     if (gJITC.current_opc & PPC_OPC_Rc)
942     return ppc_opc_gen_vperm();
943     else
944     return ppc_opc_gen_vsel();
945     case 22: return ppc_opc_gen_vsldoi();
946     case 23:
947     if (gJITC.current_opc & PPC_OPC_Rc)
948     return ppc_opc_gen_vnmsubfp();
949     else
950     return ppc_opc_gen_vmaddfp();
951     }
952     switch(ext & 0x1ff)
953     {
954     case 3: return ppc_opc_gen_vcmpequbx();
955     case 35: return ppc_opc_gen_vcmpequhx();
956     case 67: return ppc_opc_gen_vcmpequwx();
957     case 99: return ppc_opc_gen_vcmpeqfpx();
958     case 227: return ppc_opc_gen_vcmpgefpx();
959     case 259: return ppc_opc_gen_vcmpgtubx();
960     case 291: return ppc_opc_gen_vcmpgtuhx();
961     case 323: return ppc_opc_gen_vcmpgtuwx();
962     case 355: return ppc_opc_gen_vcmpgtfpx();
963     case 387: return ppc_opc_gen_vcmpgtsbx();
964     case 419: return ppc_opc_gen_vcmpgtshx();
965     case 451: return ppc_opc_gen_vcmpgtswx();
966     case 483: return ppc_opc_gen_vcmpbfpx();
967     }
968    
969     if (ext >= (sizeof ppc_opc_table_gen_groupv / sizeof ppc_opc_table_gen_groupv[0])) {
970     return ppc_opc_gen_invalid();
971     }
972     return ppc_opc_table_gen_groupv[ext]();
973     }
974    
975    
976     static ppc_opc_function ppc_opc_table_main[64] = {
977     &ppc_opc_special, // 0
978     &ppc_opc_invalid, // 1
979     &ppc_opc_invalid, // 2 (tdi on 64 bit platforms)
980     &ppc_opc_twi, // 3
981     &ppc_opc_invalid, // 4 (altivec)
982     &ppc_opc_invalid, // 5
983     &ppc_opc_invalid, // 6
984     &ppc_opc_mulli, // 7
985     &ppc_opc_subfic, // 8
986     &ppc_opc_invalid, // 9
987     &ppc_opc_cmpli, // 10
988     &ppc_opc_cmpi, // 11
989     &ppc_opc_addic, // 12
990     &ppc_opc_addic_, // 13
991     &ppc_opc_addi, // 14
992     &ppc_opc_addis, // 15
993     &ppc_opc_bcx, // 16
994     &ppc_opc_sc, // 17
995     &ppc_opc_bx, // 18
996     &ppc_opc_group_1, // 19
997     &ppc_opc_rlwimix, // 20
998     &ppc_opc_rlwinmx, // 21
999     &ppc_opc_invalid, // 22
1000     &ppc_opc_rlwnmx, // 23
1001     &ppc_opc_ori, // 24
1002     &ppc_opc_oris, // 25
1003     &ppc_opc_xori, // 26
1004     &ppc_opc_xoris, // 27
1005     &ppc_opc_andi_, // 28
1006     &ppc_opc_andis_, // 29
1007     &ppc_opc_invalid, // 30 (group_rld on 64 bit platforms)
1008     &ppc_opc_group_2, // 31
1009     &ppc_opc_lwz, // 32
1010     &ppc_opc_lwzu, // 33
1011     &ppc_opc_lbz, // 34
1012     &ppc_opc_lbzu, // 35
1013     &ppc_opc_stw, // 36
1014     &ppc_opc_stwu, // 37
1015     &ppc_opc_stb, // 38
1016     &ppc_opc_stbu, // 39
1017     &ppc_opc_lhz, // 40
1018     &ppc_opc_lhzu, // 41
1019     &ppc_opc_lha, // 42
1020     &ppc_opc_lhau, // 43
1021     &ppc_opc_sth, // 44
1022     &ppc_opc_sthu, // 45
1023     &ppc_opc_lmw, // 46
1024     &ppc_opc_stmw, // 47
1025     &ppc_opc_lfs, // 48
1026     &ppc_opc_lfsu, // 49
1027     &ppc_opc_lfd, // 50
1028     &ppc_opc_lfdu, // 51
1029     &ppc_opc_stfs, // 52
1030     &ppc_opc_stfsu, // 53
1031     &ppc_opc_stfd, // 54
1032     &ppc_opc_stfdu, // 55
1033     &ppc_opc_invalid, // 56
1034     &ppc_opc_invalid, // 57
1035     &ppc_opc_invalid, // 58 (ld on 64 bit platforms)
1036     &ppc_opc_group_f1, // 59
1037     &ppc_opc_invalid, // 60
1038     &ppc_opc_invalid, // 61
1039     &ppc_opc_invalid, // 62
1040     &ppc_opc_group_f2, // 63
1041     };
1042     static ppc_opc_gen_function ppc_opc_table_gen_main[64] = {
1043     &ppc_opc_gen_special, // 0
1044     &ppc_opc_gen_invalid, // 1
1045     &ppc_opc_gen_invalid, // 2 (tdi on 64 bit platforms)
1046     &ppc_opc_gen_twi, // 3
1047     &ppc_opc_gen_invalid, // 4 (altivec)
1048     &ppc_opc_gen_invalid, // 5
1049     &ppc_opc_gen_invalid, // 6
1050     &ppc_opc_gen_mulli, // 7
1051     &ppc_opc_gen_subfic, // 8
1052     &ppc_opc_gen_invalid, // 9
1053     &ppc_opc_gen_cmpli, // 10
1054     &ppc_opc_gen_cmpi, // 11
1055     &ppc_opc_gen_addic, // 12
1056     &ppc_opc_gen_addic_, // 13
1057     &ppc_opc_gen_addi, // 14
1058     &ppc_opc_gen_addis, // 15
1059     &ppc_opc_gen_bcx, // 16
1060     &ppc_opc_gen_sc, // 17
1061     &ppc_opc_gen_bx, // 18
1062     &ppc_opc_gen_group_1, // 19
1063     &ppc_opc_gen_rlwimix, // 20
1064     &ppc_opc_gen_rlwinmx, // 21
1065     &ppc_opc_gen_invalid, // 22
1066     &ppc_opc_gen_rlwnmx, // 23
1067     &ppc_opc_gen_ori, // 24
1068     &ppc_opc_gen_oris, // 25
1069     &ppc_opc_gen_xori, // 26
1070     &ppc_opc_gen_xoris, // 27
1071     &ppc_opc_gen_andi_, // 28
1072     &ppc_opc_gen_andis_, // 29
1073     &ppc_opc_gen_invalid, // 30 (group_rld on 64 bit platforms)
1074     &ppc_opc_gen_group_2, // 31
1075     &ppc_opc_gen_lwz, // 32
1076     &ppc_opc_gen_lwzu, // 33
1077     &ppc_opc_gen_lbz, // 34
1078     &ppc_opc_gen_lbzu, // 35
1079     &ppc_opc_gen_stw, // 36
1080     &ppc_opc_gen_stwu, // 37
1081     &ppc_opc_gen_stb, // 38
1082     &ppc_opc_gen_stbu, // 39
1083     &ppc_opc_gen_lhz, // 40
1084     &ppc_opc_gen_lhzu, // 41
1085     &ppc_opc_gen_lha, // 42
1086     &ppc_opc_gen_lhau, // 43
1087     &ppc_opc_gen_sth, // 44
1088     &ppc_opc_gen_sthu, // 45
1089     &ppc_opc_gen_lmw, // 46
1090     &ppc_opc_gen_stmw, // 47
1091     &ppc_opc_gen_lfs, // 48
1092     &ppc_opc_gen_lfsu, // 49
1093     &ppc_opc_gen_lfd, // 50
1094     &ppc_opc_gen_lfdu, // 51
1095     &ppc_opc_gen_stfs, // 52
1096     &ppc_opc_gen_stfsu, // 53
1097     &ppc_opc_gen_stfd, // 54
1098     &ppc_opc_gen_stfdu, // 55
1099     &ppc_opc_gen_invalid, // 56
1100     &ppc_opc_gen_invalid, // 57
1101     &ppc_opc_gen_invalid, // 58 (ld on 64 bit platforms)
1102     &ppc_opc_gen_group_f1, // 59
1103     &ppc_opc_gen_invalid, // 60
1104     &ppc_opc_gen_invalid, // 61
1105     &ppc_opc_gen_invalid, // 62
1106     &ppc_opc_gen_group_f2, // 63
1107     };
1108    
1109     void FASTCALL ppc_exec_opc()
1110     {
1111     uint32 mainopc = PPC_OPC_MAIN(gCPU.current_opc);
1112     ppc_opc_table_main[mainopc]();
1113     }
1114    
1115     static uint32 last_instr = 0, instr_report = 0, instr_count = 0;
1116    
1117     JITCFlow FASTCALL ppc_gen_opc()
1118     {
1119     uint32 mainopc = PPC_OPC_MAIN(gJITC.current_opc);
1120    
1121     /*if (instr_report) {
1122     uint32 ext = PPC_OPC_EXT(gJITC.current_opc);
1123     uint32 rD, rA, rB, rC;
1124     PPC_OPC_TEMPL_A(gJITC.current_opc, rD, rA, rB, rC);
1125    
1126     printf("*** (%08x) %08x (%i, %i) (%i, %i, %i, %i)\n", instr_count++, gJITC.current_opc, mainopc, ext, rD, rA, rB, rC);
1127     } else {
1128     if (last_instr == 0x7c00004c && gJITC.current_opc == 0x10e0038c) {
1129     instr_report = 1;
1130     }
1131    
1132     last_instr = gJITC.current_opc;
1133     }*/
1134    
1135     return ppc_opc_table_gen_main[mainopc]();
1136     }
1137    
1138     void ppc_dec_init()
1139     {
1140     ppc_opc_init_group2();
1141     if ((ppc_cpu_get_pvr(0) & 0xffff0000) == 0x000c0000) {
1142     ht_printf("[PPC/VEC] Vector Address: %08x\n", (uint32)&gCPU.vr[0]);
1143     ppc_opc_table_main[4] = ppc_opc_group_v;
1144     ppc_opc_table_gen_main[4] = ppc_opc_gen_group_v;
1145     ppc_opc_init_groupv();
1146     }
1147     }

  ViewVC Help
Powered by ViewVC 1.1.26