mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
add prolog/epilog, add stbx, lbzx, fix addi/addis
This commit is contained in:
parent
41bf19244d
commit
d2aa4747aa
2 changed files with 62 additions and 5 deletions
|
@ -9,12 +9,12 @@ namespace PpcGen {
|
|||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::ADDI (PPCReg Rd, PPCReg Ra, unsigned short imm) {
|
||||
void PPCXEmitter::ADDI (PPCReg Rd, PPCReg Ra, short imm) {
|
||||
u32 instr = (0x38000000 | (Rd << 21) | (Ra << 16) | ((imm) & 0xffff));
|
||||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::ADDIS (PPCReg Rd, PPCReg Ra, unsigned short imm) {
|
||||
void PPCXEmitter::ADDIS (PPCReg Rd, PPCReg Ra, short imm) {
|
||||
u32 instr = (0x3C000000 | (Rd << 21) | (Ra << 16) | ((imm) & 0xffff));
|
||||
Write32(instr);
|
||||
}
|
||||
|
@ -49,6 +49,11 @@ namespace PpcGen {
|
|||
u32 instr = (0x88000000 | (dest << 21) | (src << 16) | ((offset) & 0xffff));
|
||||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::LBZX (PPCReg dest, PPCReg a, PPCReg b) {
|
||||
u32 instr = ((31<<26) | (dest << 21) | (a << 16) | (b << 11) | (87<<1));
|
||||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::LHZ (PPCReg dest, PPCReg src, int offset) {
|
||||
u32 instr = (0xA0000000 | (dest << 21) | (src << 16) | ((offset) & 0xffff));
|
||||
|
@ -75,6 +80,11 @@ namespace PpcGen {
|
|||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::STBX (PPCReg dest, PPCReg a, PPCReg b) {
|
||||
u32 instr = ((31<<26) | (dest << 21) | (a << 16) | (b << 11) | (215 << 1));
|
||||
Write32(instr);
|
||||
}
|
||||
|
||||
void PPCXEmitter::STH (PPCReg dest, PPCReg src, int offset) {
|
||||
u32 instr = (0xB0000000 | (dest << 21) | (src << 16) | ((offset) & 0xffff));
|
||||
Write32(instr);
|
||||
|
@ -400,7 +410,6 @@ namespace PpcGen {
|
|||
// Branch
|
||||
BCTRL();
|
||||
}
|
||||
|
||||
|
||||
// sign
|
||||
void PPCXEmitter::EXTSB (PPCReg dest, PPCReg src) {
|
||||
|
@ -415,6 +424,48 @@ namespace PpcGen {
|
|||
Write32((21<<26) | (src << 21) | (dest << 16) | (shift << 11) | (start << 6) | (end << 1));
|
||||
}
|
||||
|
||||
// Prologue / epilogue
|
||||
|
||||
void PPCXEmitter::Prologue() {
|
||||
// Save regs
|
||||
u32 regSize = 8; // 4 in 32bit system
|
||||
u32 stackFrameSize = 32*32;//(35 - 12) * regSize;
|
||||
|
||||
// Write Prologue (setup stack frame etc ...)
|
||||
// Save Lr
|
||||
MFLR(R12);
|
||||
|
||||
for(int i = 14; i < 32; i ++) {
|
||||
STD((PPCReg)i, R1, -((33 - i) * regSize));
|
||||
}
|
||||
|
||||
// Save r12
|
||||
STW(R12, R1, -0x8);
|
||||
|
||||
// allocate stack
|
||||
STWU(R1, R1, -stackFrameSize);
|
||||
}
|
||||
|
||||
void PPCXEmitter::Epilogue() {
|
||||
u32 regSize = 8; // 4 in 32bit system
|
||||
u32 stackFrameSize = 32*32;//(35 - 12) * regSize;
|
||||
|
||||
// Write Epilogue (restore stack frame, return)
|
||||
// free stack
|
||||
ADDI(R1, R1, stackFrameSize);
|
||||
|
||||
// Restore regs
|
||||
for(int i = 14; i < 32; i ++) {
|
||||
LD((PPCReg)i, R1, -((33 - i) * regSize));
|
||||
}
|
||||
|
||||
// recover r12 (LR saved register)
|
||||
LWZ (R12, R1, -0x8);
|
||||
|
||||
// Restore Lr
|
||||
MTLR(R12);
|
||||
}
|
||||
|
||||
// Others ...
|
||||
|
||||
void PPCXEmitter::SetCodePtr(u8 *ptr)
|
||||
|
|
|
@ -223,8 +223,8 @@ public:
|
|||
|
||||
// Arithmetics ops
|
||||
void ADD (PPCReg Rd, PPCReg Ra, PPCReg Rb);
|
||||
void ADDI (PPCReg Rd, PPCReg Ra, unsigned short imm);
|
||||
void ADDIS (PPCReg Rd, PPCReg Ra, unsigned short imm);
|
||||
void ADDI (PPCReg Rd, PPCReg Ra, short imm);
|
||||
void ADDIS (PPCReg Rd, PPCReg Ra, short imm);
|
||||
void ADDC (PPCReg Rd, PPCReg Ra, PPCReg Rb);
|
||||
void SUBF (PPCReg Rd, PPCReg Ra, PPCReg Rb, int RCFlags = 0);
|
||||
void SUBFC (PPCReg Rd, PPCReg Ra, PPCReg Rb);
|
||||
|
@ -246,6 +246,8 @@ public:
|
|||
|
||||
// 8bit
|
||||
void LBZ (PPCReg dest, PPCReg src, int offset = 0);
|
||||
void LBZX (PPCReg dest, PPCReg a, PPCReg b);
|
||||
|
||||
// 16bit
|
||||
void LHZ (PPCReg dest, PPCReg src, int offset = 0);
|
||||
void LHBRX (PPCReg dest, PPCReg src, PPCReg offset);
|
||||
|
@ -257,6 +259,7 @@ public:
|
|||
|
||||
// 8 bit
|
||||
void STB (PPCReg dest, PPCReg src, int offset = 0);
|
||||
void STBX (PPCReg dest, PPCReg a, PPCReg b);
|
||||
// 16 bit
|
||||
void STH (PPCReg dest, PPCReg src, int offset = 0);
|
||||
void STHBRX (PPCReg dest, PPCReg src, PPCReg offset);
|
||||
|
@ -279,6 +282,9 @@ public:
|
|||
void CMPL (PPCReg a, PPCReg b);
|
||||
void CMP (PPCReg a, PPCReg b);
|
||||
|
||||
void Prologue();
|
||||
void Epilogue();
|
||||
|
||||
// Debug !
|
||||
void Break() {
|
||||
Write32(0x0FE00016);
|
||||
|
|
Loading…
Add table
Reference in a new issue