File tree Expand file tree Collapse file tree 1 file changed +17
-0
lines changed Expand file tree Collapse file tree 1 file changed +17
-0
lines changed Original file line number Diff line number Diff line change @@ -251,6 +251,23 @@ typedef struct {
251
251
#define _JumpTarget_ ((_Target_ * 4 ) + (_PC_ & 0xf0000000 )) // Calculates the target during a jump instruction
252
252
#define _BranchTarget_ ((int16_t )_Im_ * 4 + _PC_) // Calculates the target during a branch instruction
253
253
254
+ /*
255
+ The "SetLink" mechanism uses the delay slot. This may sound counter intuitive, but this is the only way to
256
+ properly handle this specific sequence of instructions:
257
+
258
+ beq someFalseCondition, out
259
+ lw $ra, someOffset($sp)
260
+ jal someFunction
261
+ nop
262
+ [...]
263
+ out:
264
+ jr $ra
265
+ nop
266
+
267
+ Without the change, the lw $ra will apply itself after jal happens, thus overriding the value the jal will
268
+ have loaded into this register. This probably means this is also how the real CPU handles this, otherwise,
269
+ this wouldn't work at all.
270
+ */
254
271
#define _SetLink (x ) delayedLoad(x, _PC_ + 4 ); // Sets the return address in the link register
255
272
256
273
class R3000Acpu {
You can’t perform that action at this time.
0 commit comments