- [PPC] Rename ppc_opcode_lookup.cc, ppc_opcode_table.cc to have a _gen suffix to make it more obvious about their autogenerated nature. - [PPC] Move autogenerated code from ppc_opcode_disasm.cc to ppc_opcode_disasm_gen.cc. - [PPC] Update ppc-table-gen to allow for blacklisting of certain instructions that have custom disasm code.
553 lines
24 KiB
C++
553 lines
24 KiB
C++
// This code was autogenerated by ./tools/ppc-table-gen. Do not modify!
|
|
// clang-format off
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
|
|
#include "xenia/base/assert.h"
|
|
#include "xenia/cpu/ppc/ppc_opcode.h"
|
|
#include "xenia/cpu/ppc/ppc_opcode_info.h"
|
|
|
|
namespace xe {
|
|
namespace cpu {
|
|
namespace ppc {
|
|
|
|
constexpr uint32_t ExtractBits(uint32_t v, uint32_t a, uint32_t b) {
|
|
return (v >> (32 - 1 - b)) & ((1 << (b - a + 1)) - 1);
|
|
}
|
|
|
|
#define PPC_DECODER_MISS assert_always(); return PPCOpcode::kInvalid
|
|
#define PPC_DECODER_HIT(name) return PPCOpcode::name;
|
|
|
|
PPCOpcode LookupOpcode(uint32_t code) {
|
|
switch (ExtractBits(code, 0, 5)) {
|
|
case 2: PPC_DECODER_HIT(tdi);
|
|
case 3: PPC_DECODER_HIT(twi);
|
|
case 4:
|
|
switch ((ExtractBits(code, 21, 27) << 4)|(ExtractBits(code, 30, 31) << 0)) {
|
|
case 0b00000000011: PPC_DECODER_HIT(lvsl128);
|
|
case 0b00001000011: PPC_DECODER_HIT(lvsr128);
|
|
case 0b00010000011: PPC_DECODER_HIT(lvewx128);
|
|
case 0b00011000011: PPC_DECODER_HIT(lvx128);
|
|
case 0b00110000011: PPC_DECODER_HIT(stvewx128);
|
|
case 0b00111000011: PPC_DECODER_HIT(stvx128);
|
|
case 0b01011000011: PPC_DECODER_HIT(lvxl128);
|
|
case 0b01111000011: PPC_DECODER_HIT(stvxl128);
|
|
case 0b10000000011: PPC_DECODER_HIT(lvlx128);
|
|
case 0b10001000011: PPC_DECODER_HIT(lvrx128);
|
|
case 0b10100000011: PPC_DECODER_HIT(stvlx128);
|
|
case 0b10101000011: PPC_DECODER_HIT(stvrx128);
|
|
case 0b11000000011: PPC_DECODER_HIT(lvlxl128);
|
|
case 0b11001000011: PPC_DECODER_HIT(lvrxl128);
|
|
case 0b11100000011: PPC_DECODER_HIT(stvlxl128);
|
|
case 0b11101000011: PPC_DECODER_HIT(stvrxl128);
|
|
}
|
|
switch ((ExtractBits(code, 21, 31) << 0)) {
|
|
case 0b00000000000: PPC_DECODER_HIT(vaddubm);
|
|
case 0b00000000010: PPC_DECODER_HIT(vmaxub);
|
|
case 0b00000000100: PPC_DECODER_HIT(vrlb);
|
|
case 0b00000001000: PPC_DECODER_HIT(vmuloub);
|
|
case 0b00000001010: PPC_DECODER_HIT(vaddfp);
|
|
case 0b00000001100: PPC_DECODER_HIT(vmrghb);
|
|
case 0b00000001110: PPC_DECODER_HIT(vpkuhum);
|
|
case 0b00001000000: PPC_DECODER_HIT(vadduhm);
|
|
case 0b00001000010: PPC_DECODER_HIT(vmaxuh);
|
|
case 0b00001000100: PPC_DECODER_HIT(vrlh);
|
|
case 0b00001001000: PPC_DECODER_HIT(vmulouh);
|
|
case 0b00001001010: PPC_DECODER_HIT(vsubfp);
|
|
case 0b00001001100: PPC_DECODER_HIT(vmrghh);
|
|
case 0b00001001110: PPC_DECODER_HIT(vpkuwum);
|
|
case 0b00010000000: PPC_DECODER_HIT(vadduwm);
|
|
case 0b00010000010: PPC_DECODER_HIT(vmaxuw);
|
|
case 0b00010000100: PPC_DECODER_HIT(vrlw);
|
|
case 0b00010001100: PPC_DECODER_HIT(vmrghw);
|
|
case 0b00010001110: PPC_DECODER_HIT(vpkuhus);
|
|
case 0b00011001110: PPC_DECODER_HIT(vpkuwus);
|
|
case 0b00100000010: PPC_DECODER_HIT(vmaxsb);
|
|
case 0b00100000100: PPC_DECODER_HIT(vslb);
|
|
case 0b00100001000: PPC_DECODER_HIT(vmulosb);
|
|
case 0b00100001010: PPC_DECODER_HIT(vrefp);
|
|
case 0b00100001100: PPC_DECODER_HIT(vmrglb);
|
|
case 0b00100001110: PPC_DECODER_HIT(vpkshus);
|
|
case 0b00101000010: PPC_DECODER_HIT(vmaxsh);
|
|
case 0b00101000100: PPC_DECODER_HIT(vslh);
|
|
case 0b00101001000: PPC_DECODER_HIT(vmulosh);
|
|
case 0b00101001010: PPC_DECODER_HIT(vrsqrtefp);
|
|
case 0b00101001100: PPC_DECODER_HIT(vmrglh);
|
|
case 0b00101001110: PPC_DECODER_HIT(vpkswus);
|
|
case 0b00110000000: PPC_DECODER_HIT(vaddcuw);
|
|
case 0b00110000010: PPC_DECODER_HIT(vmaxsw);
|
|
case 0b00110000100: PPC_DECODER_HIT(vslw);
|
|
case 0b00110001010: PPC_DECODER_HIT(vexptefp);
|
|
case 0b00110001100: PPC_DECODER_HIT(vmrglw);
|
|
case 0b00110001110: PPC_DECODER_HIT(vpkshss);
|
|
case 0b00111000100: PPC_DECODER_HIT(vsl);
|
|
case 0b00111001010: PPC_DECODER_HIT(vlogefp);
|
|
case 0b00111001110: PPC_DECODER_HIT(vpkswss);
|
|
case 0b01000000000: PPC_DECODER_HIT(vaddubs);
|
|
case 0b01000000010: PPC_DECODER_HIT(vminub);
|
|
case 0b01000000100: PPC_DECODER_HIT(vsrb);
|
|
case 0b01000001000: PPC_DECODER_HIT(vmuleub);
|
|
case 0b01000001010: PPC_DECODER_HIT(vrfin);
|
|
case 0b01000001100: PPC_DECODER_HIT(vspltb);
|
|
case 0b01000001110: PPC_DECODER_HIT(vupkhsb);
|
|
case 0b01001000000: PPC_DECODER_HIT(vadduhs);
|
|
case 0b01001000010: PPC_DECODER_HIT(vminuh);
|
|
case 0b01001000100: PPC_DECODER_HIT(vsrh);
|
|
case 0b01001001000: PPC_DECODER_HIT(vmuleuh);
|
|
case 0b01001001010: PPC_DECODER_HIT(vrfiz);
|
|
case 0b01001001100: PPC_DECODER_HIT(vsplth);
|
|
case 0b01001001110: PPC_DECODER_HIT(vupkhsh);
|
|
case 0b01010000000: PPC_DECODER_HIT(vadduws);
|
|
case 0b01010000010: PPC_DECODER_HIT(vminuw);
|
|
case 0b01010000100: PPC_DECODER_HIT(vsrw);
|
|
case 0b01010001010: PPC_DECODER_HIT(vrfip);
|
|
case 0b01010001100: PPC_DECODER_HIT(vspltw);
|
|
case 0b01010001110: PPC_DECODER_HIT(vupklsb);
|
|
case 0b01011000100: PPC_DECODER_HIT(vsr);
|
|
case 0b01011001010: PPC_DECODER_HIT(vrfim);
|
|
case 0b01011001110: PPC_DECODER_HIT(vupklsh);
|
|
case 0b01100000000: PPC_DECODER_HIT(vaddsbs);
|
|
case 0b01100000010: PPC_DECODER_HIT(vminsb);
|
|
case 0b01100000100: PPC_DECODER_HIT(vsrab);
|
|
case 0b01100001000: PPC_DECODER_HIT(vmulesb);
|
|
case 0b01100001010: PPC_DECODER_HIT(vcfux);
|
|
case 0b01100001100: PPC_DECODER_HIT(vspltisb);
|
|
case 0b01100001110: PPC_DECODER_HIT(vpkpx);
|
|
case 0b01101000000: PPC_DECODER_HIT(vaddshs);
|
|
case 0b01101000010: PPC_DECODER_HIT(vminsh);
|
|
case 0b01101000100: PPC_DECODER_HIT(vsrah);
|
|
case 0b01101001000: PPC_DECODER_HIT(vmulesh);
|
|
case 0b01101001010: PPC_DECODER_HIT(vcfsx);
|
|
case 0b01101001100: PPC_DECODER_HIT(vspltish);
|
|
case 0b01101001110: PPC_DECODER_HIT(vupkhpx);
|
|
case 0b01110000000: PPC_DECODER_HIT(vaddsws);
|
|
case 0b01110000010: PPC_DECODER_HIT(vminsw);
|
|
case 0b01110000100: PPC_DECODER_HIT(vsraw);
|
|
case 0b01110001010: PPC_DECODER_HIT(vctuxs);
|
|
case 0b01110001100: PPC_DECODER_HIT(vspltisw);
|
|
case 0b01111001010: PPC_DECODER_HIT(vctsxs);
|
|
case 0b01111001110: PPC_DECODER_HIT(vupklpx);
|
|
case 0b10000000000: PPC_DECODER_HIT(vsububm);
|
|
case 0b10000000010: PPC_DECODER_HIT(vavgub);
|
|
case 0b10000000100: PPC_DECODER_HIT(vand);
|
|
case 0b10000001010: PPC_DECODER_HIT(vmaxfp);
|
|
case 0b10000001100: PPC_DECODER_HIT(vslo);
|
|
case 0b10001000000: PPC_DECODER_HIT(vsubuhm);
|
|
case 0b10001000010: PPC_DECODER_HIT(vavguh);
|
|
case 0b10001000100: PPC_DECODER_HIT(vandc);
|
|
case 0b10001001010: PPC_DECODER_HIT(vminfp);
|
|
case 0b10001001100: PPC_DECODER_HIT(vsro);
|
|
case 0b10010000000: PPC_DECODER_HIT(vsubuwm);
|
|
case 0b10010000010: PPC_DECODER_HIT(vavguw);
|
|
case 0b10010000100: PPC_DECODER_HIT(vor);
|
|
case 0b10011000100: PPC_DECODER_HIT(vxor);
|
|
case 0b10100000010: PPC_DECODER_HIT(vavgsb);
|
|
case 0b10100000100: PPC_DECODER_HIT(vnor);
|
|
case 0b10101000010: PPC_DECODER_HIT(vavgsh);
|
|
case 0b10110000000: PPC_DECODER_HIT(vsubcuw);
|
|
case 0b10110000010: PPC_DECODER_HIT(vavgsw);
|
|
case 0b11000000000: PPC_DECODER_HIT(vsububs);
|
|
case 0b11000000100: PPC_DECODER_HIT(mfvscr);
|
|
case 0b11000001000: PPC_DECODER_HIT(vsum4ubs);
|
|
case 0b11001000000: PPC_DECODER_HIT(vsubuhs);
|
|
case 0b11001000100: PPC_DECODER_HIT(mtvscr);
|
|
case 0b11001001000: PPC_DECODER_HIT(vsum4shs);
|
|
case 0b11010000000: PPC_DECODER_HIT(vsubuws);
|
|
case 0b11010001000: PPC_DECODER_HIT(vsum2sws);
|
|
case 0b11100000000: PPC_DECODER_HIT(vsubsbs);
|
|
case 0b11100001000: PPC_DECODER_HIT(vsum4sbs);
|
|
case 0b11101000000: PPC_DECODER_HIT(vsubshs);
|
|
case 0b11110000000: PPC_DECODER_HIT(vsubsws);
|
|
case 0b11110001000: PPC_DECODER_HIT(vsumsws);
|
|
}
|
|
switch ((ExtractBits(code, 22, 31) << 0)) {
|
|
case 0b0000000110: PPC_DECODER_HIT(vcmpequb);
|
|
case 0b0001000110: PPC_DECODER_HIT(vcmpequh);
|
|
case 0b0010000110: PPC_DECODER_HIT(vcmpequw);
|
|
case 0b0011000110: PPC_DECODER_HIT(vcmpeqfp);
|
|
case 0b0111000110: PPC_DECODER_HIT(vcmpgefp);
|
|
case 0b1000000110: PPC_DECODER_HIT(vcmpgtub);
|
|
case 0b1001000110: PPC_DECODER_HIT(vcmpgtuh);
|
|
case 0b1010000110: PPC_DECODER_HIT(vcmpgtuw);
|
|
case 0b1011000110: PPC_DECODER_HIT(vcmpgtfp);
|
|
case 0b1100000110: PPC_DECODER_HIT(vcmpgtsb);
|
|
case 0b1101000110: PPC_DECODER_HIT(vcmpgtsh);
|
|
case 0b1110000110: PPC_DECODER_HIT(vcmpgtsw);
|
|
case 0b1111000110: PPC_DECODER_HIT(vcmpbfp);
|
|
}
|
|
switch ((ExtractBits(code, 26, 31) << 0)) {
|
|
case 0b100000: PPC_DECODER_HIT(vmhaddshs);
|
|
case 0b100001: PPC_DECODER_HIT(vmhraddshs);
|
|
case 0b100010: PPC_DECODER_HIT(vmladduhm);
|
|
case 0b100100: PPC_DECODER_HIT(vmsumubm);
|
|
case 0b100101: PPC_DECODER_HIT(vmsummbm);
|
|
case 0b100110: PPC_DECODER_HIT(vmsumuhm);
|
|
case 0b100111: PPC_DECODER_HIT(vmsumuhs);
|
|
case 0b101000: PPC_DECODER_HIT(vmsumshm);
|
|
case 0b101001: PPC_DECODER_HIT(vmsumshs);
|
|
case 0b101010: PPC_DECODER_HIT(vsel);
|
|
case 0b101011: PPC_DECODER_HIT(vperm);
|
|
case 0b101100: PPC_DECODER_HIT(vsldoi);
|
|
case 0b101110: PPC_DECODER_HIT(vmaddfp);
|
|
case 0b101111: PPC_DECODER_HIT(vnmsubfp);
|
|
}
|
|
switch ((ExtractBits(code, 27, 27) << 0)) {
|
|
case 0b1: PPC_DECODER_HIT(vsldoi128);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 5:
|
|
switch ((ExtractBits(code, 22, 22) << 5)|(ExtractBits(code, 27, 27) << 0)) {
|
|
case 0b000000: PPC_DECODER_HIT(vperm128);
|
|
}
|
|
switch ((ExtractBits(code, 22, 25) << 2)|(ExtractBits(code, 27, 27) << 0)) {
|
|
case 0b000001: PPC_DECODER_HIT(vaddfp128);
|
|
case 0b000101: PPC_DECODER_HIT(vsubfp128);
|
|
case 0b001001: PPC_DECODER_HIT(vmulfp128);
|
|
case 0b001101: PPC_DECODER_HIT(vmaddfp128);
|
|
case 0b010001: PPC_DECODER_HIT(vmaddcfp128);
|
|
case 0b010101: PPC_DECODER_HIT(vnmsubfp128);
|
|
case 0b011001: PPC_DECODER_HIT(vmsum3fp128);
|
|
case 0b011101: PPC_DECODER_HIT(vmsum4fp128);
|
|
case 0b100000: PPC_DECODER_HIT(vpkshss128);
|
|
case 0b100001: PPC_DECODER_HIT(vand128);
|
|
case 0b100100: PPC_DECODER_HIT(vpkshus128);
|
|
case 0b100101: PPC_DECODER_HIT(vandc128);
|
|
case 0b101000: PPC_DECODER_HIT(vpkswss128);
|
|
case 0b101001: PPC_DECODER_HIT(vnor128);
|
|
case 0b101100: PPC_DECODER_HIT(vpkswus128);
|
|
case 0b101101: PPC_DECODER_HIT(vor128);
|
|
case 0b110000: PPC_DECODER_HIT(vpkuhum128);
|
|
case 0b110001: PPC_DECODER_HIT(vxor128);
|
|
case 0b110100: PPC_DECODER_HIT(vpkuhus128);
|
|
case 0b110101: PPC_DECODER_HIT(vsel128);
|
|
case 0b111000: PPC_DECODER_HIT(vpkuwum128);
|
|
case 0b111001: PPC_DECODER_HIT(vslo128);
|
|
case 0b111100: PPC_DECODER_HIT(vpkuwus128);
|
|
case 0b111101: PPC_DECODER_HIT(vsro128);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 6:
|
|
switch ((ExtractBits(code, 21, 22) << 5)|(ExtractBits(code, 26, 27) << 0)) {
|
|
case 0b0100001: PPC_DECODER_HIT(vpermwi128);
|
|
}
|
|
switch ((ExtractBits(code, 21, 23) << 4)|(ExtractBits(code, 26, 27) << 0)) {
|
|
case 0b1100001: PPC_DECODER_HIT(vpkd3d128);
|
|
case 0b1110001: PPC_DECODER_HIT(vrlimi128);
|
|
}
|
|
switch ((ExtractBits(code, 21, 27) << 0)) {
|
|
case 0b0100011: PPC_DECODER_HIT(vcfpsxws128);
|
|
case 0b0100111: PPC_DECODER_HIT(vcfpuxws128);
|
|
case 0b0101011: PPC_DECODER_HIT(vcsxwfp128);
|
|
case 0b0101111: PPC_DECODER_HIT(vcuxwfp128);
|
|
case 0b0110011: PPC_DECODER_HIT(vrfim128);
|
|
case 0b0110111: PPC_DECODER_HIT(vrfin128);
|
|
case 0b0111011: PPC_DECODER_HIT(vrfip128);
|
|
case 0b0111111: PPC_DECODER_HIT(vrfiz128);
|
|
case 0b1100011: PPC_DECODER_HIT(vrefp128);
|
|
case 0b1100111: PPC_DECODER_HIT(vrsqrtefp128);
|
|
case 0b1101011: PPC_DECODER_HIT(vexptefp128);
|
|
case 0b1101111: PPC_DECODER_HIT(vlogefp128);
|
|
case 0b1110011: PPC_DECODER_HIT(vspltw128);
|
|
case 0b1110111: PPC_DECODER_HIT(vspltisw128);
|
|
case 0b1111111: PPC_DECODER_HIT(vupkd3d128);
|
|
}
|
|
switch ((ExtractBits(code, 22, 24) << 3)|(ExtractBits(code, 27, 27) << 0)) {
|
|
case 0b000000: PPC_DECODER_HIT(vcmpeqfp128);
|
|
case 0b001000: PPC_DECODER_HIT(vcmpgefp128);
|
|
case 0b010000: PPC_DECODER_HIT(vcmpgtfp128);
|
|
case 0b011000: PPC_DECODER_HIT(vcmpbfp128);
|
|
case 0b100000: PPC_DECODER_HIT(vcmpequw128);
|
|
}
|
|
switch ((ExtractBits(code, 22, 25) << 2)|(ExtractBits(code, 27, 27) << 0)) {
|
|
case 0b000101: PPC_DECODER_HIT(vrlw128);
|
|
case 0b001101: PPC_DECODER_HIT(vslw128);
|
|
case 0b010101: PPC_DECODER_HIT(vsraw128);
|
|
case 0b011101: PPC_DECODER_HIT(vsrw128);
|
|
case 0b101000: PPC_DECODER_HIT(vmaxfp128);
|
|
case 0b101100: PPC_DECODER_HIT(vminfp128);
|
|
case 0b110000: PPC_DECODER_HIT(vmrghw128);
|
|
case 0b110100: PPC_DECODER_HIT(vmrglw128);
|
|
case 0b111000: PPC_DECODER_HIT(vupkhsb128);
|
|
case 0b111100: PPC_DECODER_HIT(vupklsb128);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 7: PPC_DECODER_HIT(mulli);
|
|
case 8: PPC_DECODER_HIT(subficx);
|
|
case 10: PPC_DECODER_HIT(cmpli);
|
|
case 11: PPC_DECODER_HIT(cmpi);
|
|
case 12: PPC_DECODER_HIT(addic);
|
|
case 13: PPC_DECODER_HIT(addicx);
|
|
case 14: PPC_DECODER_HIT(addi);
|
|
case 15: PPC_DECODER_HIT(addis);
|
|
case 16: PPC_DECODER_HIT(bcx);
|
|
case 17: PPC_DECODER_HIT(sc);
|
|
case 18: PPC_DECODER_HIT(bx);
|
|
case 19:
|
|
switch ((ExtractBits(code, 21, 30) << 0)) {
|
|
case 0b0000000000: PPC_DECODER_HIT(mcrf);
|
|
case 0b0000010000: PPC_DECODER_HIT(bclrx);
|
|
case 0b0000100001: PPC_DECODER_HIT(crnor);
|
|
case 0b0010000001: PPC_DECODER_HIT(crandc);
|
|
case 0b0010010110: PPC_DECODER_HIT(isync);
|
|
case 0b0011000001: PPC_DECODER_HIT(crxor);
|
|
case 0b0011100001: PPC_DECODER_HIT(crnand);
|
|
case 0b0100000001: PPC_DECODER_HIT(crand);
|
|
case 0b0100100001: PPC_DECODER_HIT(creqv);
|
|
case 0b0110100001: PPC_DECODER_HIT(crorc);
|
|
case 0b0111000001: PPC_DECODER_HIT(cror);
|
|
case 0b1000010000: PPC_DECODER_HIT(bcctrx);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 20: PPC_DECODER_HIT(rlwimix);
|
|
case 21: PPC_DECODER_HIT(rlwinmx);
|
|
case 23: PPC_DECODER_HIT(rlwnmx);
|
|
case 24: PPC_DECODER_HIT(ori);
|
|
case 25: PPC_DECODER_HIT(oris);
|
|
case 26: PPC_DECODER_HIT(xori);
|
|
case 27: PPC_DECODER_HIT(xoris);
|
|
case 28: PPC_DECODER_HIT(andix);
|
|
case 29: PPC_DECODER_HIT(andisx);
|
|
case 30:
|
|
switch ((ExtractBits(code, 27, 29) << 0)) {
|
|
case 0b000: PPC_DECODER_HIT(rldiclx);
|
|
case 0b001: PPC_DECODER_HIT(rldicrx);
|
|
case 0b010: PPC_DECODER_HIT(rldicx);
|
|
case 0b011: PPC_DECODER_HIT(rldimix);
|
|
}
|
|
switch ((ExtractBits(code, 27, 30) << 0)) {
|
|
case 0b1000: PPC_DECODER_HIT(rldclx);
|
|
case 0b1001: PPC_DECODER_HIT(rldcrx);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 31:
|
|
switch ((ExtractBits(code, 21, 29) << 0)) {
|
|
case 0b110011101: PPC_DECODER_HIT(sradix);
|
|
}
|
|
switch ((ExtractBits(code, 21, 30) << 0)) {
|
|
case 0b0000000000: PPC_DECODER_HIT(cmp);
|
|
case 0b0000000100: PPC_DECODER_HIT(tw);
|
|
case 0b0000000110: PPC_DECODER_HIT(lvsl);
|
|
case 0b0000000111: PPC_DECODER_HIT(lvebx);
|
|
case 0b0000010011: PPC_DECODER_HIT(mfcr);
|
|
case 0b0000010100: PPC_DECODER_HIT(lwarx);
|
|
case 0b0000010101: PPC_DECODER_HIT(ldx);
|
|
case 0b0000010111: PPC_DECODER_HIT(lwzx);
|
|
case 0b0000011000: PPC_DECODER_HIT(slwx);
|
|
case 0b0000011010: PPC_DECODER_HIT(cntlzwx);
|
|
case 0b0000011011: PPC_DECODER_HIT(sldx);
|
|
case 0b0000011100: PPC_DECODER_HIT(andx);
|
|
case 0b0000100000: PPC_DECODER_HIT(cmpl);
|
|
case 0b0000100110: PPC_DECODER_HIT(lvsr);
|
|
case 0b0000100111: PPC_DECODER_HIT(lvehx);
|
|
case 0b0000110101: PPC_DECODER_HIT(ldux);
|
|
case 0b0000110110: PPC_DECODER_HIT(dcbst);
|
|
case 0b0000110111: PPC_DECODER_HIT(lwzux);
|
|
case 0b0000111010: PPC_DECODER_HIT(cntlzdx);
|
|
case 0b0000111100: PPC_DECODER_HIT(andcx);
|
|
case 0b0001000100: PPC_DECODER_HIT(td);
|
|
case 0b0001000111: PPC_DECODER_HIT(lvewx);
|
|
case 0b0001010011: PPC_DECODER_HIT(mfmsr);
|
|
case 0b0001010100: PPC_DECODER_HIT(ldarx);
|
|
case 0b0001010110: PPC_DECODER_HIT(dcbf);
|
|
case 0b0001010111: PPC_DECODER_HIT(lbzx);
|
|
case 0b0001100111: PPC_DECODER_HIT(lvx);
|
|
case 0b0001110111: PPC_DECODER_HIT(lbzux);
|
|
case 0b0001111100: PPC_DECODER_HIT(norx);
|
|
case 0b0010000111: PPC_DECODER_HIT(stvebx);
|
|
case 0b0010010000: PPC_DECODER_HIT(mtcrf);
|
|
case 0b0010010010: PPC_DECODER_HIT(mtmsr);
|
|
case 0b0010010101: PPC_DECODER_HIT(stdx);
|
|
case 0b0010010110: PPC_DECODER_HIT(stwcx);
|
|
case 0b0010010111: PPC_DECODER_HIT(stwx);
|
|
case 0b0010100111: PPC_DECODER_HIT(stvehx);
|
|
case 0b0010110010: PPC_DECODER_HIT(mtmsrd);
|
|
case 0b0010110101: PPC_DECODER_HIT(stdux);
|
|
case 0b0010110111: PPC_DECODER_HIT(stwux);
|
|
case 0b0011000111: PPC_DECODER_HIT(stvewx);
|
|
case 0b0011010110: PPC_DECODER_HIT(stdcx);
|
|
case 0b0011010111: PPC_DECODER_HIT(stbx);
|
|
case 0b0011100111: PPC_DECODER_HIT(stvx);
|
|
case 0b0011110110: PPC_DECODER_HIT(dcbtst);
|
|
case 0b0011110111: PPC_DECODER_HIT(stbux);
|
|
case 0b0100010110: PPC_DECODER_HIT(dcbt);
|
|
case 0b0100010111: PPC_DECODER_HIT(lhzx);
|
|
case 0b0100011100: PPC_DECODER_HIT(eqvx);
|
|
case 0b0100110111: PPC_DECODER_HIT(lhzux);
|
|
case 0b0100111100: PPC_DECODER_HIT(xorx);
|
|
case 0b0101010011: PPC_DECODER_HIT(mfspr);
|
|
case 0b0101010101: PPC_DECODER_HIT(lwax);
|
|
case 0b0101010111: PPC_DECODER_HIT(lhax);
|
|
case 0b0101100111: PPC_DECODER_HIT(lvxl);
|
|
case 0b0101110011: PPC_DECODER_HIT(mftb);
|
|
case 0b0101110101: PPC_DECODER_HIT(lwaux);
|
|
case 0b0101110111: PPC_DECODER_HIT(lhaux);
|
|
case 0b0110010111: PPC_DECODER_HIT(sthx);
|
|
case 0b0110011100: PPC_DECODER_HIT(orcx);
|
|
case 0b0110110111: PPC_DECODER_HIT(sthux);
|
|
case 0b0110111100: PPC_DECODER_HIT(orx);
|
|
case 0b0111010011: PPC_DECODER_HIT(mtspr);
|
|
case 0b0111010110: PPC_DECODER_HIT(dcbi);
|
|
case 0b0111011100: PPC_DECODER_HIT(nandx);
|
|
case 0b0111100111: PPC_DECODER_HIT(stvxl);
|
|
case 0b1000000000: PPC_DECODER_HIT(mcrxr);
|
|
case 0b1000000111: PPC_DECODER_HIT(lvlx);
|
|
case 0b1000010100: PPC_DECODER_HIT(ldbrx);
|
|
case 0b1000010101: PPC_DECODER_HIT(lswx);
|
|
case 0b1000010110: PPC_DECODER_HIT(lwbrx);
|
|
case 0b1000010111: PPC_DECODER_HIT(lfsx);
|
|
case 0b1000011000: PPC_DECODER_HIT(srwx);
|
|
case 0b1000011011: PPC_DECODER_HIT(srdx);
|
|
case 0b1000100111: PPC_DECODER_HIT(lvrx);
|
|
case 0b1000110111: PPC_DECODER_HIT(lfsux);
|
|
case 0b1001010101: PPC_DECODER_HIT(lswi);
|
|
case 0b1001010110: PPC_DECODER_HIT(sync);
|
|
case 0b1001010111: PPC_DECODER_HIT(lfdx);
|
|
case 0b1001110111: PPC_DECODER_HIT(lfdux);
|
|
case 0b1010000111: PPC_DECODER_HIT(stvlx);
|
|
case 0b1010010100: PPC_DECODER_HIT(stdbrx);
|
|
case 0b1010010101: PPC_DECODER_HIT(stswx);
|
|
case 0b1010010110: PPC_DECODER_HIT(stwbrx);
|
|
case 0b1010010111: PPC_DECODER_HIT(stfsx);
|
|
case 0b1010100111: PPC_DECODER_HIT(stvrx);
|
|
case 0b1010110111: PPC_DECODER_HIT(stfsux);
|
|
case 0b1011010101: PPC_DECODER_HIT(stswi);
|
|
case 0b1011010111: PPC_DECODER_HIT(stfdx);
|
|
case 0b1011110111: PPC_DECODER_HIT(stfdux);
|
|
case 0b1100000111: PPC_DECODER_HIT(lvlxl);
|
|
case 0b1100010110: PPC_DECODER_HIT(lhbrx);
|
|
case 0b1100011000: PPC_DECODER_HIT(srawx);
|
|
case 0b1100011010: PPC_DECODER_HIT(sradx);
|
|
case 0b1100100111: PPC_DECODER_HIT(lvrxl);
|
|
case 0b1100111000: PPC_DECODER_HIT(srawix);
|
|
case 0b1101010110: PPC_DECODER_HIT(eieio);
|
|
case 0b1110000111: PPC_DECODER_HIT(stvlxl);
|
|
case 0b1110010110: PPC_DECODER_HIT(sthbrx);
|
|
case 0b1110011010: PPC_DECODER_HIT(extshx);
|
|
case 0b1110100111: PPC_DECODER_HIT(stvrxl);
|
|
case 0b1110111010: PPC_DECODER_HIT(extsbx);
|
|
case 0b1111010110: PPC_DECODER_HIT(icbi);
|
|
case 0b1111010111: PPC_DECODER_HIT(stfiwx);
|
|
case 0b1111011010: PPC_DECODER_HIT(extswx);
|
|
}
|
|
switch ((ExtractBits(code, 22, 30) << 0)) {
|
|
case 0b000001000: PPC_DECODER_HIT(subfcx);
|
|
case 0b000001001: PPC_DECODER_HIT(mulhdux);
|
|
case 0b000001010: PPC_DECODER_HIT(addcx);
|
|
case 0b000001011: PPC_DECODER_HIT(mulhwux);
|
|
case 0b000101000: PPC_DECODER_HIT(subfx);
|
|
case 0b001001001: PPC_DECODER_HIT(mulhdx);
|
|
case 0b001001011: PPC_DECODER_HIT(mulhwx);
|
|
case 0b001101000: PPC_DECODER_HIT(negx);
|
|
case 0b010001000: PPC_DECODER_HIT(subfex);
|
|
case 0b010001010: PPC_DECODER_HIT(addex);
|
|
case 0b011001000: PPC_DECODER_HIT(subfzex);
|
|
case 0b011001010: PPC_DECODER_HIT(addzex);
|
|
case 0b011101000: PPC_DECODER_HIT(subfmex);
|
|
case 0b011101001: PPC_DECODER_HIT(mulldx);
|
|
case 0b011101010: PPC_DECODER_HIT(addmex);
|
|
case 0b011101011: PPC_DECODER_HIT(mullwx);
|
|
case 0b100001010: PPC_DECODER_HIT(addx);
|
|
case 0b111001001: PPC_DECODER_HIT(divdux);
|
|
case 0b111001011: PPC_DECODER_HIT(divwux);
|
|
case 0b111101001: PPC_DECODER_HIT(divdx);
|
|
case 0b111101011: PPC_DECODER_HIT(divwx);
|
|
}
|
|
switch ((ExtractBits(code, 6, 10) << 20)|(ExtractBits(code, 21, 30) << 0)) {
|
|
case 0b0000000000000001111110110: PPC_DECODER_HIT(dcbz);
|
|
case 0b0000100000000001111110110: PPC_DECODER_HIT(dcbz128);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 32: PPC_DECODER_HIT(lwz);
|
|
case 33: PPC_DECODER_HIT(lwzu);
|
|
case 34: PPC_DECODER_HIT(lbz);
|
|
case 35: PPC_DECODER_HIT(lbzu);
|
|
case 36: PPC_DECODER_HIT(stw);
|
|
case 37: PPC_DECODER_HIT(stwu);
|
|
case 38: PPC_DECODER_HIT(stb);
|
|
case 39: PPC_DECODER_HIT(stbu);
|
|
case 40: PPC_DECODER_HIT(lhz);
|
|
case 41: PPC_DECODER_HIT(lhzu);
|
|
case 42: PPC_DECODER_HIT(lha);
|
|
case 43: PPC_DECODER_HIT(lhau);
|
|
case 44: PPC_DECODER_HIT(sth);
|
|
case 45: PPC_DECODER_HIT(sthu);
|
|
case 46: PPC_DECODER_HIT(lmw);
|
|
case 47: PPC_DECODER_HIT(stmw);
|
|
case 48: PPC_DECODER_HIT(lfs);
|
|
case 49: PPC_DECODER_HIT(lfsu);
|
|
case 50: PPC_DECODER_HIT(lfd);
|
|
case 51: PPC_DECODER_HIT(lfdu);
|
|
case 52: PPC_DECODER_HIT(stfs);
|
|
case 53: PPC_DECODER_HIT(stfsu);
|
|
case 54: PPC_DECODER_HIT(stfd);
|
|
case 55: PPC_DECODER_HIT(stfdu);
|
|
case 58:
|
|
switch ((ExtractBits(code, 30, 31) << 0)) {
|
|
case 0b00: PPC_DECODER_HIT(ld);
|
|
case 0b01: PPC_DECODER_HIT(ldu);
|
|
case 0b10: PPC_DECODER_HIT(lwa);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 59:
|
|
switch ((ExtractBits(code, 26, 30) << 0)) {
|
|
case 0b10010: PPC_DECODER_HIT(fdivsx);
|
|
case 0b10100: PPC_DECODER_HIT(fsubsx);
|
|
case 0b10101: PPC_DECODER_HIT(faddsx);
|
|
case 0b10110: PPC_DECODER_HIT(fsqrtsx);
|
|
case 0b11000: PPC_DECODER_HIT(fresx);
|
|
case 0b11001: PPC_DECODER_HIT(fmulsx);
|
|
case 0b11100: PPC_DECODER_HIT(fmsubsx);
|
|
case 0b11101: PPC_DECODER_HIT(fmaddsx);
|
|
case 0b11110: PPC_DECODER_HIT(fnmsubsx);
|
|
case 0b11111: PPC_DECODER_HIT(fnmaddsx);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 62:
|
|
switch ((ExtractBits(code, 30, 31) << 0)) {
|
|
case 0b00: PPC_DECODER_HIT(std);
|
|
case 0b01: PPC_DECODER_HIT(stdu);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
case 63:
|
|
switch ((ExtractBits(code, 21, 30) << 0)) {
|
|
case 0b0000000000: PPC_DECODER_HIT(fcmpu);
|
|
case 0b0000001100: PPC_DECODER_HIT(frspx);
|
|
case 0b0000001110: PPC_DECODER_HIT(fctiwx);
|
|
case 0b0000001111: PPC_DECODER_HIT(fctiwzx);
|
|
case 0b0000100000: PPC_DECODER_HIT(fcmpo);
|
|
case 0b0000100110: PPC_DECODER_HIT(mtfsb1x);
|
|
case 0b0000101000: PPC_DECODER_HIT(fnegx);
|
|
case 0b0001000000: PPC_DECODER_HIT(mcrfs);
|
|
case 0b0001000110: PPC_DECODER_HIT(mtfsb0x);
|
|
case 0b0001001000: PPC_DECODER_HIT(fmrx);
|
|
case 0b0010000110: PPC_DECODER_HIT(mtfsfix);
|
|
case 0b0010001000: PPC_DECODER_HIT(fnabsx);
|
|
case 0b0100001000: PPC_DECODER_HIT(fabsx);
|
|
case 0b1001000111: PPC_DECODER_HIT(mffsx);
|
|
case 0b1011000111: PPC_DECODER_HIT(mtfsfx);
|
|
case 0b1100101110: PPC_DECODER_HIT(fctidx);
|
|
case 0b1100101111: PPC_DECODER_HIT(fctidzx);
|
|
case 0b1101001110: PPC_DECODER_HIT(fcfidx);
|
|
}
|
|
switch ((ExtractBits(code, 26, 30) << 0)) {
|
|
case 0b10010: PPC_DECODER_HIT(fdivx);
|
|
case 0b10100: PPC_DECODER_HIT(fsubx);
|
|
case 0b10101: PPC_DECODER_HIT(faddx);
|
|
case 0b10110: PPC_DECODER_HIT(fsqrtx);
|
|
case 0b10111: PPC_DECODER_HIT(fselx);
|
|
case 0b11001: PPC_DECODER_HIT(fmulx);
|
|
case 0b11010: PPC_DECODER_HIT(frsqrtex);
|
|
case 0b11100: PPC_DECODER_HIT(fmsubx);
|
|
case 0b11101: PPC_DECODER_HIT(fmaddx);
|
|
case 0b11110: PPC_DECODER_HIT(fnmsubx);
|
|
case 0b11111: PPC_DECODER_HIT(fnmaddx);
|
|
}
|
|
PPC_DECODER_MISS;
|
|
default: PPC_DECODER_MISS;
|
|
}
|
|
}
|
|
|
|
} // namespace ppc
|
|
} // namespace cpu
|
|
} // namespace xe
|