static void absXmmSd(PPCEmuAssembler& a, const PPCEmuAssembler::XmmRegister& reg) { auto maskGp = a.allocGpTmp(); auto maskXmm = a.allocXmmTmp(); a.mov(maskGp, UINT64_C(0x7FFFFFFFFFFFFFFF)); a.movq(maskXmm, maskGp); a.pand(reg, maskXmm); }
static void negateXmmSd(PPCEmuAssembler& a, const PPCEmuAssembler::XmmRegister& reg) { auto maskGp = a.allocGpTmp(); auto maskXmm = a.allocXmmTmp(); a.mov(maskGp, UINT64_C(0x8000000000000000)); a.movq(maskXmm, maskGp); a.pxor(reg, maskXmm); }
void truncateToSingleSd(PPCEmuAssembler& a, const PPCEmuAssembler::XmmRegister& dst, const PPCEmuAssembler::XmmRegister& src) { auto maskGp = a.allocGpTmp(); a.mov(maskGp, UINT64_C(0xFFFFFFFFE0000000)); if (&dst == &src) { auto tmp = a.allocXmmTmp(); a.movq(tmp, maskGp); a.pand(dst, tmp); } else { a.movq(dst, maskGp); a.pand(dst, src); } }
static void roundTo24BitSd(PPCEmuAssembler& a, const PPCEmuAssembler::XmmRegister& reg) { auto maskGp = a.allocGpTmp(); auto maskXmm = a.allocXmmTmp(); auto tmp = a.allocXmmTmp(); a.movq(tmp, reg); a.mov(maskGp, UINT64_C(0x8000000)); a.movq(maskXmm, maskGp); a.pand(tmp, maskXmm); a.mov(maskGp, UINT64_C(0xFFFFFFFFF8000000)); a.movq(maskXmm, maskGp); a.pand(reg, maskXmm); a.paddq(reg, tmp); }
// Data Cache Block Zero static bool dcbz(PPCEmuAssembler& a, Instruction instr) { auto src = a.allocGpTmp().r32(); if (instr.rA == 0) { a.mov(src, 0); } else { a.mov(src, a.loadRegisterRead(a.gpr[instr.rA])); } a.add(src, a.loadRegisterRead(a.gpr[instr.rB])); // Align down a.and_(src, ~static_cast<uint32_t>(31)); // Write 32 bytes of zero's there a.mov(asmjit::X86Mem(a.membaseReg, src, 0, 0, 8), 0); a.mov(asmjit::X86Mem(a.membaseReg, src, 0, 8, 8), 0); a.mov(asmjit::X86Mem(a.membaseReg, src, 0, 16, 8), 0); a.mov(asmjit::X86Mem(a.membaseReg, src, 0, 24, 8), 0); return true; }