mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
4.7 KiB
272 lines
4.7 KiB
#include "ksmips.h"
|
|
|
|
// Penter/PenterReturn Stack Frame
|
|
#define PenterFrameLength 0x108
|
|
|
|
#define FrmRa 0x14
|
|
|
|
#define FrmV0 0x18
|
|
#define FrmV1 0x1c
|
|
|
|
#define FrmA0 0x20
|
|
#define FrmA1 0x24
|
|
#define FrmA2 0x28
|
|
#define FrmA3 0x2c
|
|
|
|
#define FrmT0 0x30
|
|
#define FrmT1 0x34
|
|
#define FrmT2 0x38
|
|
#define FrmT3 0x3c
|
|
#define FrmT4 0x40
|
|
#define FrmT5 0x44
|
|
#define FrmT6 0x48
|
|
#define FrmT7 0x4c
|
|
#define FrmT8 0x50
|
|
#define FrmT9 0x54
|
|
|
|
#define FrmS0 0x58
|
|
#define FrmS1 0x5c
|
|
#define FrmS2 0x60
|
|
#define FrmS3 0x64
|
|
#define FrmS4 0x68
|
|
#define FrmS5 0x6c
|
|
#define FrmS6 0x70
|
|
#define FrmS7 0x74
|
|
#define FrmS8 0x78
|
|
|
|
#define FrmF0 0x80
|
|
#define FrmF2 0x88
|
|
#define FrmF4 0x90
|
|
#define FrmF6 0x98
|
|
#define FrmF8 0xa0
|
|
#define FrmF10 0xa8
|
|
#define FrmF12 0xb0
|
|
#define FrmF14 0xb8
|
|
#define FrmF16 0xc0
|
|
#define FrmF18 0xc8
|
|
#define FrmF20 0xd0
|
|
#define FrmF22 0xd8
|
|
#define FrmF24 0xe0
|
|
#define FrmF26 0xe8
|
|
#define FrmF28 0xf0
|
|
#define FrmF30 0xf8
|
|
|
|
#define FrmLo 0x100
|
|
#define FrmHi 0x104
|
|
|
|
.set noreorder
|
|
|
|
NESTED_ENTRY(penter, PenterFrameLength, zero)
|
|
|
|
subu sp,sp,PenterFrameLength // Setup stack frame
|
|
|
|
PROLOGUE_END
|
|
|
|
la t0,fProfiling // Return if not profiling
|
|
lw t0,0(t0)
|
|
bne t0,zero,10f
|
|
nop
|
|
|
|
j ra // Return
|
|
addu sp,sp,PenterFrameLength
|
|
|
|
10:
|
|
sw ra,FrmRa(sp) // Save RA before call
|
|
jal SaveAllRegs // Save all registers
|
|
nop
|
|
|
|
lw a0,FrmRa(sp) // a0 = return from penter call
|
|
or a1,t9,zero // a1 = return to caller
|
|
|
|
jal c_penter // Do preprocessing
|
|
nop // passing returns as parameters
|
|
beq v0,zero,20f // if zero returned, no profiling
|
|
nop
|
|
|
|
la t0,PenterReturn // Change return address to get control
|
|
sw t0,FrmT9(sp) // back at end of function
|
|
20:
|
|
jal RestoreAllRegs // Restore all registers
|
|
nop
|
|
|
|
lw ra,FrmRa(sp) // Return
|
|
j ra
|
|
addu sp,sp,PenterFrameLength
|
|
|
|
.end penter
|
|
|
|
|
|
NESTED_ENTRY(PenterReturn, PenterFrameLength, zero)
|
|
|
|
subu sp,sp,PenterFrameLength // Setup stack frame
|
|
sw ra,FrmRa(sp)
|
|
|
|
PROLOGUE_END
|
|
|
|
jal SaveAllRegs // Save all registers
|
|
nop
|
|
|
|
jal PostPenter // Do post-processing
|
|
nop
|
|
|
|
sw v0,FrmRa(sp) // Save caller return addr
|
|
// returned by PostPenter
|
|
|
|
jal RestoreAllRegs // Restore all registers
|
|
nop
|
|
|
|
lw ra,FrmRa(sp) // Return
|
|
j ra
|
|
addu sp,sp,PenterFrameLength
|
|
|
|
.end PenterReturn
|
|
|
|
|
|
LEAF_ENTRY(SaveAllRegs)
|
|
|
|
sw v0,FrmV0(sp)
|
|
sw v1,FrmV1(sp)
|
|
|
|
sw a0,FrmA0(sp)
|
|
sw a1,FrmA1(sp)
|
|
sw a2,FrmA2(sp)
|
|
sw a3,FrmA3(sp)
|
|
|
|
sw t0,FrmT0(sp)
|
|
sw t1,FrmT1(sp)
|
|
sw t2,FrmT2(sp)
|
|
sw t3,FrmT3(sp)
|
|
sw t4,FrmT4(sp)
|
|
sw t5,FrmT5(sp)
|
|
sw t6,FrmT6(sp)
|
|
sw t7,FrmT7(sp)
|
|
sw t8,FrmT8(sp)
|
|
sw t9,FrmT9(sp)
|
|
|
|
sw s0,FrmS0(sp)
|
|
sw s1,FrmS1(sp)
|
|
sw s2,FrmS2(sp)
|
|
sw s3,FrmS3(sp)
|
|
sw s4,FrmS4(sp)
|
|
sw s5,FrmS5(sp)
|
|
sw s6,FrmS6(sp)
|
|
sw s7,FrmS7(sp)
|
|
|
|
sdc1 f0,FrmF0(sp)
|
|
sdc1 f2,FrmF2(sp)
|
|
sdc1 f4,FrmF4(sp)
|
|
sdc1 f6,FrmF6(sp)
|
|
sdc1 f8,FrmF8(sp)
|
|
sdc1 f10,FrmF10(sp)
|
|
sdc1 f12,FrmF12(sp)
|
|
sdc1 f14,FrmF14(sp)
|
|
sdc1 f16,FrmF16(sp)
|
|
sdc1 f18,FrmF18(sp)
|
|
sdc1 f20,FrmF20(sp)
|
|
sdc1 f22,FrmF22(sp)
|
|
sdc1 f24,FrmF24(sp)
|
|
sdc1 f26,FrmF26(sp)
|
|
sdc1 f28,FrmF28(sp)
|
|
sdc1 f30,FrmF30(sp)
|
|
|
|
mflo t0
|
|
sw t0,FrmLo(sp)
|
|
mfhi t0
|
|
sw t0,FrmHi(sp)
|
|
|
|
j ra
|
|
nop
|
|
|
|
.end SaveAllRegs
|
|
|
|
|
|
LEAF_ENTRY(RestoreAllRegs)
|
|
|
|
lw t0,FrmLo(sp)
|
|
mtlo t0
|
|
lw t0,FrmHi(sp)
|
|
mthi t0
|
|
|
|
lw v0,FrmV0(sp)
|
|
lw v1,FrmV1(sp)
|
|
|
|
lw a0,FrmA0(sp)
|
|
lw a1,FrmA1(sp)
|
|
lw a2,FrmA2(sp)
|
|
lw a3,FrmA3(sp)
|
|
|
|
lw t0,FrmT0(sp)
|
|
lw t1,FrmT1(sp)
|
|
lw t2,FrmT2(sp)
|
|
lw t3,FrmT3(sp)
|
|
lw t4,FrmT4(sp)
|
|
lw t5,FrmT5(sp)
|
|
lw t6,FrmT6(sp)
|
|
lw t7,FrmT7(sp)
|
|
lw t8,FrmT8(sp)
|
|
lw t9,FrmT9(sp)
|
|
|
|
lw s0,FrmS0(sp)
|
|
lw s1,FrmS1(sp)
|
|
lw s2,FrmS2(sp)
|
|
lw s3,FrmS3(sp)
|
|
lw s4,FrmS4(sp)
|
|
lw s5,FrmS5(sp)
|
|
lw s6,FrmS6(sp)
|
|
lw s7,FrmS7(sp)
|
|
|
|
ldc1 f0,FrmF0(sp)
|
|
ldc1 f2,FrmF2(sp)
|
|
ldc1 f4,FrmF4(sp)
|
|
ldc1 f6,FrmF6(sp)
|
|
ldc1 f8,FrmF8(sp)
|
|
ldc1 f10,FrmF10(sp)
|
|
ldc1 f12,FrmF12(sp)
|
|
ldc1 f14,FrmF14(sp)
|
|
ldc1 f16,FrmF16(sp)
|
|
ldc1 f18,FrmF18(sp)
|
|
ldc1 f20,FrmF20(sp)
|
|
ldc1 f22,FrmF22(sp)
|
|
ldc1 f24,FrmF24(sp)
|
|
ldc1 f26,FrmF26(sp)
|
|
ldc1 f28,FrmF28(sp)
|
|
ldc1 f30,FrmF30(sp)
|
|
|
|
j ra
|
|
nop
|
|
|
|
.end RestoreAllRegs
|
|
|
|
|
|
|
|
.set noreorder
|
|
|
|
NESTED_ENTRY(CalHelper1, 8, zero)
|
|
|
|
or t9,ra,zero // penter call
|
|
jal penter
|
|
nop
|
|
|
|
j t9 // just return
|
|
nop
|
|
|
|
.end CalHelper1
|
|
|
|
|
|
NESTED_ENTRY(CalHelper2, 8, zero)
|
|
|
|
or t9,ra,zero // penter call
|
|
jal penter
|
|
nop
|
|
|
|
subu sp,sp,8 // Put return on stack
|
|
sw t9,4(sp)
|
|
|
|
jal CalHelper1 // Call nested helper
|
|
nop
|
|
|
|
lw ra,4(sp) // Return to penter supplied addr
|
|
j ra
|
|
addu sp,sp,8 // and restore stack
|
|
|
|
.end CalHelper2
|