| 
						
					 | 
					 | 
					@@ -531,6 +531,13 @@ 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_ADDC:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.ca = {}.u32 > ~{}.u32;", xer(), r(insn.operands[2]), r(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = {}.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_ADDE:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_ADDE:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u8 = ({}.u32 + {}.u32 < {}.u32) | ({}.u32 + {}.u32 + {}.ca < {}.ca);", temp(), r(insn.operands[1]), r(insn.operands[2]), r(insn.operands[1]), r(insn.operands[1]), r(insn.operands[2]), xer(), xer());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u8 = ({}.u32 + {}.u32 < {}.u32) | ({}.u32 + {}.u32 + {}.ca < {}.ca);", temp(), r(insn.operands[1]), r(insn.operands[2]), r(insn.operands[1]), r(insn.operands[1]), r(insn.operands[2]), xer(), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u64 = {}.u64 + {}.u64 + {}.ca;", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]), xer());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = {}.u64 + {}.u64 + {}.ca;", r(insn.operands[0]), r(insn.operands[1]), r(insn.operands[2]), xer());
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -539,6 +546,14 @@ 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_ADDME:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u8 = ({}.u32 - 1 < {}.u32) | ({}.u32 - 1 + {}.ca < {}.ca);", temp(), r(insn.operands[1]), r(insn.operands[1]), r(insn.operands[1]), xer(), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = {}.u64 - 1 + {}.ca;", r(insn.operands[0]), r(insn.operands[1]), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.ca = {}.u8;", xer(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_ADDI:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_ADDI:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.s64 = ", r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.s64 = ", r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -652,6 +667,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 == 0) goto loc_{:X};", ctr(), insn.operands[0]);
 | 
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 == 0) goto loc_{:X};", ctr(), insn.operands[0]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_BDZF:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        constexpr std::string_view fields[] = { "lt", "gt", "eq", "so" };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 == 0 && !{}.{}) goto loc_{:X};", ctr(), cr(insn.operands[0] / 4), fields[insn.operands[0] % 4], insn.operands[1]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_BDZLR:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_BDZLR:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 == 0) return;", ctr(), insn.operands[0]);
 | 
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 == 0) return;", ctr(), insn.operands[0]);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -663,10 +686,20 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_BDNZF:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_BDNZF:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // NOTE: assuming eq here as a shortcut because all the instructions in the game do that
 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        constexpr std::string_view fields[] = { "lt", "gt", "eq", "so" };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 != 0 && !{}.eq) goto loc_{:X};", ctr(), cr(insn.operands[0] / 4), insn.operands[1]);
 | 
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 != 0 && !{}.{}) goto loc_{:X};", ctr(), cr(insn.operands[0] / 4), fields[insn.operands[0] % 4], insn.operands[1]);
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_BDNZT:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        constexpr std::string_view fields[] = { "lt", "gt", "eq", "so" };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t--{}.u64;", ctr());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\tif ({}.u32 != 0 && {}.{}) goto loc_{:X};", ctr(), cr(insn.operands[0] / 4), fields[insn.operands[0] % 4], insn.operands[1]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_BEQ:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_BEQ:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printConditionalBranch(false, "eq");
 | 
					 | 
					 | 
					 | 
					        printConditionalBranch(false, "eq");
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -796,6 +829,20 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{0}.u64 = {1}.u32 == 0 ? 32 : __builtin_clz({1}.u32);", r(insn.operands[0]), r(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("\t{0}.u64 = {1}.u32 == 0 ? 32 : __builtin_clz({1}.u32);", r(insn.operands[0]), r(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_CROR:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        constexpr std::string_view fields[] = { "lt", "gt", "eq", "so" };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.{} = {}.{} | {}.{};", cr(insn.operands[0] / 4), fields[insn.operands[0] % 4], cr(insn.operands[1] / 4), fields[insn.operands[1] % 4], cr(insn.operands[2] / 4), fields[insn.operands[2] % 4]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_CRORC:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        constexpr std::string_view fields[] = { "lt", "gt", "eq", "so" };
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.{} = {}.{} | (~{}.{} & 1);", cr(insn.operands[0] / 4), fields[insn.operands[0] % 4], cr(insn.operands[1] / 4), fields[insn.operands[1] % 4], cr(insn.operands[2] / 4), fields[insn.operands[2] % 4]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_DB16CYC:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_DB16CYC:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // no op
 | 
					 | 
					 | 
					 | 
					        // no op
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -808,6 +855,10 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // no op
 | 
					 | 
					 | 
					 | 
					        // no op
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_DCBST:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // no op
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_DCBTST:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_DCBTST:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // no op
 | 
					 | 
					 | 
					 | 
					        // no op
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -852,6 +903,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // no op
 | 
					 | 
					 | 
					 | 
					        // no op
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_EQV:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = ~({}.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_EXTSB:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_EXTSB:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {}.s8;", r(insn.operands[0]), r(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {}.s8;", r(insn.operands[0]), r(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1035,6 +1092,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LBZUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U8({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LD:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LD:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1063,6 +1126,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LDUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U64({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LFD:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFD:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", f(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", f(insn.operands[0]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1071,6 +1140,13 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{});", int32_t(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("{});", int32_t(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFDU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U64({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LFDX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFDX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", f(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U64(", f(insn.operands[0]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1079,6 +1155,13 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFDUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U64({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LFS:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u32 = PPC_LOAD_U32(", temp());
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u32 = PPC_LOAD_U32(", temp());
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1088,6 +1171,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFSU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = PPC_LOAD_U32({});", temp(), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LFSX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFSX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u32 = PPC_LOAD_U32(", temp());
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u32 = PPC_LOAD_U32(", temp());
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1097,6 +1188,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LFSUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = PPC_LOAD_U32({});", temp(), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.f64 = double({}.f32);", f(insn.operands[0]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LHA:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHA:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.s64 = int16_t(PPC_LOAD_U16(", r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.s64 = int16_t(PPC_LOAD_U16(", r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1104,6 +1203,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}));", int32_t(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("{}));", int32_t(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHAU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("\t{}.s64 = int16_t(PPC_LOAD_U16({}));", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LHAX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHAX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.s64 = int16_t(PPC_LOAD_U16(", r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.s64 = int16_t(PPC_LOAD_U16(", r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1118,6 +1223,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{});", int32_t(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("{});", int32_t(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHZU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U16({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LHZX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHZX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U16(", r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t{}.u64 = PPC_LOAD_U16(", r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1125,6 +1236,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LHZUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U16({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LI:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LI:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {};", r(insn.operands[0]), int32_t(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {};", r(insn.operands[0]), int32_t(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1137,6 +1254,7 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LVEWX128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LVEWX128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LVX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LVX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_LVX128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LVX128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LVEHX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // NOTE: for endian swapping, we reverse the whole vector instead of individual elements.
 | 
					 | 
					 | 
					 | 
					        // NOTE: for endian swapping, we reverse the whole vector instead of individual elements.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // this is accounted for in every instruction (eg. dp3 sums yzw instead of xyz)
 | 
					 | 
					 | 
					 | 
					        // this is accounted for in every instruction (eg. dp3 sums yzw instead of xyz)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("\t_mm_store_si128((__m128i*){}.u8, _mm_shuffle_epi8(_mm_load_si128((__m128i*)(base + ((", v(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        print("\t_mm_store_si128((__m128i*){}.u8, _mm_shuffle_epi8(_mm_load_si128((__m128i*)(base + ((", v(insn.operands[0]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1232,6 +1350,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32);", r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_LWZUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = PPC_LOAD_U32({});", r(insn.operands[0]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_MFCR:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_MFCR:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 32; i++)
 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 32; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        {
 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1482,7 +1606,7 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STBU:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STBU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tPPC_STORE_U8({}, {}.u8);", ea(), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u8);", mmioStore() ? "PPC_MM_STORE_U8(" : "PPC_STORE_U8(", ea(), r(insn.operands[0]));
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1493,6 +1617,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u8);", r(insn.operands[2]), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u8);", r(insn.operands[2]), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STBUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u8);", mmioStore() ? "PPC_MM_STORE_U8(" : "PPC_STORE_U8(", ea(), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STD:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STD:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1512,7 +1642,7 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STDU:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STDU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tPPC_STORE_U64({}, {}.u64);", ea(), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u64);", mmioStore() ? "PPC_MM_STORE_U64(" : "PPC_STORE_U64(", ea(), r(insn.operands[0]));
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1523,6 +1653,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u64);", r(insn.operands[2]), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u64);", r(insn.operands[2]), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STDUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u64);", mmioStore() ? "PPC_MM_STORE_U64(" : "PPC_STORE_U64(", ea(), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STFD:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFD:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1531,6 +1667,13 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}, {}.u64);", int32_t(insn.operands[1]), f(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("{}, {}.u64);", int32_t(insn.operands[1]), f(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFDU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u64);", mmioStore() ? "PPC_MM_STORE_U64(" : "PPC_STORE_U64(", ea(), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STFDX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFDX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U64(" : "\tPPC_STORE_U64(");
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1556,6 +1699,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}, {}.u32);", int32_t(insn.operands[1]), temp());
 | 
					 | 
					 | 
					 | 
					        println("{}, {}.u32);", int32_t(insn.operands[1]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFSU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.f32 = float({}.f64);", temp(), f(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u32);", mmioStore() ? "PPC_MM_STORE_U32(" : "PPC_STORE_U32(", ea(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STFSX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFSX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.f32 = float({}.f64);", temp(), f(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}.f32 = float({}.f64);", temp(), f(insn.operands[0]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1565,6 +1716,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u32);", r(insn.operands[2]), temp());
 | 
					 | 
					 | 
					 | 
					        println("{}.u32, {}.u32);", r(insn.operands[2]), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STFSUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(false);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.f32 = float({}.f64);", temp(), f(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u32);", mmioStore() ? "PPC_MM_STORE_U32(" : "PPC_STORE_U32(", ea(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STH:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U16(" : "\tPPC_STORE_U16(");
 | 
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U16(" : "\tPPC_STORE_U16(");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1572,6 +1731,18 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("{}, {}.u16);", int32_t(insn.operands[1]), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("{}, {}.u16);", int32_t(insn.operands[1]), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STHU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u16);", mmioStore() ? "PPC_MM_STORE_U16(" : "PPC_STORE_U16(", ea(), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STHUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u16);", mmioStore() ? "PPC_MM_STORE_U16(" : "PPC_STORE_U16(", ea(), r(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STHBRX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STHBRX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U16(" : "\tPPC_STORE_U16(");
 | 
					 | 
					 | 
					 | 
					        print("{}", mmioStore() ? "\tPPC_MM_STORE_U16(" : "\tPPC_STORE_U16(");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
					 | 
					 | 
					 | 
					        if (insn.operands[1] != 0)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1667,13 +1838,13 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STWU:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STWU:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t{} = {} + {}.u32;", ea(), int32_t(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tPPC_STORE_U32({}, {}.u32);", ea(), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u32);", mmioStore() ? "PPC_MM_STORE_U32(" : "PPC_STORE_U32(", ea(), r(insn.operands[0]));
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[2]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_STWUX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_STWUX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t{} = {}.u32 + {}.u32;", ea(), r(insn.operands[1]), r(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\tPPC_STORE_U32({}, {}.u32);", ea(), r(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}{}, {}.u32);", mmioStore() ? "PPC_MM_STORE_U32(" : "PPC_STORE_U32(", ea(), r(insn.operands[0]));
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
					 | 
					 | 
					 | 
					        println("\t{}.u32 = {};", r(insn.operands[1]), ea());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1705,6 +1876,14 @@ 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_SUBFZE:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u8 = (~{}.u32 < ~{}.u32) | (~{}.u32 + {}.ca < {}.ca);", temp(), r(insn.operands[1]), r(insn.operands[1]), r(insn.operands[1]), xer(), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.u64 = ~{}.u64 + {}.ca;", r(insn.operands[0]), r(insn.operands[1]), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t{}.ca = {}.u8;", xer(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.compare<int32_t>({}.s32, 0, {});", cr(0), r(insn.operands[0]), xer());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_SUBFIC:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_SUBFIC:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.ca = {}.u32 <= {};", xer(), r(insn.operands[1]), insn.operands[2]);
 | 
					 | 
					 | 
					 | 
					        println("\t{}.ca = {}.u32 <= {};", xer(), r(insn.operands[1]), insn.operands[2]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {} - {}.s64;", r(insn.operands[0]), int32_t(insn.operands[2]), r(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("\t{}.s64 = {} - {}.s64;", r(insn.operands[0]), int32_t(insn.operands[2]), r(insn.operands[1]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1740,10 +1919,23 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_add_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_add_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VADDSBS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.s8, _mm_adds_epi8(_mm_load_si128((__m128i*){}.s8), _mm_load_si128((__m128i*){}.s8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VADDSHS:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VADDSHS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.s16, _mm_adds_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.s16, _mm_adds_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VADDSWS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 4; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s64 = int64_t({}.s32[{}]) + int64_t({}.s32[{}]);", temp(), v(insn.operands[1]), i, v(insn.operands[2]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s32[{}] = {}.s64 > INT_MAX ? INT_MAX : {}.s64 < INT_MIN ? INT_MIN : {}.s64;", v(insn.operands[0]), i, temp(), temp(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VADDUBM:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VADDUBM:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_add_epi8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_add_epi8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1785,6 +1977,10 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_avg_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_avg_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VAVGUH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_avg_epu16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCTSXS:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCTSXS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCFPSXWS128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCFPSXWS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(true);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(true);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1795,6 +1991,16 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            println("_mm_load_ps({}.f32)));", v(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					            println("_mm_load_ps({}.f32)));", v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCTUXS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCFPUXWS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(true);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("\t_mm_store_si128((__m128i*){}.u32, _mm_vctuxs(", v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (insn.operands[2] != 0)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("_mm_mul_ps(_mm_load_ps({}.f32), _mm_set1_ps({}))));", v(insn.operands[1]), 1u << insn.operands[2]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        else
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("_mm_load_ps({}.f32)));", v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCFSX:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCFSX:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCSXWFP128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCSXWFP128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    {
 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1848,6 +2054,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.u8), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.u8), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPEQUH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpeq_epi16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.u16), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPEQUW:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPEQUW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPEQUW128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPEQUW128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpeq_epi32(_mm_load_si128((__m128i*){}.u32), _mm_load_si128((__m128i*){}.u32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpeq_epi32(_mm_load_si128((__m128i*){}.u32), _mm_load_si128((__m128i*){}.u32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1873,10 +2085,26 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTUB:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTUB:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpgt_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpgt_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.u8), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTUH:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTUH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpgt_epu16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_cmpgt_epu16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.u16), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTSH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.s8, _mm_cmpgt_epi16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.s16), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VCMPGTSW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.s8, _mm_cmpgt_epi32(_mm_load_si128((__m128i*){}.u32), _mm_load_si128((__m128i*){}.u32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (strchr(insn.opcode->name, '.'))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.setFromMask(_mm_load_si128((__m128i*){}.s32), 0xFFFF);", cr(6), v(insn.operands[0]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VEXPTEFP:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VEXPTEFP:
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -1908,10 +2136,18 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_max_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_max_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VMAXSH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u16, _mm_max_epi16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VMAXSW:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VMAXSW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u32, _mm_max_epi32(_mm_load_si128((__m128i*){}.u32), _mm_load_si128((__m128i*){}.u32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u32, _mm_max_epi32(_mm_load_si128((__m128i*){}.u32), _mm_load_si128((__m128i*){}.u32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VMINSH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u16, _mm_min_epi16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VMINFP:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VMINFP:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VMINFP128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VMINFP128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        printSetFlushMode(true);
 | 
					 | 
					 | 
					 | 
					        printSetFlushMode(true);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2001,7 +2237,7 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        switch (insn.operands[2])
 | 
					 | 
					 | 
					 | 
					        switch (insn.operands[2])
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        {
 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        case 0: // D3D color
 | 
					 | 
					 | 
					 | 
					        case 0: // D3D color
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (insn.operands[3] != 1 || insn.operands[4] != 3)
 | 
					 | 
					 | 
					 | 
					            if (insn.operands[3] != 1)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                fmt::println("Unexpected D3D color pack instruction at {:X}", base);
 | 
					 | 
					 | 
					 | 
					                fmt::println("Unexpected D3D color pack instruction at {:X}", base);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            for (size_t i = 0; i < 4; i++)
 | 
					 | 
					 | 
					 | 
					            for (size_t i = 0; i < 4; i++)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2011,7 +2247,29 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                println("\t{}.f32[{}] = {}.f32[{}] < 3.0f ? 3.0f : ({}.f32[{}] > {}.f32[{}] ? {}.f32[{}] : {}.f32[{}]);", vTemp(), i, v(insn.operands[1]), i, v(insn.operands[1]), i, vTemp(), i, vTemp(), i, v(insn.operands[1]), i);
 | 
					 | 
					 | 
					 | 
					                println("\t{}.f32[{}] = {}.f32[{}] < 3.0f ? 3.0f : ({}.f32[{}] > {}.f32[{}] ? {}.f32[{}] : {}.f32[{}]);", vTemp(), i, v(insn.operands[1]), i, v(insn.operands[1]), i, vTemp(), i, vTemp(), i, v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                println("\t{}.u32 {}= uint32_t({}.u8[{}]) << {};", temp(), i == 0 ? "" : "|", vTemp(), i * 4, indices[i] * 8);
 | 
					 | 
					 | 
					 | 
					                println("\t{}.u32 {}= uint32_t({}.u8[{}]) << {};", temp(), i == 0 ? "" : "|", vTemp(), i * 4, indices[i] * 8);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            }
 | 
					 | 
					 | 
					 | 
					            }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            println("\t{}.u32[3] = {}.u32;", v(insn.operands[0]), temp());
 | 
					 | 
					 | 
					 | 
					            println("\t{}.u32[{}] = {}.u32;", v(insn.operands[0]), insn.operands[4], temp());
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        case 5: // float16_4
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            if (insn.operands[3] != 2 || insn.operands[4] > 2)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                fmt::println("Unexpected float16_4 pack instruction at {:X}", base);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            for (size_t i = 0; i < 4; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// Strip sign from source
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		println("\t{}.u32 = ({}.u32[{}]&0x7FFFFFFF);", temp(), v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If |source| is > 65504, clamp output to 0x7FFF, else save 8 exponent bits 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		println("\t{0}.u8[0] = ({1}.f32 != {1}.f32) || ({1}.f32 > 65504.0f) ? 0xFF : (({2}.u32[{3}]&0x7f800000)>>23);", vTemp(), temp(), v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If 8 exponent bits were saved, it can only be 0x8E at most
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If saved, save first 10 bits of mantissa
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		println("\t{}.u16 = {}.u8[0] != 0xFF ? (({}.u32[{}]&0x7FE000)>>13) : 0x0;", temp(), vTemp(), v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If saved and > 127-15, exponent is converted from 8 to 5-bit by subtracting 0x70
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If saved but not > 127-15, clamp exponent at 0, add 0x400 to mantissa and shift right by (0x71-exponent)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// If right shift is greater than 31 bits, manually clamp mantissa to 0 or else the output of the shift will be wrong
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		println("\t{0}.u16[{1}] = {2}.u8[0] != 0xFF ? ({2}.u8[0] > 0x70 ? ((({2}.u8[0]-0x70)<<10)+{3}.u16) : (0x71-{2}.u8[0] > 31 ? 0x0 : ((0x400+{3}.u16)>>(0x71-{2}.u8[0])))) : 0x7FFF;", v(insn.operands[0]), i+(2*insn.operands[4]), vTemp(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		// Add back original sign
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        		println("\t{}.u16[{}] |= (({}.u32[{}]&0x80000000)>>16);", v(insn.operands[0]), i+(2*insn.operands[4]), v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            break;
 | 
					 | 
					 | 
					 | 
					            break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        default:
 | 
					 | 
					 | 
					 | 
					        default:
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2020,11 +2278,36 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHSS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHSS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_packs_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSWSS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSWSS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_packs_epi32(_mm_load_si128((__m128i*){}.s32), _mm_load_si128((__m128i*){}.s32)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHUS:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHUS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHUS128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSHUS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_packus_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_packus_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSWUS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKSWUS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_packus_epi32(_mm_load_si128((__m128i*){}.s32), _mm_load_si128((__m128i*){}.s32)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKUHUS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VPKUHUS128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{0}.u8[{1}] = {2}.u16[{1}] > UCHAR_MAX ? UCHAR_MAX : {2}.u16[{1}];", vTemp(), i, v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{0}.u8[{1}] = {2}.u16[{3}] > UCHAR_MAX ? UCHAR_MAX : {2}.u16[{3}];", vTemp(), i + 8, v(insn.operands[1]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("{} = {};", v(insn.operands[0]), vTemp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VREFP:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VREFP:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VREFP128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VREFP128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // TODO: see if we can use rcp safely
 | 
					 | 
					 | 
					 | 
					        // TODO: see if we can use rcp safely
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2057,6 +2340,14 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VRLH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{0}.u16[{1}] = ({2}.u16[{1}] << ({3}.u16[{1}] & 0xF)) | ({2}.u16[{1}] >> (16 - ({3}.u16[{1}] & 0xF)));", vTemp(), i, v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("{} = {};", v(insn.operands[0]), vTemp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VRSQRTEFP:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VRSQRTEFP:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VRSQRTEFP128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VRSQRTEFP128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // TODO: see if we can use rsqrt safely
 | 
					 | 
					 | 
					 | 
					        // TODO: see if we can use rsqrt safely
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2066,6 +2357,7 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSEL:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSEL:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSEL128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_or_si128(_mm_andnot_si128(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)), _mm_and_si128(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8))));", v(insn.operands[0]), v(insn.operands[3]), v(insn.operands[1]), v(insn.operands[3]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_or_si128(_mm_andnot_si128(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)), _mm_and_si128(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8))));", v(insn.operands[0]), v(insn.operands[3]), v(insn.operands[1]), v(insn.operands[3]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2075,6 +2367,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            println("\t{}.u8[{}] = {}.u8[{}] << ({}.u8[{}] & 0x7);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i);
 | 
					 | 
					 | 
					 | 
					            println("\t{}.u8[{}] = {}.u8[{}] << ({}.u8[{}] & 0x7);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSLH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.u16[{}] = {}.u16[{}] << ({}.u8[{}] & 0xF);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i * 2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSLDOI:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSLDOI:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSLDOI128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSLDOI128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_alignr_epi8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8), {}));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]), 16 - insn.operands[3]);
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_alignr_epi8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8), {}));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]), 16 - insn.operands[3]);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2108,6 +2406,10 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_set1_epi8(char(0x{:X})));", v(insn.operands[0]), insn.operands[1]);
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_set1_epi8(char(0x{:X})));", v(insn.operands[0]), insn.operands[1]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSPLTISH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u16, _mm_set1_epi16(int(0x{:X})));", v(insn.operands[0]), insn.operands[1]);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSPLTISW:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSPLTISW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSPLTISW128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSPLTISW128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u32, _mm_set1_epi32(int(0x{:X})));", v(insn.operands[0]), insn.operands[1]);
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u32, _mm_set1_epi32(int(0x{:X})));", v(insn.operands[0]), insn.operands[1]);
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2127,6 +2429,18 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_vsr(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_vsr(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAB:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 16; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s8[{}] = {}.s8[{}] >> ({}.u8[{}] & 0x7);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s16[{}] = {}.s16[{}] >> ({}.u8[{}] & 0xF);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i * 2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAW:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAW128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRAW128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2134,6 +2448,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            println("\t{}.s32[{}] = {}.s32[{}] >> ({}.u8[{}] & 0x1F);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i * 4);
 | 
					 | 
					 | 
					 | 
					            println("\t{}.s32[{}] = {}.s32[{}] >> ({}.u8[{}] & 0x1F);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i * 4);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRH:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.u16[{}] = {}.u16[{}] >> ({}.u8[{}] & 0xF);", v(insn.operands[0]), i, v(insn.operands[1]), i, v(insn.operands[2]), i * 2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSRW:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRW:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSRW128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSRW128:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize, ensure endianness is correct
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2147,6 +2467,15 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_sub_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_ps({}.f32, _mm_sub_ps(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBSHS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 8; i++)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s64 = int64_t({}.s16[{}]) - int64_t({}.s16[{}]);", temp(), v(insn.operands[1]), i, v(insn.operands[2]), i);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            println("\t{}.s16[{}] = {}.s64 > SHRT_MAX ? SHRT_MAX : {}.s64 < SHRT_MIN ? SHRT_MIN : {}.s64;", v(insn.operands[0]), i, temp(), temp(), temp());
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBSWS:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBSWS:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // TODO: vectorize
 | 
					 | 
					 | 
					 | 
					        // TODO: vectorize
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 4; i++)
 | 
					 | 
					 | 
					 | 
					        for (size_t i = 0; i < 4; i++)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -2160,8 +2489,12 @@ bool Recompiler::Recompile(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_subs_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_subs_epu8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBUBM:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_sub_epi8(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBUHM:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VSUBUHM:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_sub_epi16(_mm_load_si128((__m128i*){}.u8), _mm_load_si128((__m128i*){}.u8)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
					 | 
					 | 
					 | 
					        println("\t_mm_store_si128((__m128i*){}.u8, _mm_sub_epi16(_mm_load_si128((__m128i*){}.u16), _mm_load_si128((__m128i*){}.u16)));", v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2]));
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        break;
 | 
					 | 
					 | 
					 | 
					        break;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    case PPC_INST_VUPKD3D128:
 | 
					 | 
					 | 
					 | 
					    case PPC_INST_VUPKD3D128:
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					 
 |