Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions XenonRecomp/recompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,22 @@ bool Recompiler::Recompile(
case PPC_INST_BNELR:
println("\tif (!{}.eq) return;", cr(insn.operands[0]));
break;

case PPC_INST_BNS:
printConditionalBranch(true, "so");
break;

case PPC_INST_BNSLR:
println("\tif (!{}.so) return;", cr(insn.operands[0]));
break;

case PPC_INST_BSO:
printConditionalBranch(false, "so");
break;

case PPC_INST_BSOLR:
println("\tif ({}.so) return;", cr(insn.operands[0]));
break;

case PPC_INST_CCTPL:
// no op
Expand Down Expand Up @@ -851,6 +867,10 @@ bool Recompiler::Recompile(
case PPC_INST_EIEIO:
// no op
break;

case PPC_INST_EQV:
println("\t{}.u64 = ~({}.u64 ^ {}.u64);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
break;

case PPC_INST_EXTSB:
println("\t{}.s64 = {}.s8;", r(insn.operands[0]), r(insn.operands[1]));
Expand Down Expand Up @@ -1111,6 +1131,13 @@ bool Recompiler::Recompile(
println("{}.u32));", r(insn.operands[2]));
break;

case PPC_INST_LHBRX:
print("\t{}.u64 = __builtin_bswap16(PPC_LOAD_U16(", r(insn.operands[0]));
if (insn.operands[1] != 0)
print("{}.u32 + ", r(insn.operands[1]));
println("{}.u32));", r(insn.operands[2]));
break;

case PPC_INST_LHZ:
print("\t{}.u64 = PPC_LOAD_U16(", r(insn.operands[0]));
if (insn.operands[2] != 0)
Expand Down Expand Up @@ -1300,6 +1327,10 @@ bool Recompiler::Recompile(
println("\t{}.ov = ({}.u64 & 0x40000000) != 0;", xer(), r(insn.operands[0]));
println("\t{}.ca = ({}.u64 & 0x20000000) != 0;", xer(), r(insn.operands[0]));
break;

case PPC_INST_MULHD:
println("\t{}.u64 = uint64_t((__int128_t({}.s64) * __int128_t({}.s64)) >> 64);", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
break;

case PPC_INST_MULHW:
println("\t{}.s64 = (int64_t({}.s32) * int64_t({}.s32)) >> 32;", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]));
Expand Down Expand Up @@ -1769,6 +1800,7 @@ bool Recompiler::Recompile(
println("\tsimde_mm_store_si128((simde__m128i*){}.u8, simde_mm_and_si128(simde_mm_load_si128((simde__m128i*){}.u8), simde_mm_load_si128((simde__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
break;

case PPC_INST_VANDC:
case PPC_INST_VANDC128:
println("\tsimde_mm_store_si128((simde__m128i*){}.u8, simde_mm_andnot_si128(simde_mm_load_si128((simde__m128i*){}.u8), simde_mm_load_si128((simde__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
break;
Expand Down Expand Up @@ -2047,6 +2079,10 @@ bool Recompiler::Recompile(
println("\tsimde_mm_store_si128((simde__m128i*){}.u8, simde_mm_packus_epi16(simde_mm_load_si128((simde__m128i*){}.s16), simde_mm_load_si128((simde__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
break;

case PPC_INST_VPKSWSS:
println("\tsimde_mm_store_si128((simde__m128i*){}.u8, simde_mm_packs_epi32(simde_mm_load_si128((simde__m128i*){}.s32), simde_mm_load_si128((simde__m128i*){}.s32)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
break;

case PPC_INST_VREFP:
case PPC_INST_VREFP128:
// TODO: see if we can use rcp safely
Expand Down Expand Up @@ -2088,6 +2124,7 @@ bool Recompiler::Recompile(
break;

case PPC_INST_VSEL:
case PPC_INST_VSEL128:
println("\tsimde_mm_store_si128((simde__m128i*){}.u8, simde_mm_or_si128(simde_mm_andnot_si128(simde_mm_load_si128((simde__m128i*){}.u8), simde_mm_load_si128((simde__m128i*){}.u8)), simde_mm_and_si128(simde_mm_load_si128((simde__m128i*){}.u8), simde_mm_load_si128((simde__m128i*){}.u8))));", v(insn.operands[0]), v(insn.operands[3]), v(insn.operands[1]), v(insn.operands[3]), v(insn.operands[2]));
break;

Expand Down