Skip to content

Commit d989f49

Browse files
authored
Merge pull request #1847 from nicolasnoble/encoder-aliases
Adding aliases to MIPS inline encoder.
2 parents 06fdac5 + ee5c53b commit d989f49

File tree

5 files changed

+102
-50
lines changed

5 files changed

+102
-50
lines changed

src/core/disr3000a.cc

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,14 @@ declare(disBEQ) {
782782
if (_Rs_ == _Rt_) {
783783
dOpCode("b");
784784
dBranch();
785+
} else if (_Rs_ == 0) {
786+
dOpCode("beqz");
787+
GPR(_Rt_);
788+
dBranch();
789+
} else if (_Rt_ == 0) {
790+
dOpCode("beqz");
791+
GPR(_Rs_);
792+
dBranch();
785793
} else {
786794
dOpCode("beq");
787795
GPR(_Rs_);
@@ -791,10 +799,20 @@ declare(disBEQ) {
791799
}
792800
declare(disBNE) {
793801
if (delaySlotNext) *delaySlotNext = true;
794-
dOpCode("bne");
795-
GPR(_Rs_);
796-
GPR(_Rt_);
797-
dBranch();
802+
if (_Rs_ == 0) {
803+
dOpCode("bnez");
804+
GPR(_Rt_);
805+
dBranch();
806+
} else if (_Rt_ == 0) {
807+
dOpCode("bnez");
808+
GPR(_Rs_);
809+
dBranch();
810+
} else {
811+
dOpCode("bne");
812+
GPR(_Rs_);
813+
GPR(_Rt_);
814+
dBranch();
815+
}
798816
}
799817

800818
/*********************************************************

src/mips/common/util/encoder.hh

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,51 +47,74 @@ constexpr uint32_t srcVal(Reg r) { return uint32_t(r) << 21; }
4747

4848
// ALU
4949
constexpr uint32_t add(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100000; }
50+
constexpr uint32_t add(Reg dst, Reg tgt) { return add(dst, dst, tgt); }
5051
constexpr uint32_t addu(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100001; }
52+
constexpr uint32_t addu(Reg dst, Reg tgt) { return addu(dst, dst, tgt); }
5153
constexpr uint32_t addi(Reg tgt, Reg src, int16_t value) {
5254
uint32_t v = value;
5355
v &= 0xffff;
5456
return iclass(0b001000) | srcVal(src) | tgtVal(tgt) | v;
5557
}
58+
constexpr uint32_t addi(Reg tgt, int16_t value) { return addi(tgt, tgt, value); }
5659
constexpr uint32_t addiu(Reg tgt, Reg src, int16_t value) {
5760
uint32_t v = value;
5861
v &= 0xffff;
5962
return iclass(0b001001) | srcVal(src) | tgtVal(tgt) | v;
6063
}
64+
constexpr uint32_t addiu(Reg tgt, int16_t value) { return addiu(tgt, tgt, value); }
6165
constexpr uint32_t andd(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100100; }
66+
constexpr uint32_t andd(Reg dst, Reg tgt) { return andd(dst, dst, tgt); }
6267
constexpr uint32_t andi(Reg tgt, Reg src, uint16_t value) {
6368
return iclass(0b001100) | srcVal(src) | tgtVal(tgt) | value;
6469
}
70+
constexpr uint32_t andi(Reg tgt, uint16_t value) { return andi(tgt, tgt, value); }
6571
constexpr uint32_t lui(Reg tgt, uint16_t value) { return iclass(0b001111) | tgtVal(tgt) | value; }
6672
constexpr uint32_t nor(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100111; }
73+
constexpr uint32_t nor(Reg dst, Reg tgt) { return nor(dst, dst, tgt); }
6774
constexpr uint32_t orr(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100101; }
75+
constexpr uint32_t orr(Reg dst, Reg tgt) { return orr(dst, dst, tgt); }
6876
constexpr uint32_t ori(Reg tgt, Reg src, uint16_t value) {
6977
return iclass(0b001101) | srcVal(src) | tgtVal(tgt) | value;
7078
}
79+
constexpr uint32_t ori(Reg tgt, uint16_t value) { return ori(tgt, tgt, value); }
7180
constexpr uint32_t slt(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b101010; }
81+
constexpr uint32_t slt(Reg dst, Reg tgt) { return slt(dst, dst, tgt); }
7282
constexpr uint32_t sltu(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b101011; }
83+
constexpr uint32_t sltu(Reg dst, Reg tgt) { return sltu(dst, dst, tgt); }
7384
constexpr uint32_t slti(Reg tgt, Reg src, int16_t value) {
7485
uint32_t v = value;
7586
v &= 0xffff;
7687
return iclass(0b001010) | srcVal(src) | tgtVal(tgt) | v;
7788
}
89+
constexpr uint32_t slti(Reg tgt, int16_t value) { return slti(tgt, tgt, value); }
7890
constexpr uint32_t sltiu(Reg tgt, Reg src, uint16_t value) {
7991
return iclass(0b001011) | srcVal(src) | tgtVal(tgt) | value;
8092
}
93+
constexpr uint32_t sltiu(Reg tgt, uint16_t value) { return sltiu(tgt, tgt, value); }
8194
constexpr uint32_t sub(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100010; }
95+
constexpr uint32_t sub(Reg dst, Reg tgt) { return sub(dst, dst, tgt); }
8296
constexpr uint32_t subu(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100011; }
97+
constexpr uint32_t subu(Reg dst, Reg tgt) { return subu(dst, dst, tgt); }
8398
constexpr uint32_t xorr(Reg dst, Reg src, Reg tgt) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b100110; }
99+
constexpr uint32_t xorr(Reg dst, Reg tgt) { return xorr(dst, dst, tgt); }
84100
constexpr uint32_t xori(Reg tgt, Reg src, uint16_t value) {
85101
return iclass(0b001110) | srcVal(src) | tgtVal(tgt) | value;
86102
}
103+
constexpr uint32_t xori(Reg tgt, uint16_t value) { return xori(tgt, tgt, value); }
87104

88105
// shifts
89106
constexpr uint32_t sll(Reg dst, Reg tgt, uint16_t sa) { return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000000; }
107+
constexpr uint32_t sll(Reg dst, uint16_t sa) { return sll(dst, dst, sa); }
90108
constexpr uint32_t sllv(Reg dst, Reg tgt, Reg src) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000100; }
109+
constexpr uint32_t sllv(Reg dst, Reg src) { return sllv(dst, dst, src); }
91110
constexpr uint32_t sra(Reg dst, Reg tgt, uint16_t sa) { return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000011; }
111+
constexpr uint32_t sra(Reg dst, uint16_t sa) { return sra(dst, dst, sa); }
92112
constexpr uint32_t srav(Reg dst, Reg tgt, Reg src) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000111; }
113+
constexpr uint32_t srav(Reg dst, Reg src) { return srav(dst, dst, src); }
93114
constexpr uint32_t srl(Reg dst, Reg tgt, uint16_t sa) { return dstVal(dst) | tgtVal(tgt) | (sa << 6) | 0b000010; }
115+
constexpr uint32_t srl(Reg dst, uint16_t sa) { return srl(dst, dst, sa); }
94116
constexpr uint32_t srlv(Reg dst, Reg tgt, Reg src) { return dstVal(dst) | tgtVal(tgt) | srcVal(src) | 0b000110; }
117+
constexpr uint32_t srlv(Reg dst, Reg src) { return srlv(dst, dst, src); }
95118

96119
// mults
97120
constexpr uint32_t div(Reg src, Reg tgt) { return tgtVal(tgt) | srcVal(src) | 0b011010; }
@@ -220,6 +243,17 @@ constexpr uint32_t rfe() { return 0x42000010; }
220243

221244
// pseudo
222245
constexpr uint32_t nop() { return 0; }
246+
constexpr uint32_t li(Reg tgt, int16_t value) { return addiu(tgt, Reg::R0, value); }
247+
constexpr uint32_t liu(Reg tgt, uint16_t value) { return ori(tgt, Reg::R0, value); }
248+
constexpr uint32_t move(Reg tgt, Reg src) { return addu(tgt, Reg::R0, src); }
249+
constexpr uint32_t nott(Reg tgt, Reg src) { return nor(tgt, src, Reg::R0); }
250+
constexpr uint32_t nott(Reg tgt) { return nott(tgt, tgt); }
251+
constexpr uint32_t neg(Reg tgt, Reg src) { return subu(tgt, Reg::R0, src); }
252+
constexpr uint32_t neg(Reg tgt) { return neg(tgt, tgt); }
253+
constexpr uint32_t b(int16_t offset) { return bgez(Reg::R0, offset); }
254+
constexpr uint32_t beqz(Reg tgt, int16_t offset) { return beq(tgt, Reg::R0, offset); }
255+
constexpr uint32_t bnez(Reg tgt, int16_t offset) { return bne(tgt, Reg::R0, offset); }
256+
constexpr uint32_t bal(int16_t offset) { return bgezal(Reg::R0, offset); }
223257

224258
} // namespace Encoder
225259
} // namespace Mips

src/mips/psyqo/src/kernel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,13 @@ void psyqo::Kernel::takeOverKernel() {
149149
uint16_t lo = printfAddr & 0xffff;
150150
if (lo >= 0x8000) hi++;
151151
// a0
152-
handlers[0] = Mips::Encoder::addiu(Mips::Encoder::Reg::T0, Mips::Encoder::Reg::R0, 0x3f);
152+
handlers[0] = Mips::Encoder::li(Mips::Encoder::Reg::T0, 0x3f);
153153
handlers[1] = Mips::Encoder::beq(Mips::Encoder::Reg::T1, Mips::Encoder::Reg::T0, 12);
154154
handlers[2] = Mips::Encoder::lui(Mips::Encoder::Reg::T0, hi);
155155
handlers[3] = Mips::Encoder::nop();
156156
// b0
157157
handlers[4] = Mips::Encoder::jr(Mips::Encoder::Reg::RA);
158-
handlers[5] = Mips::Encoder::addiu(Mips::Encoder::Reg::T0, Mips::Encoder::Reg::T0, lo);
158+
handlers[5] = Mips::Encoder::li(Mips::Encoder::Reg::T0, lo);
159159
handlers[6] = Mips::Encoder::jr(Mips::Encoder::Reg::T0);
160160
handlers[7] = Mips::Encoder::nop();
161161
// c0

src/mips/tests/cop0/exceptions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ struct Handler {
4949
uint16_t high = value >> 16;
5050
int16_t low = value & 0xffff;
5151
dst[0] = lui(Reg::K0, high);
52-
dst[1] = ori(Reg::K0, Reg::K0, low);
52+
dst[1] = ori(Reg::K0, low);
5353
dst[2] = jr(Reg::K0);
54-
dst[3] = ori(Reg::K1, Reg::R0, addr);
54+
dst[3] = li(Reg::K1, addr);
5555
}
5656

5757
void restore() {

src/supportpsx/ps1-packer.cc

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,14 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
145145
pushBytes(stub, addiu(Reg::T8, Reg::RA, 0));
146146
}
147147
pushBytes(stub, lui(Reg::T1, getHI(offset)));
148-
pushBytes(stub, bgezal(Reg::R0, 4));
149-
pushBytes(stub, addiu(Reg::T1, Reg::T1, getLO(offset)));
148+
pushBytes(stub, bal(4));
149+
pushBytes(stub, addiu(Reg::T1, getLO(offset)));
150150
pushBytes(stub, lui(Reg::T0, 0x1fff));
151-
pushBytes(stub, ori(Reg::T0, Reg::T0, 0xffff));
152-
pushBytes(stub, andd(Reg::RA, Reg::RA, Reg::T0));
151+
pushBytes(stub, ori(Reg::T0, 0xffff));
152+
pushBytes(stub, andd(Reg::RA, Reg::T0));
153153
pushBytes(stub, lui(Reg::T0, 0x8000));
154-
pushBytes(stub, orr(Reg::RA, Reg::RA, Reg::T0));
155-
pushBytes(stub, addu(Reg::T0, Reg::RA, Reg::T1));
154+
pushBytes(stub, orr(Reg::RA, Reg::T0));
155+
pushBytes(stub, addu(Reg::T0, Reg::T1));
156156
pushBytes(stub, jr(Reg::T0));
157157
pushBytes(stub, addiu(Reg::A0, Reg::RA, 32));
158158

@@ -196,11 +196,11 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
196196
// Calls the ucl-nrv2e decompressor.
197197
if (!options.raw) {
198198
pushBytes(dataOut, lui(Reg::A0, getHI(compLoad)));
199-
pushBytes(dataOut, addiu(Reg::A0, Reg::A0, getLO(compLoad)));
199+
pushBytes(dataOut, addiu(Reg::A0, getLO(compLoad)));
200200
}
201201
pushBytes(dataOut, lui(Reg::A1, getHI(addr)));
202-
pushBytes(dataOut, bgezal(Reg::R0, -((int16_t)(dataOut.size() + 4 - n2estart))));
203-
pushBytes(dataOut, addiu(Reg::A1, Reg::A1, getLO(addr)));
202+
pushBytes(dataOut, bal(-((int16_t)(dataOut.size() + 4 - n2estart))));
203+
pushBytes(dataOut, addiu(Reg::A1, getLO(addr)));
204204

205205
// Then, bootstrap our newly-decompressed binary.
206206
if (options.shell) {
@@ -218,16 +218,16 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
218218
// binary in memory.
219219
pushBytes(shellCode, nop());
220220
pushBytes(shellCode, lui(Reg::T0, getHI(pc)));
221-
pushBytes(shellCode, addiu(Reg::T0, Reg::T0, getLO(pc)));
221+
pushBytes(shellCode, addiu(Reg::T0, getLO(pc)));
222222
pushBytes(shellCode, lui(Reg::GP, getHI(gp)));
223223
pushBytes(shellCode, jr(Reg::T0));
224-
pushBytes(shellCode, addiu(Reg::GP, Reg::GP, getLO(gp)));
224+
pushBytes(shellCode, addiu(Reg::GP, getLO(gp)));
225225

226226
// Jumps over the two blocks of code above, grabbing their address
227227
// in $ra using bal.
228-
pushBytes(dataOut, bgezal(Reg::R0, breakHandler.size() + shellCode.size()));
228+
pushBytes(dataOut, bal(breakHandler.size() + shellCode.size()));
229229
// $s0 = 0xa0
230-
pushBytes(dataOut, addiu(Reg::S0, Reg::R0, 0xa0));
230+
pushBytes(dataOut, li(Reg::S0, 0xa0));
231231

232232
// Insert the two pieces of code we need to copy.
233233
pushBytes(dataOut, breakHandler);
@@ -237,30 +237,30 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
237237
// $s1 = address of the break handler.
238238
pushBytes(dataOut, addiu(Reg::S1, Reg::RA, 0));
239239

240-
pushBytes(dataOut, addiu(Reg::A0, Reg::R0, 0x40));
240+
pushBytes(dataOut, li(Reg::A0, 0x40));
241241
pushBytes(dataOut, addiu(Reg::A1, Reg::S1, 0));
242-
pushBytes(dataOut, addiu(Reg::A2, Reg::R0, breakHandler.size()));
242+
pushBytes(dataOut, li(Reg::A2, breakHandler.size()));
243243
// Call A0:2A - memcpy.
244244
pushBytes(dataOut, jalr(Reg::S0));
245-
pushBytes(dataOut, addiu(Reg::T1, Reg::R0, 0x2a));
245+
pushBytes(dataOut, li(Reg::T1, 0x2a));
246246

247247
pushBytes(dataOut, lui(Reg::A0, 0x8003));
248248
pushBytes(dataOut, addiu(Reg::A1, Reg::S1, breakHandler.size()));
249-
pushBytes(dataOut, addiu(Reg::A2, Reg::R0, shellCode.size()));
249+
pushBytes(dataOut, li(Reg::A2, shellCode.size()));
250250
// Call A0:2A - memcpy.
251251
pushBytes(dataOut, jalr(Reg::S0));
252-
pushBytes(dataOut, addiu(Reg::T1, Reg::R0, 0x2a));
252+
pushBytes(dataOut, li(Reg::T1, 0x2a));
253253

254254
// And reboot, leaving cop0's registers set to break
255255
// on writes to 0x80030000.
256256
constexpr uint32_t partialReboot = 0xbfc00390;
257257

258258
pushBytes(dataOut, lui(Reg::RA, getHI(partialReboot)));
259-
pushBytes(dataOut, addiu(Reg::RA, Reg::RA, getLO(partialReboot)));
259+
pushBytes(dataOut, addiu(Reg::RA, getLO(partialReboot)));
260260

261261
pushBytes(dataOut, lui(Reg::T0, 0b1100101010000000));
262262
pushBytes(dataOut, lui(Reg::T1, 0x8003));
263-
pushBytes(dataOut, addiu(Reg::T2, Reg::R0, -1));
263+
pushBytes(dataOut, li(Reg::T2, -1));
264264
pushBytes(dataOut, mtc0(Reg::R0, 7));
265265
pushBytes(dataOut, mtc0(Reg::T1, 5));
266266
pushBytes(dataOut, mtc0(Reg::T2, 9));
@@ -271,35 +271,35 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
271271
// skipping over SBUS settings, and the resetting
272272
// of all the cop0 registers.
273273
pushBytes(dataOut, jr(Reg::S0));
274-
pushBytes(dataOut, addiu(Reg::T1, Reg::R0, 0x44));
274+
pushBytes(dataOut, li(Reg::T1, 0x44));
275275
} else if (options.nokernel) {
276276
// We can't call into the kernel, so we need to
277277
// flush the cache ourselves first.
278-
pushBytes(dataOut, bgezal(Reg::R0, 4));
278+
pushBytes(dataOut, bal(4));
279279
pushBytes(dataOut, lui(Reg::T1, 0xa000));
280280
pushBytes(dataOut, orr(Reg::T1, Reg::RA, Reg::T1));
281-
pushBytes(dataOut, addiu(Reg::T1, Reg::T1, 16));
281+
pushBytes(dataOut, addiu(Reg::T1, 16));
282282
pushBytes(dataOut, jr(Reg::T1));
283283
pushBytes(dataOut, mtc0(Reg::R0, 12));
284284
pushBytes(dataOut, lui(Reg::T5, 0xfffe));
285285
pushBytes(dataOut, lui(Reg::T2, 0x0001));
286-
pushBytes(dataOut, ori(Reg::T2, Reg::T2, 0xe90c));
286+
pushBytes(dataOut, ori(Reg::T2, 0xe90c));
287287
pushBytes(dataOut, sw(Reg::T2, 0x0130, Reg::T5));
288288
pushBytes(dataOut, lui(Reg::T1, 1));
289289
pushBytes(dataOut, mtc0(Reg::T1, 12));
290-
pushBytes(dataOut, addu(Reg::T3, Reg::R0, Reg::R0));
291-
pushBytes(dataOut, addiu(Reg::T4, Reg::R0, 0x0ff0));
290+
pushBytes(dataOut, move(Reg::T3, Reg::R0));
291+
pushBytes(dataOut, li(Reg::T4, 0x0ff0));
292292
pushBytes(dataOut, sw(Reg::R0, 0, Reg::T3));
293293
pushBytes(dataOut, bne(Reg::T3, Reg::T4, -8));
294-
pushBytes(dataOut, addiu(Reg::T3, Reg::T3, 0x10));
294+
pushBytes(dataOut, addiu(Reg::T3, 0x10));
295295
pushBytes(dataOut, mtc0(Reg::R0, 12));
296-
pushBytes(dataOut, addiu(Reg::T2, Reg::T2, 0x7c));
296+
pushBytes(dataOut, addiu(Reg::T2, 0x7c));
297297
pushBytes(dataOut, sw(Reg::T2, 0x0130, Reg::T5));
298298
// Then jumps into the decompressed binary, restoring
299299
// $ra if needed, so the decompressed binary can return
300300
// to the caller gracefully.
301301
pushBytes(dataOut, lui(Reg::T0, getHI(pc)));
302-
pushBytes(dataOut, addiu(Reg::T0, Reg::T0, getLO(pc)));
302+
pushBytes(dataOut, addiu(Reg::T0, getLO(pc)));
303303
pushBytes(dataOut, jr(Reg::T0));
304304
if (options.resetstack) {
305305
pushBytes(dataOut, ori(Reg::SP, Reg::SP, 0xfff0));
@@ -308,17 +308,17 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
308308
}
309309
} else {
310310
// Calls A0:44 - FlushCache
311-
pushBytes(dataOut, addiu(Reg::T0, Reg::R0, 0xa0));
311+
pushBytes(dataOut, li(Reg::T0, 0xa0));
312312
pushBytes(dataOut, jalr(Reg::T0));
313-
pushBytes(dataOut, addiu(Reg::T1, Reg::R0, 0x44));
313+
pushBytes(dataOut, li(Reg::T1, 0x44));
314314
// Then jumps into the decompressed binary, restoring
315315
// $ra if needed, so the decompressed binary can return
316316
// to the caller gracefully.
317317
pushBytes(dataOut, lui(Reg::T0, getHI(pc)));
318-
pushBytes(dataOut, addiu(Reg::T0, Reg::T0, getLO(pc)));
318+
pushBytes(dataOut, addiu(Reg::T0, getLO(pc)));
319319
pushBytes(dataOut, jr(Reg::T0));
320320
if (options.resetstack) {
321-
pushBytes(dataOut, ori(Reg::SP, Reg::SP, 0xfff0));
321+
pushBytes(dataOut, ori(Reg::SP, 0xfff0));
322322
} else {
323323
pushBytes(dataOut, addiu(Reg::RA, Reg::T8, 0));
324324
}
@@ -351,21 +351,21 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
351351
// in RAM. Once it's done, it'll jump to the start of
352352
// the compressed binary through FlushCache.
353353
/* 0x24 */ stage2.push_back(lw(Reg::A3, 0, Reg::A1));
354-
/* 0x28 */ stage2.push_back(addiu(Reg::A2, Reg::A2, -1));
354+
/* 0x28 */ stage2.push_back(addiu(Reg::A2, -1));
355355
/* 0x2c */ stage2.push_back(sw(Reg::A3, 0, Reg::A0));
356-
/* 0x30 */ stage2.push_back(bne(Reg::A2, Reg::R0, -16));
357-
/* 0x34 */ stage2.push_back(addiu(Reg::A0, Reg::A0, 4));
356+
/* 0x30 */ stage2.push_back(bnez(Reg::A2, -16));
357+
/* 0x34 */ stage2.push_back(addiu(Reg::A0, 4));
358358
/* 0x38 */ stage2.push_back(j(0xa0));
359-
/* 0x3c */ stage2.push_back(addiu(Reg::T1, Reg::R0, 0x44));
359+
/* 0x3c */ stage2.push_back(li(Reg::T1, 0x44));
360360
// This is actually the entry point.
361361
/* 0x40 */ stage2.push_back(mtc0(Reg::R0, 7));
362362
/* 0x44 */ stage2.push_back(lui(Reg::A0, compLoad >> 16));
363363
if ((compLoad & 0xffff) != 0) {
364-
/* 0x48 */ stage2.push_back(ori(Reg::A0, Reg::A0, compLoad));
364+
/* 0x48 */ stage2.push_back(ori(Reg::A0, compLoad));
365365
}
366366
/* 0x4c */ stage2.push_back(lui(Reg::RA, newPC >> 16));
367367
if ((newPC & 0xffff) != 0) {
368-
/* 0x50 */ stage2.push_back(ori(Reg::RA, Reg::RA, newPC));
368+
/* 0x50 */ stage2.push_back(ori(Reg::RA, newPC & 0xffff));
369369
}
370370
/* 0x54 */ stage2.push_back(lui(Reg::A1, 0xbf00));
371371
/* 0x58 */ stage2.push_back(j(0x24));
@@ -376,7 +376,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
376376
// need roughly 3 or 4 instructions.
377377
stage2.push_back(lui(Reg::V0, newPC >> 16));
378378
if ((newPC & 0xffff) != 0) {
379-
stage2.push_back(ori(Reg::V0, Reg::V0, newPC & 0xffff));
379+
stage2.push_back(ori(Reg::V0, newPC & 0xffff));
380380
}
381381
stage2.push_back(jr(Reg::V0));
382382
stage2.push_back(mtc0(Reg::R0, 7));
@@ -408,7 +408,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
408408
// Break on writes and/or exec, to call our break handler which we
409409
// will place in memory next.
410410
pushBytes(header, mtc0(Reg::R0, 7));
411-
pushBytes(header, addiu(Reg::T2, Reg::R0, -1));
411+
pushBytes(header, li(Reg::T2, -1));
412412
pushBytes(header, lui(Reg::T1, 0x8003));
413413
pushBytes(header, lui(Reg::T0, 0b1100101010000000));
414414
pushBytes(header, mtc0(Reg::T2, 11));
@@ -430,7 +430,7 @@ void PCSX::PS1Packer::pack(IO<File> src, IO<File> dest, uint32_t addr, uint32_t
430430
pushBytes(header, lui(Reg::T0, b >> 16));
431431
uint16_t rest = b;
432432
if (rest != 0) {
433-
pushBytes(header, ori(Reg::T0, Reg::T0, rest));
433+
pushBytes(header, ori(Reg::T0, rest));
434434
}
435435
last = sw(Reg::T0, base, Reg::R0);
436436
}

0 commit comments

Comments
 (0)