Implement mulhd and mulhdu

This commit is contained in:
CRACKbomber 2025-05-23 14:56:26 -04:00 committed by Tom
parent e5ca0a2684
commit 6299ca7ee7
2 changed files with 34 additions and 0 deletions

View file

@ -1351,6 +1351,22 @@ bool Recompiler::Recompile(
println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer()); println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer());
break; break;
case PPC_INST_MULHD:
println("\t{}.s64 = __mulh({}.s64, {}.s64);",
r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
if (strchr(insn.opcode->name, '.'))
println("\t{}.compare<int32_t>({}.s32, 0, {});",
cr(0), r(insn.operands[0]), xer());
break;
case PPC_INST_MULHDU:
println("\t{}.u64 = __mulhu({}.u64, {}.u64);",
r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
if (strchr(insn.opcode->name, '.'))
println("\t{}.compare<int32_t>({}.s32, 0, {});",
cr(0), r(insn.operands[0]), xer());
break;
case PPC_INST_NAND: case PPC_INST_NAND:
println("\t{}.u64 = ~({}.u64 & {}.u64);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2])); println("\t{}.u64 = ~({}.u64 & {}.u64);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
break; break;

View file

@ -658,4 +658,22 @@ inline __m128 _mm_vcmpbfp(__m128 a, __m128 b)
return _mm_or_ps(xmm0, xmm1); return _mm_or_ps(xmm0, xmm1);
} }
inline uint64_t __mulhu(uint64_t a, uint64_t b) {
// Get high/low 32-bit parts
uint32_t a_lo = (uint32_t)a;
uint32_t a_hi = (uint32_t)(a >> 32);
uint32_t b_lo = (uint32_t)b;
uint32_t b_hi = (uint32_t)(b >> 32);
// Compute partial products
uint64_t lo_lo = (uint64_t)a_lo * b_lo;
uint64_t hi_lo = (uint64_t)a_hi * b_lo;
uint64_t lo_hi = (uint64_t)a_lo * b_hi;
uint64_t hi_hi = (uint64_t)a_hi * b_hi;
// Compute high 64 bits of result
uint64_t cross = (lo_lo >> 32) + (uint32_t)hi_lo + (uint32_t)lo_hi;
return hi_hi + (hi_lo >> 32) + (lo_hi >> 32) + (cross >> 32);
}
#endif #endif