add prolog/epilog, add stbx, lbzx, fix addi/addis

This commit is contained in:
Ced2911 2013-08-15 12:57:56 +02:00
parent 41bf19244d
commit d2aa4747aa
2 changed files with 62 additions and 5 deletions

View file

@ -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)

View file

@ -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);