1
// Copyright 2013 Dolphin Emulator Project
2
// Licensed under GPLv2
3
// Refer to the license.txt file included.
8
#include "../../HW/SystemTimers.h"
11
void JitILBase::mtspr(UGeckoInstruction inst)
14
JITDISABLE(bJITSystemRegistersOff)
15
u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F);
22
ibuild.EmitStoreLink(ibuild.EmitLoadGReg(inst.RD));
25
ibuild.EmitStoreCTR(ibuild.EmitLoadGReg(inst.RD));
35
ibuild.EmitStoreGQR(ibuild.EmitLoadGReg(inst.RD), iIndex - SPR_GQR0);
39
ibuild.EmitStoreSRR(ibuild.EmitLoadGReg(inst.RD), iIndex - SPR_SRR0);
47
void JitILBase::mfspr(UGeckoInstruction inst)
50
JITDISABLE(bJITSystemRegistersOff)
51
u32 iIndex = (inst.SPRU << 5) | (inst.SPRL & 0x1F);
59
ibuild.EmitStoreGReg(ibuild.EmitLoadLink(), inst.RD);
62
ibuild.EmitStoreGReg(ibuild.EmitLoadCTR(), inst.RD);
72
ibuild.EmitStoreGReg(ibuild.EmitLoadGQR(iIndex - SPR_GQR0), inst.RD);
81
// =======================================================================================
82
// Don't interpret this, if we do we get thrown out
84
void JitILBase::mtmsr(UGeckoInstruction inst)
86
ibuild.EmitStoreMSR(ibuild.EmitLoadGReg(inst.RS), ibuild.EmitIntConst(js.compilerPC));
87
ibuild.EmitBranchUncond(ibuild.EmitIntConst(js.compilerPC + 4));
92
void JitILBase::mfmsr(UGeckoInstruction inst)
95
JITDISABLE(bJITSystemRegistersOff)
96
ibuild.EmitStoreGReg(ibuild.EmitLoadMSR(), inst.RD);
99
void JitILBase::mftb(UGeckoInstruction inst)
102
JITDISABLE(bJITSystemRegistersOff)
106
void JitILBase::mfcr(UGeckoInstruction inst)
109
JITDISABLE(bJITSystemRegistersOff)
111
IREmitter::InstLoc d = ibuild.EmitIntConst(0);
112
for (int i = 0; i < 8; ++i)
114
d = ibuild.EmitShl(d, ibuild.EmitIntConst(4));
115
d = ibuild.EmitOr(d, ibuild.EmitLoadCR(i));
117
ibuild.EmitStoreGReg(d, inst.RD);
120
void JitILBase::mtcrf(UGeckoInstruction inst)
123
JITDISABLE(bJITSystemRegistersOff)
125
IREmitter::InstLoc s = ibuild.EmitLoadGReg(inst.RS);
126
for (int i = 0; i < 8; ++i)
128
if (inst.CRM & (0x80 >> i))
130
IREmitter::InstLoc value;
131
value = ibuild.EmitShrl(s, ibuild.EmitIntConst(28 - i * 4));
132
value = ibuild.EmitAnd(value, ibuild.EmitIntConst(0xF));
133
ibuild.EmitStoreCR(value, i);
138
void JitILBase::mcrf(UGeckoInstruction inst)
141
JITDISABLE(bJITSystemRegistersOff)
143
if (inst.CRFS != inst.CRFD)
145
ibuild.EmitStoreCR(ibuild.EmitLoadCR(inst.CRFS), inst.CRFD);
149
void JitILBase::crXX(UGeckoInstruction inst)
151
// Ported from Jit_SystemRegister.cpp
153
// Get bit CRBA in EAX aligned with bit CRBD
154
const int shiftA = (inst.CRBD & 3) - (inst.CRBA & 3);
155
IREmitter::InstLoc eax = ibuild.EmitLoadCR(inst.CRBA >> 2);
157
eax = ibuild.EmitShl(eax, ibuild.EmitIntConst(-shiftA));
159
eax = ibuild.EmitShrl(eax, ibuild.EmitIntConst(shiftA));
161
// Get bit CRBB in ECX aligned with bit CRBD
162
const int shiftB = (inst.CRBD & 3) - (inst.CRBB & 3);
163
IREmitter::InstLoc ecx = ibuild.EmitLoadCR(inst.CRBB >> 2);
165
ecx = ibuild.EmitShl(ecx, ibuild.EmitIntConst(-shiftB));
167
ecx = ibuild.EmitShrl(ecx, ibuild.EmitIntConst(shiftB));
169
// Compute combined bit
170
const unsigned subop = inst.SUBOP10;
174
eax = ibuild.EmitAnd(eax, ecx);
178
ecx = ibuild.EmitNot(ecx);
179
eax = ibuild.EmitAnd(eax, ecx);
183
eax = ibuild.EmitXor(eax, ecx);
184
eax = ibuild.EmitNot(eax);
188
eax = ibuild.EmitAnd(eax, ecx);
189
eax = ibuild.EmitNot(eax);
193
eax = ibuild.EmitOr(eax, ecx);
194
eax = ibuild.EmitNot(eax);
198
eax = ibuild.EmitOr(eax, ecx);
202
ecx = ibuild.EmitNot(ecx);
203
eax = ibuild.EmitOr(eax, ecx);
207
eax = ibuild.EmitXor(eax, ecx);
210
PanicAlert("crXX: invalid instruction");
214
// Store result bit in CRBD
215
eax = ibuild.EmitAnd(eax, ibuild.EmitIntConst(0x8 >> (inst.CRBD & 3)));
216
IREmitter::InstLoc bd = ibuild.EmitLoadCR(inst.CRBD >> 2);
217
bd = ibuild.EmitAnd(bd, ibuild.EmitIntConst(~(0x8 >> (inst.CRBD & 3))));
218
bd = ibuild.EmitOr(bd, eax);
219
ibuild.EmitStoreCR(bd, inst.CRBD >> 2);