mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-10-30 07:11:38 +00:00
Implement mulhd and mulhdu
This commit is contained in:
parent
e5ca0a2684
commit
6299ca7ee7
2 changed files with 34 additions and 0 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue