void Assembler::asm_store32(LOpcode op, LIns *value, int32_t dr, LIns *base) { switch (op) { case LIR_sti: // handled by mainline code below for now break; case LIR_stb: case LIR_sts: NanoAssertMsg(0, "NJ_EXPANDED_LOADSTORE_SUPPORTED not yet supported for this architecture"); return; default: NanoAssertMsg(0, "asm_store32 should never receive this LIR opcode"); return; } Register rs = findRegFor(value, GpRegs); Register ra = value == base ? rs : getBaseReg(LIR_sti, base, dr, GpRegs & ~rmask(rs)); #if !PEDANTIC if (isS16(dr)) { STW(rs, dr, ra); return; } #endif // general case store, any offset size STWX(rs, ra, R0); asm_li(R0, dr); }
void PPCXEmitter::LoadFloatSwap(PPCReg FRt, PPCReg Base, PPCReg offset) { // used for swapping float ... u32 tmp; // Load Value into a temp REG LWBRX(R6, Base, offset); // Save it in tmp MOVI2R(R7, (u32)&tmp); STW(R6, R7); // Load the final value LFS(FRt, R7, 0); }
void Assembler::asm_store32(LIns *value, int32_t dr, LIns *base) { Register rs = findRegFor(value, GpRegs); Register ra = value == base ? rs : getBaseReg(LIR_sti, base, dr, GpRegs & ~rmask(rs)); #if !PEDANTIC if (isS16(dr)) { STW(rs, dr, ra); return; } #endif // general case store, any offset size STWX(rs, ra, R0); asm_li(R0, dr); }
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::Prologue() { // Save regs u32 regSize = 8; // 4 in 32bit system u32 stackFrameSize = 0x1F0; // Write Prologue (setup stack frame etc ...) // Save Lr MFLR(R12); // Save gpr for(int i = 14; i < 32; i ++) { STD((PPCReg)i, R1, -((33 - i) * regSize)); } // Save r12 STW(R12, R1, -0x8); #if 0 // add fpr frame ADDI(R12, R1, -0x98); // Load fpr for(int i = 14; i < 32; i ++) { SFD((PPCReg)i, R1, -((32 - i) * regSize)); } #endif // allocate stack STWU(R1, R1, -stackFrameSize); #if 1 // load fpr buff MOVI2R(R10, (u32)&_fprTmp); // Save fpr for(int i = 14; i < 32; i ++) { SFD((PPCReg)i, R10, i * regSize); } #endif }
void PPCXEmitter::MOVI2F (PPCReg dest, float imm, bool negate) { u32 tmp; union convert { unsigned int i; float f; } fc; fc.f = imm; MOVI2R(R6, fc.i); // R7 = imm MOVI2R(R7, (u32)&tmp); STW(R6, R7); // dest = R7 LFS(dest, R7, 0); if (negate == true) { FNEG(dest, dest); } }