1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-09 06:29:33 +00:00
CLK/Processors/Decoders/PowerPC/PowerPC.cpp
2020-12-30 22:55:59 -05:00

175 lines
2.6 KiB
C++

//
// PowerPC.cpp
// Clock Signal
//
// Created by Thomas Harte on 12/30/20.
// Copyright © 2020 Thomas Harte. All rights reserved.
//
#include "PowerPC.hpp"
using namespace CPU::Decoder::PowerPC;
Decoder::Decoder(Model model) : model_(model) {}
Instruction Decoder::decode(uint32_t opcode) {
switch(opcode >> 26) {
case 31:
const uint8_t dest = (opcode >> 21) & 0x1f;
const uint8_t a = (opcode >> 16) & 0x1f;
const uint8_t b = (opcode >> 11) & 0x1f;
#define OECase(x) case x: case 0x200 + x
switch((opcode >> 1) & 0x3ff) {
case 0:
// cmp; 601 10-26
break;
case 4:
// tw; 601 10-214
break;
OECase(8):
// subfcx; 601 10-207
break;
// case 9:
// // mulhdux
// break;
OECase(10):
// addcx; 601 10-9
break;
case 11:
// mulhwux; 601 10-142
break;
case 19:
// mfcr; 601 10-122
break;
case 20:
// lwarx
break;
case 21:
// ldx
break;
// lwzx
// slwx
// cntlzwx
// sldx
// andx
// ampl
// subfx
// ldux
// dcbst
// lwzux
// cntlzdx
// andcx
// td
// mulhx
// mulhwx
// mfmsr
// ldarx
// dcbf
// lbzx
// negx
// norx
// subfex
// adex
// mtcrf
// mtmsr
// stfx
// stwcx.
// stwx
// stdux
// stwux
// subfzex
// addzex
// mtsr
// stdcx.
// stbx
// subfmex
// mulld
// addmex
// mullwx
// mtsrin
// scbtst
// stbux
// addx
// dcbt
// lhzx
// eqvx
// tlbie
// eciwx
// lhzux
// xorx
// mfspr
// lwax
// lhax
// lbia
// mftb
// lwaux
// lhaux
// sthx
// orcx
// sradix
// slbie
// ecowx
// sthux
// orx
// divdux
// divwux
// mtspr
// dcbi
// nandx
// divdx
// divwx
// slbia
// mcrxr
// lswx
// lwbrx
// lfsx
// srwx
// srdx
// tlbsync
// lfsux
// mfsr
// lswi
// sync
// lfdx
// lfdux
// mfsrin
// stswx
// stwbrx
// stfsx
// stfsux
// stswi
// stfdx
// stfdux
// lhbrx
// srawx
// sradx
// srawix
// eieio
// ethbrx
// extshx
// extsbx
// lcbi
// stfiwx
// extsw
// dcbz
OECase(138):
// addex
break;
OECase(266):
// addx
break;
case 28:
// andx
break;
case 60:
// andcx
break;
}
#undef OECase
break;
}
return Instruction();
}