Przeglądaj źródła

ASM code generator for "small" programs that fit into the uOP cache

tevador 7 lat temu
rodzic
commit
d2cb086221

+ 352 - 430
src/AssemblyGeneratorX86.cpp

@@ -30,12 +30,20 @@ namespace RandomX {
 
 	static const char* regR[8] = { "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" };
 	static const char* regR32[8] = { "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" };
-	static const char* regF[8] = { "xmm8", "xmm9", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" };
-
+	static const char* regFE[8] = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" };
+	static const char* regF[4] = { "xmm0", "xmm1", "xmm2", "xmm3" };
+	static const char* regE[4] = { "xmm4", "xmm5", "xmm6", "xmm7" };
+	static const char* regA[4] = { "xmm8", "xmm9", "xmm10", "xmm11" };
+
+	static const char* regA4 = "xmm12";
+	static const char* dblMin = "xmm13";
+	static const char* absMask = "xmm14";
+	static const char* signMask = "xmm15";
 	static const char* regMx = "rbp";
-	static const char* regIc = "ebx";
+	static const char* regIc = "rbx";
+	static const char* regIc32 = "ebx";
 	static const char* regIc8 = "bl";
-	static const char* regStackBeginAddr = "rdi";
+	static const char* regDatasetAddr = "rdi";
 	static const char* regScratchpadAddr = "rsi";
 
 	void AssemblyGeneratorX86::generateProgram(const void* seed) {
@@ -49,226 +57,217 @@ namespace RandomX {
 			for (unsigned j = 0; j < sizeof(instr) / sizeof(Pcg32::result_type); ++j) {
 				*(((uint32_t*)&instr) + j) = gen();
 			}
+			instr.src %= RegistersCount;
+			instr.dst %= RegistersCount;
 			generateCode(instr, i);
-			asmCode << std::endl;
+			//asmCode << std::endl;
 		}
-		if(ProgramLength > 0)
-			asmCode << "\tjmp rx_i_0" << std::endl;
 	}
 
 	void AssemblyGeneratorX86::generateCode(Instruction& instr, int i) {
-		asmCode << "rx_i_" << i << ": ;" << instr.getName() << std::endl;
-		asmCode << "\tdec " << regIc << std::endl;
-		asmCode << "\tjz rx_finish" << std::endl;
+		asmCode << "\t; " << instr;
 		auto generator = engine[instr.opcode];
 		(this->*generator)(instr, i);
 	}
 
-	void AssemblyGeneratorX86::gena(Instruction& instr, int i) {
-		asmCode << "\txor " << regR[instr.rega % RegistersCount] << ", 0" << std::hex << instr.addra << "h" << std::dec << std::endl;
-		asmCode << "\tmov eax, " << regR32[instr.rega % RegistersCount] << std::endl;
-		asmCode << "\ttest " << regIc8 << ", 63" << std::endl;
-		asmCode << "\tjnz short rx_body_" << i << std::endl;
-		asmCode << "\tcall rx_read" << std::endl;
-		asmCode << "rx_body_" << i << ":" << std::endl;
-		if ((instr.loca & 192) == 0)
-			asmCode << "\txor " << regMx << ", rax" << std::endl;
-		if (instr.loca & 15) {
-			if (instr.loca & 3) {
-				asmCode << "\tand eax, " << (ScratchpadL1 - 1) << std::endl;
-			}
-			else {
-				asmCode << "\tand eax, " << (ScratchpadL2 - 1) << std::endl;
-			}
+	void AssemblyGeneratorX86::genAddressReg(Instruction& instr, const char* reg = "eax") {
+		asmCode << "\tmov " << reg << ", " << regR32[instr.src] << std::endl;
+		asmCode << "\tand " << reg << ", " << ((instr.alt % 4) ? ScratchpadL1Mask : ScratchpadL2Mask) << std::endl;
+	}
+
+	int32_t AssemblyGeneratorX86::genAddressImm(Instruction& instr) {
+		return instr.imm32 & ((instr.alt % 4) ? ScratchpadL1Mask : ScratchpadL2Mask);
+	}
+
+	//1 uOP
+	void AssemblyGeneratorX86::h_IADD_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tadd " << regR[instr.dst] << ", " << regR[instr.src] << std::endl;
 		}
 		else {
-			asmCode << "\tand eax, " << (ScratchpadL3 - 1) << std::endl;
+			asmCode << "\tadd " << regR[instr.dst] << ", " << instr.imm32 << std::endl;
 		}
 	}
 
-	void AssemblyGeneratorX86::genar(Instruction& instr, int i) {
-		gena(instr, i);
-		asmCode << "\tmov rax, qword ptr [" << regScratchpadAddr << "+rax*8]" << std::endl;
+	//2.75 uOP
+	void AssemblyGeneratorX86::h_IADD_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr);
+			asmCode << "\tadd " << regR[instr.dst] << ", qword ptr [rsi+rax]" << std::endl;
+		}
+		else {
+			asmCode << "\tadd " << regR[instr.dst] << ", qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
+		}
 	}
 
-
-	void AssemblyGeneratorX86::genaf(Instruction& instr, int i) {
-		gena(instr, i);
-		asmCode << "\tcvtdq2pd xmm0, qword ptr [" << regScratchpadAddr << "+rax*8]" << std::endl;
+	//1 uOP
+	void AssemblyGeneratorX86::h_IADD_RC(Instruction& instr, int i) {
+		asmCode << "\tlea " << regR[instr.dst] << ", [" << regR[instr.dst] << "+" << regR[instr.src] << std::showpos << instr.imm32 << std::noshowpos << "]" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::genbiashift(Instruction& instr, const char* instrx86) {
-		if (instr.locb & 1)	{
-			asmCode << "\tmov rcx, " << regR[instr.regb % RegistersCount] << std::endl;
-			asmCode << "\t" << instrx86 << " rax, cl" << std::endl;
-		} else {
-			asmCode << "\t" << instrx86 << " rax, " << (instr.imm8 & 63) << std::endl;;
+	//1 uOP
+	void AssemblyGeneratorX86::h_ISUB_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tsub " << regR[instr.dst] << ", " << regR[instr.src] << std::endl;
 		}
-	}
-
-	void AssemblyGeneratorX86::genbia(Instruction& instr) {
-		if (instr.locb & 3)	{
-			asmCode << regR[instr.regb % RegistersCount] << std::endl;
-		} else {
-			asmCode  << instr.imm32 << std::endl;;
+		else {
+			asmCode << "\tsub " << regR[instr.dst] << ", " << instr.imm32 << std::endl;
 		}
 	}
 
-	void AssemblyGeneratorX86::genbia32(Instruction& instr) {
-		if (instr.locb & 3)	{
-			asmCode << regR32[instr.regb % RegistersCount] << std::endl;
+	//2.75 uOP
+	void AssemblyGeneratorX86::h_ISUB_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr);
+			asmCode << "\tsub " << regR[instr.dst] << ", qword ptr [rsi+rax]" << std::endl;
 		}
 		else {
-			asmCode << instr.imm32 << std::endl;;
+			asmCode << "\tsub " << regR[instr.dst] << ", qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
 		}
 	}
 
-	void AssemblyGeneratorX86::genbf(Instruction& instr, const char* instrx86) {
-		asmCode << "\t" << instrx86 << " xmm0, " << regF[instr.regb % RegistersCount] << std::endl;
+	//1 uOP
+	void AssemblyGeneratorX86::h_IMUL_9C(Instruction& instr, int i) {
+		asmCode << "\tlea " << regR[instr.dst] << ", [" << regR[instr.dst] << "+" << regR[instr.dst] << "*8" << std::showpos << instr.imm32 << std::noshowpos << "]" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::gencr(Instruction& instr, bool rax = true) {
-		if (instr.locc & 16) { //write to register
-			asmCode << "\tmov " << regR[instr.regc % RegistersCount] << ", " << (rax ? "rax" : "rcx") << std::endl;
-			if (trace) {
-				asmCode << "\tmov qword ptr [" << regScratchpadAddr << " + " << regIc << " * 8 + 262136], " << (rax ? "rax" : "rcx") << std::endl;
-			}
+	//1 uOP
+	void AssemblyGeneratorX86::h_IMUL_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\timul " << regR[instr.dst] << ", " << regR[instr.src] << std::endl;
 		}
-		else { //write to scratchpad
-			if (rax)
-				asmCode << "\tmov rcx, rax" << std::endl;
-			asmCode << "\tmov eax, " << regR32[instr.regc % RegistersCount] << std::endl;
-			asmCode << "\txor eax, 0" << std::hex << instr.addrc << "h" << std::dec << std::endl;
-			if (instr.locc & 15) {
-				if (instr.locc & 3) {
-					asmCode << "\tand eax, " << (ScratchpadL1 - 1) << std::endl;
-				}
-				else {
-					asmCode << "\tand eax, " << (ScratchpadL2 - 1) << std::endl;
-				}
-			}
-			else {
-				asmCode << "\tand eax, " << (ScratchpadL3 - 1) << std::endl;
-			}
-			asmCode << "\tmov qword ptr [" << regScratchpadAddr << " + rax * 8], rcx" << std::endl;
-			if (trace) {
-				asmCode << "\tmov qword ptr [" << regScratchpadAddr << " + " << regIc << " * 8 + 262136], rcx" << std::endl;
-			}
+		else {
+			asmCode << "\timul " << regR[instr.dst] << ", " << instr.imm32 << std::endl;
 		}
 	}
 
-	void AssemblyGeneratorX86::gencf(Instruction& instr, bool move = true) {
-		if(move)
-			asmCode << "\tmovaps " << regF[instr.regc % RegistersCount] << ", xmm0" << std::endl;
-		const char* store = (instr.locc & 128) ? "movhpd" : "movlpd";
-		if (instr.locc & 16) { //write to scratchpad
-			asmCode << "\tmov eax, " << regR32[instr.regc % RegistersCount] << std::endl;
-			asmCode << "\txor eax, 0" << std::hex << instr.addrc << "h" << std::dec << std::endl;
-			if (instr.locc & 15) {
-				if (instr.locc & 3) {
-					asmCode << "\tand eax, " << (ScratchpadL1 - 1) << std::endl;
-				}
-				else {
-					asmCode << "\tand eax, " << (ScratchpadL2 - 1) << std::endl;
-				}
-			}
-			else {
-				asmCode << "\tand eax, " << (ScratchpadL3 - 1) << std::endl;
-			}
-			asmCode << "\t" << store << " qword ptr [" << regScratchpadAddr << " + rax * 8], " << regF[instr.regc % RegistersCount] << std::endl;
+	//2.75 uOP
+	void AssemblyGeneratorX86::h_IMUL_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr);
+			asmCode << "\timul " << regR[instr.dst] << ", qword ptr [rsi+rax]" << std::endl;
 		}
-		if (trace) {
-			asmCode << "\t" << store << " qword ptr [" << regScratchpadAddr << " + " << regIc << " * 8 + 262136], " << regF[instr.regc % RegistersCount] << std::endl;
+		else {
+			asmCode << "\timul " << regR[instr.dst] << ", qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
 		}
 	}
 
-	void AssemblyGeneratorX86::h_ADD_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tadd rax, ";
-		genbia(instr);
-		gencr(instr);
+	//4 uOPs
+	void AssemblyGeneratorX86::h_IMULH_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\tmul " << regR[instr.src] << std::endl;
+			asmCode << "\tmov " << regR[instr.dst] << ", rdx" << std::endl;
+		}
+		else {
+			asmCode << "\tmov eax, " << instr.imm32 << std::endl;
+			asmCode << "\tmul " << regR[instr.dst] << std::endl;
+			asmCode << "\tadd " << regR[instr.dst] << ", rdx" << std::endl;
+		}
 	}
 
-	void AssemblyGeneratorX86::h_ADD_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tadd eax, ";
-		genbia32(instr);
-		gencr(instr);
+	//5.75 uOPs
+	void AssemblyGeneratorX86::h_IMULH_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr, "ecx");
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\tmul qword ptr [rsi+rcx]" << std::endl;
+		}
+		else {
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\tmul qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
+		}
+		asmCode << "\tmov " << regR[instr.dst] << ", rdx" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_SUB_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tsub rax, ";
-		genbia(instr);
-		gencr(instr);
+	//4 uOPs
+	void AssemblyGeneratorX86::h_ISMULH_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\timul " << regR[instr.src] << std::endl;
+			asmCode << "\tmov " << regR[instr.dst] << ", rdx" << std::endl;
+		}
+		else {
+			asmCode << "\tmov rax, " << instr.imm32 << std::endl;
+			asmCode << "\timul " << regR[instr.dst] << std::endl;
+			asmCode << "\tadd " << regR[instr.dst] << ", rdx" << std::endl;
+		}
 	}
 
-	void AssemblyGeneratorX86::h_SUB_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tsub eax, ";
-		genbia32(instr);
-		gencr(instr);
+	//5.75 uOPs
+	void AssemblyGeneratorX86::h_ISMULH_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr, "ecx");
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\timul qword ptr [rsi+rcx]" << std::endl;
+		}
+		else {
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			asmCode << "\timul qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
+		}
+		asmCode << "\tmov " << regR[instr.dst] << ", rdx" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_MUL_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\timul rax, ";
-		if ((instr.locb & 3) == 0) {
-			asmCode << "rax, ";
-		}
-		genbia(instr);
-		gencr(instr);
+	//1 uOP
+	void AssemblyGeneratorX86::h_INEG_R(Instruction& instr, int i) {
+		asmCode << "\tneg " << regR[instr.dst] << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_MULH_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tmov rcx, ";
-		genbia(instr);
-		asmCode << "\tmul rcx" << std::endl;
-		asmCode << "\tmov rax, rdx" << std::endl;
-		gencr(instr);
+	//1 uOP
+	void AssemblyGeneratorX86::h_IXOR_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\txor " << regR[instr.dst] << ", " << regR[instr.src] << std::endl;
+		}
+		else {
+			asmCode << "\txor " << regR[instr.dst] << ", " << instr.imm32 << std::endl;
+		}
 	}
 
-	void AssemblyGeneratorX86::h_MUL_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tmov ecx, eax" << std::endl;
-		asmCode << "\tmov eax, ";
-		genbia32(instr);
-		asmCode << "\timul rax, rcx" << std::endl;
-		gencr(instr);
+	//2.75 uOP
+	void AssemblyGeneratorX86::h_IXOR_M(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			genAddressReg(instr);
+			asmCode << "\txor " << regR[instr.dst] << ", qword ptr [rsi+rax]" << std::endl;
+		}
+		else {
+			asmCode << "\txor " << regR[instr.dst] << ", qword ptr [rsi+" << genAddressImm(instr) << "]" << std::endl;
+		}
 	}
 
-	void AssemblyGeneratorX86::h_IMUL_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tmovsxd rcx, eax" << std::endl;
-		if ((instr.locb & 3) == 0) {
-			asmCode << "\tmov rax, " << instr.imm32 << std::endl;
+	//1.75 uOPs
+	void AssemblyGeneratorX86::h_IROR_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tmov ecx, " << regR32[instr.src] << std::endl;
+			asmCode << "\tror " << regR[instr.dst] << ", cl" << std::endl;
 		}
 		else {
-			asmCode << "\tmovsxd rax, " << regR32[instr.regb % RegistersCount] << std::endl;
+			asmCode << "\tror " << regR[instr.dst] << ", " << (instr.imm32 & 63) << std::endl;
 		}
-		asmCode << "\timul rax, rcx" << std::endl;
-		gencr(instr);
 	}
 
-	void AssemblyGeneratorX86::h_IMULH_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tmov rcx, ";
-		genbia(instr);
-		asmCode << "\timul rcx" << std::endl;
-		asmCode << "\tmov rax, rdx" << std::endl;
-		gencr(instr);
+	//1.75 uOPs
+	void AssemblyGeneratorX86::h_IROL_R(Instruction& instr, int i) {
+		if (instr.src != instr.dst) {
+			asmCode << "\tmov ecx, " << regR32[instr.src] << std::endl;
+			asmCode << "\trol " << regR[instr.dst] << ", cl" << std::endl;
+		}
+		else {
+			asmCode << "\trol " << regR[instr.dst] << ", " << (instr.imm32 & 63) << std::endl;
+		}
 	}
 
-	void AssemblyGeneratorX86::h_DIV_64(Instruction& instr, int i) {
-		genar(instr, i);
-		if (instr.locb & 3) {
-#ifdef MAGIC_DIVISION
-			if (instr.imm32 != 0) {
-				uint32_t divisor = instr.imm32;
-				asmCode << "\t; magic divide by " << divisor << std::endl;
-				if (divisor & (divisor - 1)) {
-					magicu_info mi = compute_unsigned_magic_info(divisor, sizeof(uint64_t) * 8);
+	//~6 uOPs
+	void AssemblyGeneratorX86::h_IDIV_C(Instruction& instr, int i) {
+		if (instr.imm32 != 0) {
+			uint32_t divisor = instr.imm32;
+			if (divisor & (divisor - 1)) {
+				magicu_info mi = compute_unsigned_magic_info(divisor, sizeof(uint64_t) * 8);
+				if (mi.pre_shift == 0 && !mi.increment) {
+					asmCode << "\tmov rax, " << mi.multiplier << std::endl;
+					asmCode << "\tmul " << regR[instr.dst] << std::endl;
+				}
+				else {
+					asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
 					if (mi.pre_shift > 0)
 						asmCode << "\tshr rax, " << mi.pre_shift << std::endl;
 					if (mi.increment) {
@@ -277,326 +276,249 @@ namespace RandomX {
 					}
 					asmCode << "\tmov rcx, " << mi.multiplier << std::endl;
 					asmCode << "\tmul rcx" << std::endl;
-					asmCode << "\tmov rax, rdx" << std::endl;
-					if (mi.post_shift > 0)
-						asmCode << "\tshr rax, " << mi.post_shift << std::endl;
-				}
-				else { //divisor is a power of two
-					int shift = 0;
-					while (divisor >>= 1)
-						++shift;
-					if(shift > 0)
-						asmCode << "\tshr rax, " << shift << std::endl;
 				}
+				if (mi.post_shift > 0)
+					asmCode << "\tshr rdx, " << mi.post_shift << std::endl;
+				asmCode << "\tadd " << regR[instr.dst] << ", rdx" << std::endl;
 			}
-#else
-			if (instr.imm32 == 0) {
-				asmCode << "\tmov ecx, 1" << std::endl;
-			}
-			else {
-				asmCode << "\tmov ecx, " << instr.imm32 << std::endl;
-			}
-#endif
-		}
-		else {
-			asmCode << "\tmov ecx, 1" << std::endl;
-			asmCode << "\tmov edx, " << regR32[instr.regb % RegistersCount] << std::endl;
-			asmCode << "\ttest edx, edx" << std::endl;
-			asmCode << "\tcmovne ecx, edx" << std::endl;
-#ifdef MAGIC_DIVISION
-			asmCode << "\txor edx, edx" << std::endl;
-			asmCode << "\tdiv rcx" << std::endl;
-#endif
-		}
-#ifndef MAGIC_DIVISION
-		asmCode << "\txor edx, edx" << std::endl;
-		asmCode << "\tdiv rcx" << std::endl;
-#endif
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_IDIV_64(Instruction& instr, int i) {
-		genar(instr, i);
-		if (instr.locb & 3) {
-#ifdef MAGIC_DIVISION
-			int64_t divisor = instr.imm32;
-			asmCode << "\t; magic divide by " << divisor << std::endl;
-			if ((divisor & -divisor) == divisor || (divisor & -divisor) == -divisor) {
-				// +/- power of two
-				bool negative = divisor < 0;
-				if (negative)
-					divisor = -divisor;
+			else { //divisor is a power of two
 				int shift = 0;
-				uint64_t unsignedDivisor = divisor;
-				while (unsignedDivisor >>= 1)
+				while (divisor >>= 1)
 					++shift;
-				if (shift > 0) {
-					asmCode << "\tmov rcx, rax" << std::endl;
-					asmCode << "\tsar rcx, 63" << std::endl;
-					uint32_t mask = (1ULL << shift) + 0xFFFFFFFF;
-					asmCode << "\tand ecx, 0" << std::hex << mask << std::dec << "h" << std::endl;
-					asmCode << "\tadd rax, rcx" << std::endl;
-					asmCode << "\tsar rax, " << shift << std::endl;
-				}
-				if (negative)
-					asmCode << "\tneg rax" << std::endl;
+				if(shift > 0)
+					asmCode << "\tshr " << regR[instr.dst] << ", " << shift << std::endl;
 			}
-			else if (divisor != 0) {
-				magics_info mi = compute_signed_magic_info(divisor);
-				if ((divisor >= 0) != (mi.multiplier >= 0))
-					asmCode << "\tmov rcx, rax" << std::endl;
-				asmCode << "\tmov rdx, " << mi.multiplier << std::endl;
-				asmCode << "\timul rdx" << std::endl;
-				asmCode << "\tmov rax, rdx" << std::endl;
-				asmCode << "\txor edx, edx" << std::endl;
-				bool haveSF = false;
-				if (divisor > 0 && mi.multiplier < 0) {
-					asmCode << "\tadd rax, rcx" << std::endl;
-					haveSF = true;
-				}
-				if (divisor < 0 && mi.multiplier > 0) {
-					asmCode << "\tsub rax, rcx" << std::endl;
-					haveSF = true;
-				}
-				if (mi.shift > 0) {
-					asmCode << "\tsar rax, " << mi.shift << std::endl;
-					haveSF = true;
-				}
-				if (!haveSF)
-					asmCode << "\ttest rax, rax" << std::endl;
-				asmCode << "\tsets dl" << std::endl;
-				asmCode << "\tadd rax, rdx" << std::endl;
+		}	
+	}
+
+	//~8.5 uOPs
+	void AssemblyGeneratorX86::h_ISDIV_C(Instruction& instr, int i) {
+		int64_t divisor = instr.imm32;
+		if ((divisor & -divisor) == divisor || (divisor & -divisor) == -divisor) {
+			asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+			// +/- power of two
+			bool negative = divisor < 0;
+			if (negative)
+				divisor = -divisor;
+			int shift = 0;
+			uint64_t unsignedDivisor = divisor;
+			while (unsignedDivisor >>= 1)
+				++shift;
+			if (shift > 0) {
+				asmCode << "\tmov rcx, rax" << std::endl;
+				asmCode << "\tsar rcx, 63" << std::endl;
+				uint32_t mask = (1ULL << shift) + 0xFFFFFFFF;
+				asmCode << "\tand ecx, 0" << std::hex << mask << std::dec << "h" << std::endl;
+				asmCode << "\tadd rax, rcx" << std::endl;
+				asmCode << "\tsar rax, " << shift << std::endl;
 			}
-#else
-			asmCode << "\tmov edx, " << instr.imm32 << std::endl;
-#endif
+			if (negative)
+				asmCode << "\tneg rax" << std::endl;
+			asmCode << "\tadd " << regR[instr.dst] << ", rax" << std::endl;
 		}
-		else {
-			asmCode << "\tmov edx, " << regR32[instr.regb % RegistersCount] << std::endl;
-#ifndef MAGIC_DIVISION
+		else if (divisor != 0) {
+			magics_info mi = compute_signed_magic_info(divisor);
+			asmCode << "\tmov rax, " << mi.multiplier << std::endl;
+			asmCode << "\timul " << regR[instr.dst] << std::endl;
+			//asmCode << "\tmov rax, rdx" << std::endl;
+			asmCode << "\txor eax, eax" << std::endl;
+			bool haveSF = false;
+			if (divisor > 0 && mi.multiplier < 0) {
+				asmCode << "\tadd rdx, " << regR[instr.dst] << std::endl;
+				haveSF = true;
+			}
+			if (divisor < 0 && mi.multiplier > 0) {
+				asmCode << "\tsub rdx, " << regR[instr.dst] << std::endl;
+				haveSF = true;
+			}
+			if (mi.shift > 0) {
+				asmCode << "\tsar rdx, " << mi.shift << std::endl;
+				haveSF = true;
+			}
+			if (!haveSF)
+				asmCode << "\ttest rdx, rdx" << std::endl;
+			asmCode << "\tsets al" << std::endl;
+			asmCode << "\tadd rdx, rax" << std::endl;
+			asmCode << "\tadd " << regR[instr.dst] << ", rdx" << std::endl;
 		}
-#endif
-			asmCode << "\tcmp edx, -1" << std::endl;
-			asmCode << "\tjne short body_idiv_" << i << std::endl;
-			asmCode << "\tneg rax" << std::endl;
-			asmCode << "\tjmp short result_idiv_" << i << std::endl;
-			asmCode << "body_idiv_" << i << ":" << std::endl;
-			asmCode << "\tmov ecx, 1" << std::endl;
-			asmCode << "\ttest edx, edx" << std::endl;
-			asmCode << "\tcmovne ecx, edx" << std::endl;
-			asmCode << "\tmovsxd rcx, ecx" << std::endl;
-			asmCode << "\tcqo" << std::endl;
-			asmCode << "\tidiv rcx" << std::endl;
-			asmCode << "result_idiv_" << i << ":" << std::endl;
-#ifdef MAGIC_DIVISION
-	}
-#endif
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_AND_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tand rax, ";
-		genbia(instr);
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_AND_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tand eax, ";
-		genbia32(instr);
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_OR_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tor rax, ";
-		genbia(instr);
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_OR_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tor eax, ";
-		genbia32(instr);
-		gencr(instr);
-	}
-
-	void AssemblyGeneratorX86::h_XOR_64(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\txor rax, ";
-		genbia(instr);
-		gencr(instr);
 	}
 
-	void AssemblyGeneratorX86::h_XOR_32(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\txor eax, ";
-		genbia32(instr);
-		gencr(instr);
+	//1 uOPs
+	void AssemblyGeneratorX86::h_FPSWAP_R(Instruction& instr, int i) {
+		asmCode << "\tshufpd " << regFE[instr.dst] << ", " << regFE[instr.dst] << ", 1" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_SHL_64(Instruction& instr, int i) {
-		genar(instr, i);
-		genbiashift(instr, "shl");
-		gencr(instr);
+	//1 uOP
+	void AssemblyGeneratorX86::h_FPADD_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		instr.src %= 4;
+		asmCode << "\taddpd " << regF[instr.dst] << ", " << regA[instr.src] << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_SHR_64(Instruction& instr, int i) {
-		genar(instr, i);
-		genbiashift(instr, "shr");
-		gencr(instr);
+	//5 uOPs
+	void AssemblyGeneratorX86::h_FPADD_M(Instruction& instr, int i) {
+		instr.dst %= 4;
+		genAddressReg(instr);
+		asmCode << "\tcvtdq2pd xmm12, qword ptr [rsi+rax]" << std::endl;
+		asmCode << "\taddpd " << regF[instr.dst] << ", xmm12" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_SAR_64(Instruction& instr, int i) {
-		genar(instr, i);
-		genbiashift(instr, "sar");
-		gencr(instr);
+	//1 uOP
+	void AssemblyGeneratorX86::h_FPSUB_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		instr.src %= 4;
+		asmCode << "\tsubpd " << regF[instr.dst] << ", " << regA[instr.src] << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_ROL_64(Instruction& instr, int i) {
-		genar(instr, i);
-		genbiashift(instr, "rol");
-		gencr(instr);
+	//5 uOPs
+	void AssemblyGeneratorX86::h_FPSUB_M(Instruction& instr, int i) {
+		instr.dst %= 4;
+		genAddressReg(instr);
+		asmCode << "\tcvtdq2pd xmm12, qword ptr [rsi+rax]" << std::endl;
+		asmCode << "\tsubpd " << regF[instr.dst] << ", xmm12" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_ROR_64(Instruction& instr, int i) {
-		genar(instr, i);
-		genbiashift(instr, "ror");
-		gencr(instr);
+	//1 uOP
+	void AssemblyGeneratorX86::h_FPNEG_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		asmCode << "\txorps " << regF[instr.dst] << ", " << signMask << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_FPADD(Instruction& instr, int i) {
-		genaf(instr, i);
-		genbf(instr, "addpd");
-		gencf(instr);
+	//1 uOPs
+	void AssemblyGeneratorX86::h_FPMUL_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		instr.src %= 4;
+		asmCode << "\tmulpd " << regE[instr.dst] << ", " << regA[instr.src] << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_FPSUB(Instruction& instr, int i) {
-		genaf(instr, i);
-		genbf(instr, "subpd");
-		gencf(instr);
+	//6 uOPs
+	void AssemblyGeneratorX86::h_FPMUL_M(Instruction& instr, int i) {
+		instr.dst %= 4;
+		genAddressReg(instr);
+		asmCode << "\tcvtdq2pd xmm12, qword ptr [rsi+rax]" << std::endl;
+		asmCode << "\tmulpd " << regE[instr.dst] << ", xmm12" << std::endl;
+		asmCode << "\tmaxpd " << regE[instr.dst] << ", " << dblMin << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_FPMUL(Instruction& instr, int i) {
-		genaf(instr, i);
-		genbf(instr, "mulpd");
-		asmCode << "\tmovaps xmm1, xmm0" << std::endl;
-		asmCode << "\tcmpeqpd xmm1, xmm1" << std::endl;
-		asmCode << "\tandps xmm0, xmm1" << std::endl;
-		gencf(instr);
+	//2 uOPs
+	void AssemblyGeneratorX86::h_FPDIV_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		instr.src %= 4;
+		asmCode << "\tdivpd " << regE[instr.dst] << ", " << regA[instr.src] << std::endl;
+		asmCode << "\tmaxpd " << regE[instr.dst] << ", " << dblMin << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_FPDIV(Instruction& instr, int i) {
-		genaf(instr, i);
-		genbf(instr, "divpd");
-		asmCode << "\tmovaps xmm1, xmm0" << std::endl;
-		asmCode << "\tcmpeqpd xmm1, xmm1" << std::endl;
-		asmCode << "\tandps xmm0, xmm1" << std::endl;
-		gencf(instr);
+	//6 uOPs
+	void AssemblyGeneratorX86::h_FPDIV_M(Instruction& instr, int i) {
+		instr.dst %= 4;
+		genAddressReg(instr);
+		asmCode << "\tcvtdq2pd xmm12, qword ptr [rsi+rax]" << std::endl;
+		asmCode << "\tdivpd " << regE[instr.dst] << ", xmm12" << std::endl;
+		asmCode << "\tmaxpd " << regE[instr.dst] << ", " << dblMin << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_FPSQRT(Instruction& instr, int i) {
-		genaf(instr, i);
-		asmCode << "\tandps xmm0, xmm10" << std::endl;
-		asmCode << "\tsqrtpd " << regF[instr.regc % RegistersCount] << ", xmm0" << std::endl;
-		gencf(instr, false);
-	}
+	//1 uOP
+	void AssemblyGeneratorX86::h_FPSQRT_R(Instruction& instr, int i) {
+		instr.dst %= 4;
+		asmCode << "\tsqrtpd " << regE[instr.dst] << ", " << regE[instr.dst] << std::endl;
+	}	
 
-	void AssemblyGeneratorX86::h_FPROUND(Instruction& instr, int i) {
-		genar(instr, i);
-		asmCode << "\tmov rcx, rax" << std::endl;
-		int rotate = (13 - (instr.imm8 & 63)) & 63;
+	//6 uOPs
+	void AssemblyGeneratorX86::h_CFROUND(Instruction& instr, int i) {
+		asmCode << "\tmov rax, " << regR[instr.dst] << std::endl;
+		int rotate = (13 - (instr.alt & 63)) & 63;
 		if (rotate != 0)
 			asmCode << "\trol rax, " << rotate << std::endl;
 		asmCode << "\tand eax, 24576" << std::endl;
 		asmCode << "\tor eax, 40896" << std::endl;
-		asmCode << "\tmov dword ptr [rsp - 8], eax" << std::endl;
-		asmCode << "\tldmxcsr dword ptr [rsp - 8]" << std::endl;
-		gencr(instr, false);
+		asmCode << "\tmov dword ptr [rsp-8], eax" << std::endl;
+		asmCode << "\tldmxcsr dword ptr [rsp-8]" << std::endl;
 	}
 
-	static inline const char* jumpCondition(Instruction& instr, bool invert = false) {
-		switch ((instr.locb & 7) ^ invert)
+	static inline const char* condition(Instruction& instr, bool invert = false) {
+		switch (((instr.alt >> 2) & 7) ^ invert)
 		{
 			case 0:
-				return "jbe";
+				return "be";
 			case 1:
-				return "ja";
+				return "a";
 			case 2:
-				return "js";
+				return "s";
 			case 3:
-				return "jns";
+				return "ns";
 			case 4:
-				return "jo";
+				return "o";
 			case 5:
-				return "jno";
+				return "no";
 			case 6:
-				return "jl";
+				return "l";
 			case 7:
-				return "jge";
+				return "ge";
 		}
 	}
 
-	void AssemblyGeneratorX86::h_JUMP(Instruction& instr, int i) {
-		genar(instr, i);
-		gencr(instr);
-		asmCode << "\tcmp " << regR32[instr.regb % RegistersCount] << ", " << instr.imm32 << std::endl;
-		asmCode << "\t" << jumpCondition(instr);
-		asmCode << " rx_i_" << wrapInstr(i + (instr.imm8 & 127) + 2) << std::endl;
-	}
-
-	void AssemblyGeneratorX86::h_CALL(Instruction& instr, int i) {
-		genar(instr, i);
-		gencr(instr);
-		asmCode << "\tcmp " << regR32[instr.regb % RegistersCount] << ", " << instr.imm32 << std::endl;
-		asmCode << "\t" << jumpCondition(instr, true);
-		asmCode << " short rx_i_" << wrapInstr(i + 1) << std::endl;
-		asmCode << "\tcall rx_i_" << wrapInstr(i + (instr.imm8 & 127) + 2) << std::endl;
+	//4 uOPs
+	void AssemblyGeneratorX86::h_COND_R(Instruction& instr, int i) {
+		asmCode << "\txor ecx, ecx" << std::endl;
+		asmCode << "\tcmp " << regR32[instr.src] << ", " << instr.imm32 << std::endl;
+		asmCode << "\tset" << condition(instr) << " cl" << std::endl;
+		asmCode << "\tadd " << regR[instr.dst] << ", rcx" << std::endl;
 	}
 
-	void AssemblyGeneratorX86::h_RET(Instruction& instr, int i) {
-		genar(instr, i);
-		gencr(instr);
-		asmCode << "\tcmp rsp, " << regStackBeginAddr << std::endl;
-		asmCode << "\tje short rx_i_" << wrapInstr(i + 1) << std::endl;
-		asmCode << "\tret" << std::endl;
+	//6 uOPs
+	void AssemblyGeneratorX86::h_COND_M(Instruction& instr, int i) {
+		asmCode << "\txor ecx, ecx" << std::endl;
+		genAddressReg(instr);
+		asmCode << "\tcmp dword ptr [rsi+rax], " << instr.imm32 << std::endl;
+		asmCode << "\tset" << condition(instr) << " cl" << std::endl;
+		asmCode << "\tadd " << regR[instr.dst] << ", rcx" << std::endl;
 	}
 
 #include "instructionWeights.hpp"
 #define INST_HANDLE(x) REPN(&AssemblyGeneratorX86::h_##x, WT(x))
 
 	InstructionGenerator AssemblyGeneratorX86::engine[256] = {
-		INST_HANDLE(ADD_64)
-		INST_HANDLE(ADD_32)
-		INST_HANDLE(SUB_64)
-		INST_HANDLE(SUB_32)
-		INST_HANDLE(MUL_64)
-		INST_HANDLE(MULH_64)
-		INST_HANDLE(MUL_32)
-		INST_HANDLE(IMUL_32)
-		INST_HANDLE(IMULH_64)
-		INST_HANDLE(DIV_64)
-		INST_HANDLE(IDIV_64)
-		INST_HANDLE(AND_64)
-		INST_HANDLE(AND_32)
-		INST_HANDLE(OR_64)
-		INST_HANDLE(OR_32)
-		INST_HANDLE(XOR_64)
-		INST_HANDLE(XOR_32)
-		INST_HANDLE(SHL_64)
-		INST_HANDLE(SHR_64)
-		INST_HANDLE(SAR_64)
-		INST_HANDLE(ROL_64)
-		INST_HANDLE(ROR_64)
-		INST_HANDLE(FPADD)
-		INST_HANDLE(FPSUB)
-		INST_HANDLE(FPMUL)
-		INST_HANDLE(FPDIV)
-		INST_HANDLE(FPSQRT)
-		INST_HANDLE(FPROUND)
-		INST_HANDLE(JUMP)
-		INST_HANDLE(CALL)
-		INST_HANDLE(RET)
+		//Integer
+		INST_HANDLE(IADD_R)
+		INST_HANDLE(IADD_M)
+		INST_HANDLE(IADD_RC)
+		INST_HANDLE(ISUB_R)
+		INST_HANDLE(ISUB_M)
+		INST_HANDLE(IMUL_9C)
+		INST_HANDLE(IMUL_R)
+		INST_HANDLE(IMUL_M)
+		INST_HANDLE(IMULH_R)
+		INST_HANDLE(IMULH_M)
+		INST_HANDLE(ISMULH_R)
+		INST_HANDLE(ISMULH_M)
+		INST_HANDLE(IDIV_C)
+		INST_HANDLE(ISDIV_C)
+		INST_HANDLE(INEG_R)
+		INST_HANDLE(IXOR_R)
+		INST_HANDLE(IXOR_M)
+		INST_HANDLE(IROR_R)
+		INST_HANDLE(IROL_R)
+
+		//Common floating point
+		INST_HANDLE(FPSWAP_R)
+
+		//Floating point group F
+		INST_HANDLE(FPADD_R)
+		INST_HANDLE(FPADD_M)
+		INST_HANDLE(FPSUB_R)
+		INST_HANDLE(FPSUB_M)
+		INST_HANDLE(FPNEG_R)
+
+		//Floating point group E
+		INST_HANDLE(FPMUL_R)
+		INST_HANDLE(FPMUL_M)
+		INST_HANDLE(FPDIV_R)
+		INST_HANDLE(FPDIV_M)
+		INST_HANDLE(FPSQRT_R)
+
+		//Control
+		INST_HANDLE(COND_R)
+		INST_HANDLE(COND_M)
+		INST_HANDLE(CFROUND)
 	};
 }

+ 35 - 31
src/AssemblyGeneratorX86.hpp

@@ -47,39 +47,43 @@ namespace RandomX {
 		void genbf(Instruction&, const char*);
 		void gencr(Instruction&, bool);
 		void gencf(Instruction&, bool);
+		void genAddressReg(Instruction&, const char*);
+		int32_t genAddressImm(Instruction&);
 
 		void generateCode(Instruction&, int);
 
-		void h_ADD_64(Instruction&, int);
-		void h_ADD_32(Instruction&, int);
-		void h_SUB_64(Instruction&, int);
-		void h_SUB_32(Instruction&, int);
-		void h_MUL_64(Instruction&, int);
-		void h_MULH_64(Instruction&, int);
-		void h_MUL_32(Instruction&, int);
-		void h_IMUL_32(Instruction&, int);
-		void h_IMULH_64(Instruction&, int);
-		void h_DIV_64(Instruction&, int);
-		void h_IDIV_64(Instruction&, int);
-		void h_AND_64(Instruction&, int);
-		void h_AND_32(Instruction&, int);
-		void h_OR_64(Instruction&, int);
-		void h_OR_32(Instruction&, int);
-		void h_XOR_64(Instruction&, int);
-		void h_XOR_32(Instruction&, int);
-		void h_SHL_64(Instruction&, int);
-		void h_SHR_64(Instruction&, int);
-		void h_SAR_64(Instruction&, int);
-		void h_ROL_64(Instruction&, int);
-		void h_ROR_64(Instruction&, int);
-		void h_FPADD(Instruction&, int);
-		void h_FPSUB(Instruction&, int);
-		void h_FPMUL(Instruction&, int);
-		void h_FPDIV(Instruction&, int);
-		void h_FPSQRT(Instruction&, int);
-		void h_FPROUND(Instruction&, int);
-		void h_JUMP(Instruction&, int);
-		void h_CALL(Instruction&, int);
-		void h_RET(Instruction&, int);
+		void  h_IADD_R(Instruction&, int);
+		void  h_IADD_M(Instruction&, int);
+		void  h_IADD_RC(Instruction&, int);
+		void  h_ISUB_R(Instruction&, int);
+		void  h_ISUB_M(Instruction&, int);
+		void  h_IMUL_9C(Instruction&, int);
+		void  h_IMUL_R(Instruction&, int);
+		void  h_IMUL_M(Instruction&, int);
+		void  h_IMULH_R(Instruction&, int);
+		void  h_IMULH_M(Instruction&, int);
+		void  h_ISMULH_R(Instruction&, int);
+		void  h_ISMULH_M(Instruction&, int);
+		void  h_IDIV_C(Instruction&, int);
+		void  h_ISDIV_C(Instruction&, int);
+		void  h_INEG_R(Instruction&, int);
+		void  h_IXOR_R(Instruction&, int);
+		void  h_IXOR_M(Instruction&, int);
+		void  h_IROR_R(Instruction&, int);
+		void  h_IROL_R(Instruction&, int);
+		void  h_FPSWAP_R(Instruction&, int);
+		void  h_FPADD_R(Instruction&, int);
+		void  h_FPADD_M(Instruction&, int);
+		void  h_FPSUB_R(Instruction&, int);
+		void  h_FPSUB_M(Instruction&, int);
+		void  h_FPNEG_R(Instruction&, int);
+		void  h_FPMUL_R(Instruction&, int);
+		void  h_FPMUL_M(Instruction&, int);
+		void  h_FPDIV_R(Instruction&, int);
+		void  h_FPDIV_M(Instruction&, int);
+		void  h_FPSQRT_R(Instruction&, int);
+		void  h_COND_R(Instruction&, int);
+		void  h_COND_M(Instruction&, int);
+		void  h_CFROUND(Instruction&, int);
 	};
 }

+ 26 - 3
src/CompiledVirtualMachine.cpp

@@ -25,6 +25,12 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 
 namespace RandomX {
 
+	constexpr int mantissaSize = 52;
+	constexpr int exponentSize = 11;
+	constexpr uint64_t mantissaMask = (1ULL << mantissaSize) - 1;
+	constexpr uint64_t exponentMask = (1ULL << exponentSize) - 1;
+	constexpr int exponentBias = 1023;
+
 	CompiledVirtualMachine::CompiledVirtualMachine() {
 		totalSize = 0;
 	}
@@ -37,25 +43,42 @@ namespace RandomX {
 		memcpy(scratchpad, mem.ds.dataset + ScratchpadSize * index, ScratchpadSize);
 	}
 
+	static uint64_t getSmallPositiveFloatBits(uint64_t entropy) {
+		auto exponent = entropy >> 60; //0..15
+		auto mantissa = entropy & mantissaMask;
+		exponent += exponentBias;
+		exponent &= exponentMask;
+		exponent <<= mantissaSize;
+		return exponent | mantissa;
+	}
+
 	void CompiledVirtualMachine::initializeProgram(const void* seed) {
 		Pcg32 gen(seed);
 		for (unsigned i = 0; i < sizeof(reg) / sizeof(Pcg32::result_type); ++i) {
 			*(((uint32_t*)&reg) + i) = gen();
 		}
 		FPINIT();
-		for (int i = 0; i < RegistersCount; ++i) {
+		/*for (int i = 0; i < RegistersCount / 2; ++i) {
 			reg.f[i].lo.f64 = (double)reg.f[i].lo.i64;
 			reg.f[i].hi.f64 = (double)reg.f[i].hi.i64;
 		}
+		for (int i = 0; i < RegistersCount / 2; ++i) {
+			reg.g[i].lo.f64 = std::abs((double)reg.g[i].lo.i64);
+			reg.g[i].hi.f64 = std::abs((double)reg.g[i].hi.i64);
+		}*/
+		for (int i = 0; i < RegistersCount / 2; ++i) {
+			reg.a[i].lo.u64 = getSmallPositiveFloatBits(reg.f[i].lo.u64);
+			reg.a[i].hi.u64 = getSmallPositiveFloatBits(reg.f[i].hi.u64);
+		}
 		compiler.generateProgram(gen);
 		mem.ma = (gen() ^ *(((uint32_t*)seed) + 4)) & ~7;
 		mem.mx = *(((uint32_t*)seed) + 5);
 	}
 
 	void CompiledVirtualMachine::execute() {
-		//executeProgram(reg, mem, scratchpad, readDataset);
+		executeProgram(reg, mem, scratchpad, InstructionCount);
 		totalSize += compiler.getCodeSize();
-		compiler.getProgramFunc()(reg, mem, scratchpad);
+		//compiler.getProgramFunc()(reg, mem, scratchpad);
 #ifdef TRACEVM
 		for (int32_t i = InstructionCount - 1; i >= 0; --i) {
 			std::cout << std::hex << tracepad[i].u64 << std::endl;

+ 375 - 38
src/Instruction.cpp

@@ -18,54 +18,391 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 */
 
 #include "Instruction.hpp"
+#include "common.hpp"
 
 namespace RandomX {
 
 	void Instruction::print(std::ostream& os) const {
-			os << "  A: loc = " << std::dec << (loca & 7) << ", reg: " << (rega & 7) << std::endl;
-			os << "  B: loc = " << (locb & 7) << ", reg: " << (regb & 7) << std::endl;
-			os << "  C: loc = " << (locc & 7) << ", reg: " << (regc & 7) << std::endl;
-			os << "  addra = " << std::hex << addra << std::endl;
-			os << "  addrc = " << addrc << std::endl;
-			os << "  imm8 = " << std::dec << (int)imm8 << std::endl;
-			os << "  imm32 = " << imm32 << std::endl;
+		os << names[opcode] << " ";
+		auto handler = engine[opcode];
+		(this->*handler)(os);
+	}
+
+	void Instruction::genAddressReg(std::ostream& os) const {
+		os << ((alt % 4) ? "L1" : "L2") << "[r" << (int)src << "]";
+	}
+
+	void Instruction::genAddressImm(std::ostream& os) const {
+		os << ((alt % 4) ? "L1" : "L2") << "[" << (imm32 & ((alt % 4) ? ScratchpadL1Mask : ScratchpadL2Mask)) << "]";
+	}
+
+	void Instruction::h_IADD_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
+		}
+	}
+
+	void Instruction::h_IADD_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_IADD_RC(std::ostream& os) const {
+		os << "r" << (int)dst << ", r" << (int)src << ", " << imm32 << std::endl;
+	}
+
+	//1 uOP
+	void Instruction::h_ISUB_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
+		}
+	}
+
+	void Instruction::h_ISUB_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_IMUL_9C(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << imm32 << std::endl;
+	}
+
+	void Instruction::h_IMUL_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
+		}
+	}
+
+	void Instruction::h_IMUL_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_IMULH_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
+		}
+	}
+
+	void Instruction::h_IMULH_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_ISMULH_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
+		}
+	}
+
+	void Instruction::h_ISMULH_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_INEG_R(std::ostream& os) const {
+		os << "r" << (int)dst << std::endl;
+	}
+
+	void Instruction::h_IXOR_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << imm32 << std::endl;
 		}
+	}
+
+	void Instruction::h_IXOR_M(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", ";
+			genAddressReg(os);
+			os << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", ";
+			genAddressImm(os);
+			os << std::endl;
+		}
+	}
+
+	void Instruction::h_IROR_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << (imm32 & 63) << std::endl;
+		}
+	}
+
+	void Instruction::h_IROL_R(std::ostream& os) const {
+		if (src != dst) {
+			os << "r" << (int)dst << ", r" << (int)src << std::endl;
+		}
+		else {
+			os << "r" << (int)dst << ", " << (imm32 & 63) << std::endl;
+		}
+	}
+
+	void Instruction::h_IDIV_C(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << (uint32_t)imm32 << std::endl;
+	}
+
+	void Instruction::h_ISDIV_C(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << imm32 << std::endl;
+	}
+
+	void Instruction::h_FPSWAP_R(std::ostream& os) const {
+		const char reg = (dst >= 4) ? 'e' : 'f';
+		auto dstIndex = dst % 4;
+		os << reg << dstIndex << std::endl;
+	}
+
+	void Instruction::h_FPADD_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		auto srcIndex = src % 4;
+		os << "f" << dstIndex << ", a" << srcIndex << std::endl;
+	}
+
+	void Instruction::h_FPADD_M(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "f" << dstIndex << ", ";
+		genAddressReg(os);
+		os << std::endl;
+	}
+
+	void Instruction::h_FPSUB_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		auto srcIndex = src % 4;
+		os << "f" << dstIndex << ", a" << srcIndex << std::endl;
+	}
+
+	void Instruction::h_FPSUB_M(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "f" << dstIndex << ", ";
+		genAddressReg(os);
+		os << std::endl;
+	}
+
+	void Instruction::h_FPNEG_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "f" << dstIndex << std::endl;
+	}
+
+	void Instruction::h_FPMUL_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		auto srcIndex = src % 4;
+		os << "e" << dstIndex << ", a" << srcIndex << std::endl;
+	}
+
+	void Instruction::h_FPMUL_M(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "e" << dstIndex << ", ";
+		genAddressReg(os);
+		os << std::endl;
+	}
+
+	void Instruction::h_FPDIV_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		auto srcIndex = src % 4;
+		os << "e" << dstIndex << ", a" << srcIndex << std::endl;
+	}
+
+	void Instruction::h_FPDIV_M(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "e" << dstIndex << ", ";
+		genAddressReg(os);
+		os << std::endl;
+	}
+
+	void Instruction::h_FPSQRT_R(std::ostream& os) const {
+		auto dstIndex = dst % 4;
+		os << "e" << dstIndex << std::endl;
+	}
+
+	void Instruction::h_CFROUND(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << (alt & 63) << std::endl;
+	}
+
+	static inline const char* condition(int index) {
+		switch (index)
+		{
+		case 0:
+			return "be";
+		case 1:
+			return "ab";
+		case 2:
+			return "sg";
+		case 3:
+			return "ns";
+		case 4:
+			return "of";
+		case 5:
+			return "no";
+		case 6:
+			return "lt";
+		case 7:
+			return "ge";
+		}
+	}
+
+	void Instruction::h_COND_R(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << condition((alt >> 2) & 7) << "(r" << (int)src << ", " << imm32 << ")" << std::endl;
+	}
+
+	void Instruction::h_COND_M(std::ostream& os) const {
+		os << "r" << (int)dst << ", " << condition((alt >> 2) & 7) << "(";
+		genAddressReg(os);
+		os << ", " << imm32 << ")" << std::endl;
+	}
 
 #include "instructionWeights.hpp"
 #define INST_NAME(x) REPN(#x, WT(x))
+#define INST_HANDLE(x) REPN(&Instruction::h_##x, WT(x))
 
 	const char* Instruction::names[256] = {
-		INST_NAME(ADD_64)
-		INST_NAME(ADD_32)
-		INST_NAME(SUB_64)
-		INST_NAME(SUB_32)
-		INST_NAME(MUL_64)
-		INST_NAME(MULH_64)
-		INST_NAME(MUL_32)
-		INST_NAME(IMUL_32)
-		INST_NAME(IMULH_64)
-		INST_NAME(DIV_64)
-		INST_NAME(IDIV_64)
-		INST_NAME(AND_64)
-		INST_NAME(AND_32)
-		INST_NAME(OR_64)
-		INST_NAME(OR_32)
-		INST_NAME(XOR_64)
-		INST_NAME(XOR_32)
-		INST_NAME(SHL_64)
-		INST_NAME(SHR_64)
-		INST_NAME(SAR_64)
-		INST_NAME(ROL_64)
-		INST_NAME(ROR_64)
-		INST_NAME(FPADD)
-		INST_NAME(FPSUB)
-		INST_NAME(FPMUL)
-		INST_NAME(FPDIV)
-		INST_NAME(FPSQRT)
-		INST_NAME(FPROUND)
-		INST_NAME(JUMP)
-		INST_NAME(CALL)
-		INST_NAME(RET)
+		//Integer
+		INST_NAME(IADD_R)
+		INST_NAME(IADD_M)
+		INST_NAME(IADD_RC)
+		INST_NAME(ISUB_R)
+		INST_NAME(ISUB_M)
+		INST_NAME(IMUL_9C)
+		INST_NAME(IMUL_R)
+		INST_NAME(IMUL_M)
+		INST_NAME(IMULH_R)
+		INST_NAME(IMULH_M)
+		INST_NAME(ISMULH_R)
+		INST_NAME(ISMULH_M)
+		INST_NAME(IDIV_C)
+		INST_NAME(ISDIV_C)
+		INST_NAME(INEG_R)
+		INST_NAME(IXOR_R)
+		INST_NAME(IXOR_M)
+		INST_NAME(IROR_R)
+		INST_NAME(IROL_R)
+
+		//Common floating point
+		INST_NAME(FPSWAP_R)
+
+		//Floating point group F
+		INST_NAME(FPADD_R)
+		INST_NAME(FPADD_M)
+		INST_NAME(FPSUB_R)
+		INST_NAME(FPSUB_M)
+		INST_NAME(FPNEG_R)
+
+		//Floating point group E
+		INST_NAME(FPMUL_R)
+		INST_NAME(FPMUL_M)
+		INST_NAME(FPDIV_R)
+		INST_NAME(FPDIV_M)
+		INST_NAME(FPSQRT_R)
+
+		//Control
+		INST_NAME(COND_R)
+		INST_NAME(COND_M)
+		INST_NAME(CFROUND)
+	};
+
+	InstructionVisualizer Instruction::engine[256] = {
+		//Integer
+		INST_HANDLE(IADD_R)
+		INST_HANDLE(IADD_M)
+		INST_HANDLE(IADD_RC)
+		INST_HANDLE(ISUB_R)
+		INST_HANDLE(ISUB_M)
+		INST_HANDLE(IMUL_9C)
+		INST_HANDLE(IMUL_R)
+		INST_HANDLE(IMUL_M)
+		INST_HANDLE(IMULH_R)
+		INST_HANDLE(IMULH_M)
+		INST_HANDLE(ISMULH_R)
+		INST_HANDLE(ISMULH_M)
+		INST_HANDLE(IDIV_C)
+		INST_HANDLE(ISDIV_C)
+		INST_HANDLE(INEG_R)
+		INST_HANDLE(IXOR_R)
+		INST_HANDLE(IXOR_M)
+		INST_HANDLE(IROR_R)
+		INST_HANDLE(IROL_R)
+
+		//Common floating point
+		INST_HANDLE(FPSWAP_R)
+
+		//Floating point group F
+		INST_HANDLE(FPADD_R)
+		INST_HANDLE(FPADD_M)
+		INST_HANDLE(FPSUB_R)
+		INST_HANDLE(FPSUB_M)
+		INST_HANDLE(FPNEG_R)
+
+		//Floating point group E
+		INST_HANDLE(FPMUL_R)
+		INST_HANDLE(FPMUL_M)
+		INST_HANDLE(FPDIV_R)
+		INST_HANDLE(FPDIV_M)
+		INST_HANDLE(FPSQRT_R)
+
+		//Control
+		INST_HANDLE(COND_R)
+		INST_HANDLE(COND_M)
+		INST_HANDLE(CFROUND)
 	};
 
 }

+ 47 - 13
src/Instruction.hpp

@@ -24,21 +24,17 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 
 namespace RandomX {
 
+	class Instruction;
+
+	typedef void(Instruction::*InstructionVisualizer)(std::ostream&) const;
+
 	class Instruction {
 	public:
 		uint8_t opcode;
-		uint8_t loca;
-		uint8_t rega;
-		uint8_t locb;
-		uint8_t regb;
-		uint8_t locc;
-		uint8_t regc;
-		uint8_t imm8;
-		int32_t addra;
-		union {
-			uint32_t addrc;
-			int32_t imm32;
-		};
+		uint8_t dst;
+		uint8_t src;
+		uint8_t alt;
+		int32_t imm32;
 		const char* getName() const {
 			return names[opcode];
 		}
@@ -49,8 +45,46 @@ namespace RandomX {
 	private:
 		void print(std::ostream&) const;
 		static const char* names[256];
+		static InstructionVisualizer engine[256];
+
+		void genAddressReg(std::ostream& os) const;
+		void genAddressImm(std::ostream& os) const;
+
+		void  h_IADD_R(std::ostream&) const;
+		void  h_IADD_M(std::ostream&) const;
+		void  h_IADD_RC(std::ostream&) const;
+		void  h_ISUB_R(std::ostream&) const;
+		void  h_ISUB_M(std::ostream&) const;
+		void  h_IMUL_9C(std::ostream&) const;
+		void  h_IMUL_R(std::ostream&) const;
+		void  h_IMUL_M(std::ostream&) const;
+		void  h_IMULH_R(std::ostream&) const;
+		void  h_IMULH_M(std::ostream&) const;
+		void  h_ISMULH_R(std::ostream&) const;
+		void  h_ISMULH_M(std::ostream&) const;
+		void  h_IDIV_C(std::ostream&) const;
+		void  h_ISDIV_C(std::ostream&) const;
+		void  h_INEG_R(std::ostream&) const;
+		void  h_IXOR_R(std::ostream&) const;
+		void  h_IXOR_M(std::ostream&) const;
+		void  h_IROR_R(std::ostream&) const;
+		void  h_IROL_R(std::ostream&) const;
+		void  h_FPSWAP_R(std::ostream&) const;
+		void  h_FPADD_R(std::ostream&) const;
+		void  h_FPADD_M(std::ostream&) const;
+		void  h_FPSUB_R(std::ostream&) const;
+		void  h_FPSUB_M(std::ostream&) const;
+		void  h_FPNEG_R(std::ostream&) const;
+		void  h_FPMUL_R(std::ostream&) const;
+		void  h_FPMUL_M(std::ostream&) const;
+		void  h_FPDIV_R(std::ostream&) const;
+		void  h_FPDIV_M(std::ostream&) const;
+		void  h_FPSQRT_R(std::ostream&) const;
+		void  h_COND_R(std::ostream&) const;
+		void  h_COND_M(std::ostream&) const;
+		void  h_CFROUND(std::ostream&) const;
 	};
 
-	static_assert(sizeof(Instruction) == 16, "Invalid alignment of struct Instruction");
+	static_assert(sizeof(Instruction) == 8, "Invalid alignment of struct Instruction");
 
 }

+ 1 - 324
src/InterpretedVirtualMachine.cpp

@@ -130,333 +130,10 @@ namespace RandomX {
 #endif
 	}
 
-	convertible_t InterpretedVirtualMachine::loada(Instruction& instr) {
-		convertible_t& rega = reg.r[instr.rega % RegistersCount];
-		rega.i64 ^= instr.addra; //sign-extend addra
-		addr_t addr = rega.u32;
-
-		if ((ic % 64) == 0) {
-			addr = currentTransform->apply(addr);
-#ifdef STATS
-			datasetAccess[mem.ma / (DatasetBlockCount / 256) / CacheLineSize]++;
-#endif
-			readDataset(addr, mem, reg);
-		}
-
-		if ((instr.loca & 192) == 0) {
-			mem.mx ^= addr;
-		}
-
-		if (instr.loca & 3) {
-			return scratchpad[addr % ScratchpadL1];
-		}
-		else {
-			return scratchpad[addr % ScratchpadL2];
-		}
-	}
-
-	convertible_t InterpretedVirtualMachine::loadbia(Instruction& instr) {
-		if (instr.locb & 3) {
-			return reg.r[instr.regb % RegistersCount];
-		}
-		else {
-			convertible_t temp;
-			temp.i64 = instr.imm32; //sign-extend imm32
-			return temp;
-		}
-	}
-
-	convertible_t InterpretedVirtualMachine::loadbiashift(Instruction& instr) {
-		if (instr.locb & 1) {
-			return reg.r[instr.regb % RegistersCount];
-		}
-		else {
-			convertible_t temp;
-			temp.u64 = instr.imm8;
-			return temp;
-		}
-	}
-
-	convertible_t InterpretedVirtualMachine::loadbiadiv(Instruction& instr) {
-		if (instr.locb & 3) {
-			convertible_t temp;
-			temp.u64 = instr.imm32;
-			return temp;
-		}
-		else {
-			return reg.r[instr.regb % RegistersCount];
-		}
-	}
-
-	convertible_t& InterpretedVirtualMachine::getcr(Instruction& inst) {
-		addr_t addr;
-		switch (inst.locc & 7)
-		{
-			case 0:
-				addr = reg.r[inst.regc % RegistersCount].u32 ^ inst.addrc;
-				return scratchpad[addr % ScratchpadL2];
-
-			case 1:
-			case 2:
-			case 3:
-				addr = reg.r[inst.regc % RegistersCount].u32 ^ inst.addrc;
-				return scratchpad[addr % ScratchpadL1];
-
-			case 4:
-			case 5:
-			case 6:
-			case 7:
-				return reg.r[inst.regc % RegistersCount];
-		}
-	}
-
-	void InterpretedVirtualMachine::writecf(Instruction& inst, fpu_reg_t& regc) {
-		addr_t addr;
-		switch (inst.locc & 7)
-		{
-			case 4:
-				addr = reg.r[inst.regc % RegistersCount].u32 ^ inst.addrc;
-				scratchpad[addr % ScratchpadL2] = (inst.locc & 8) ? regc.hi : regc.lo;
-				break;
-
-			case 5:
-			case 6:
-			case 7:
-				addr = reg.r[inst.regc % RegistersCount].u32 ^ inst.addrc;
-				scratchpad[addr % ScratchpadL1] = (inst.locc & 8) ? regc.hi : regc.lo;
-
-			default:
-				break;
-		}
-	}
-
-#define ALU_RETIRE(x) x(a, b, c); \
-	if(trace) std::cout << std::hex << /*a.u64 << " " << b.u64 << " " <<*/ c.u64 << std::endl;
-
-#define CHECK_NOP_FPDIV(b, c)
-#ifndef STATS
-#define CHECK_NOP_FPADD(b, c)
-#define CHECK_NOP_FPSUB(b, c)
-#define CHECK_NOP_FPMUL(b, c)
-#else
-#define CHECK_NOP_FPADD(b, c) bool loeq = (b.lo.u64 == c.lo.u64); bool hieq = (b.hi.u64 == c.hi.u64); count_FPADD_nop += loeq + hieq; if(loeq && hieq) count_FPADD_nop2++;
-#define CHECK_NOP_FPSUB(b, c) bool loeq = ((b.lo.u64 & INT64_MAX) == (c.lo.u64 & INT64_MAX)); bool hieq = ((b.hi.u64 & INT64_MAX) == (c.hi.u64 & INT64_MAX)); count_FPSUB_nop += loeq + hieq; if(loeq && hieq) count_FPSUB_nop2++; 
-#define CHECK_NOP_FPMUL(b, c) bool loeq = (b.lo.u64 == c.lo.u64); bool hieq = (b.hi.u64 == c.hi.u64); count_FPMUL_nop += loeq + hieq; if(loeq && hieq) count_FPMUL_nop2++;
-#endif
-
-#define FPU_RETIRE(x) x(a, b, c); \
-	writecf(inst, c); \
-	if(trace) { \
-		std::cout << std::hex << ((inst.locc & 8) ? c.hi.u64 : c.lo.u64) << std::endl; \
-	} \
-	if(fpuCheck) { \
-		if(c.hi.f64 != c.hi.f64 || c.lo.f64 != c.lo.f64)  { \
-			std::stringstream ss; \
-			ss << "NaN result of " << #x << "(" << std::hex << a.u64 << ", " << b.hi.u64 << " " << b.lo.u64 << ") = " << c.hi.u64 << " " << c.lo.u64 << std::endl; \
-			throw std::runtime_error(ss.str()); \
-		} else if (std::fpclassify(c.hi.f64) == FP_SUBNORMAL || std::fpclassify(c.lo.f64) == FP_SUBNORMAL) {\
-			std::stringstream ss; \
-			ss << "Denormal result of " << #x << "(" << std::hex << a.u64 << ", " << b.hi.u64 << " " << b.lo.u64 << ") = " << c.hi.u64 << " " << c.lo.u64 << std::endl; \
-			throw std::runtime_error(ss.str()); \
-		} \
-	}
-
-#ifdef STATS
-#define INC_COUNT(x) count_##x++;
-#else
-#define INC_COUNT(x)
-#endif
-
-#define FPU_RETIRE_FPSQRT(x) FPSQRT(a, b, c); \
-	writecf(inst, c); \
-	if(trace) std::cout << std::hex << ((inst.locc & 8) ? c.hi.u64 : c.lo.u64) << std::endl;
-
-#define FPU_RETIRE_FPROUND(x) FPROUND(a, b, c); \
-	writecflo(inst, c); \
-	if(trace) std::cout << std::hex << c.lo.u64 << std::endl;
-
-#define ALU_INST(x) void InterpretedVirtualMachine::h_##x(Instruction& inst) { \
-	INC_COUNT(x) \
-	convertible_t a = loada(inst); \
-	convertible_t b = loadbia(inst); \
-	convertible_t& c = getcr(inst); \
-	ALU_RETIRE(x) \
-	}
-
-#define ALU_INST_SR(x) void InterpretedVirtualMachine::h_##x(Instruction& inst) { \
-	INC_COUNT(x) \
-	convertible_t a = loada(inst); \
-	convertible_t b = loadbiashift(inst); \
-	convertible_t& c = getcr(inst); \
-	ALU_RETIRE(x) \
-	}
-
-#define ALU_INST_DIV(x) void InterpretedVirtualMachine::h_##x(Instruction& inst) { \
-	INC_COUNT(x) \
-	convertible_t a = loada(inst); \
-	convertible_t b = loadbiadiv(inst); \
-	convertible_t& c = getcr(inst); \
-	ALU_RETIRE(x) \
-	}
-
-#define FPU_INST(x) void InterpretedVirtualMachine::h_##x(Instruction& inst) { \
-	INC_COUNT(x) \
-	convertible_t a = loada(inst); \
-	fpu_reg_t& b = reg.f[inst.regb % RegistersCount]; \
-	fpu_reg_t btemp = b; \
-	fpu_reg_t& c = reg.f[inst.regc % RegistersCount]; \
-	FPU_RETIRE(x) \
-	CHECK_NOP_##x(btemp, c) \
-	}
-
-#define FPU_INST_NB(x) void InterpretedVirtualMachine::h_##x(Instruction& inst) { \
-	INC_COUNT(x) \
-	convertible_t a = loada(inst); \
-	fpu_reg_t b; \
-	fpu_reg_t& c = reg.f[inst.regc % RegistersCount]; \
-	FPU_RETIRE_##x(x) \
-	}
-
-	ALU_INST(ADD_64)
-	ALU_INST(ADD_32)
-	ALU_INST(SUB_64)
-	ALU_INST(SUB_32)
-	ALU_INST(MUL_64)
-	ALU_INST(MULH_64)
-	ALU_INST(MUL_32)
-	ALU_INST(IMUL_32)
-	ALU_INST(IMULH_64)
-	ALU_INST_DIV(DIV_64)
-	ALU_INST_DIV(IDIV_64)
-	ALU_INST(AND_64)
-	ALU_INST(AND_32)
-	ALU_INST(OR_64)
-	ALU_INST(OR_32)
-	ALU_INST(XOR_64)
-	ALU_INST(XOR_32)
-
-	ALU_INST_SR(SHL_64)
-	ALU_INST_SR(SHR_64)
-	ALU_INST_SR(SAR_64)
-	ALU_INST_SR(ROL_64)
-	ALU_INST_SR(ROR_64)
-
-	FPU_INST(FPADD)
-	FPU_INST(FPSUB)
-	FPU_INST(FPMUL)
-	FPU_INST(FPDIV)
-	FPU_INST_NB(FPSQRT)
-
-	void InterpretedVirtualMachine::h_FPROUND(Instruction& inst) {
-		convertible_t a = loada(inst);
-		convertible_t& c = getcr(inst);
-		c.u64 = a.u64;
-		if (trace) std::cout << std::hex << a.u64 << std::endl;
-		FPROUND(a, inst.imm8);
-	}
-
-	void InterpretedVirtualMachine::h_JUMP(Instruction& inst) {
-		convertible_t a = loada(inst);
-		convertible_t& c = getcr(inst);
-		c.u64 = a.u64;
-		if (trace) std::cout << std::hex << a.u64 << std::endl;
-		if (JMP_COND(inst.locb, reg.r[inst.regb % RegistersCount], inst.imm32)) {
-#ifdef STATS
-			count_JUMP_taken++;
-			count_jump_taken[inst.locb & 7]++;
-#endif
-			pc += (inst.imm8 & 127) + 1;
-			pc = pc % ProgramLength;
-		}
-#ifdef STATS
-		else {
-			count_JUMP_not_taken++;
-			count_jump_not_taken[inst.locb & 7]++;
-		}
-#endif
-	}
-
-	void InterpretedVirtualMachine::h_CALL(Instruction& inst) {
-		convertible_t a = loada(inst);
-		convertible_t& c = getcr(inst);
-		c.u64 = a.u64;
-		if (trace) std::cout << std::hex << a.u64 << std::endl;
-		if (JMP_COND(inst.locb, reg.r[inst.regb % RegistersCount], inst.imm32)) {
-#ifdef STATS
-			count_CALL_taken++;
-			count_jump_taken[inst.locb & 7]++;
-			count_retdepth = std::max(0, count_retdepth - 1);
-#endif
-			stackPush(pc);
-#ifdef STATS
-			count_max_stack = std::max(count_max_stack, (int)stack.size());
-#endif
-			pc += (inst.imm8 & 127) + 1;
-			pc = pc % ProgramLength;
-		}
-#ifdef STATS
-		else {
-			count_CALL_not_taken++;
-			count_jump_not_taken[inst.locb & 7]++;
-		}
-#endif
-	}
-
-	void InterpretedVirtualMachine::h_RET(Instruction& inst) {
-		convertible_t a = loada(inst);
-		convertible_t& c = getcr(inst);
-		c.u64 = a.u64;
-		if (trace) std::cout << std::hex << a.u64 << std::endl;
-		if (stack.size() > 0) {
-#ifdef STATS
-			count_RET_taken++;
-			count_retdepth++;
-			count_retdepth_max = std::max(count_retdepth_max, count_retdepth);
-#endif
-			auto raddr = stackPopAddress();
-			pc = raddr;
-		}
-#ifdef STATS
-		else {
-			count_RET_stack_empty++;
-		}
-#endif
-	}
-
 #include "instructionWeights.hpp"
 #define INST_HANDLE(x) REPN(&InterpretedVirtualMachine::h_##x, WT(x))
 
 	InstructionHandler InterpretedVirtualMachine::engine[256] = {
-		INST_HANDLE(ADD_64)
-		INST_HANDLE(ADD_32)
-		INST_HANDLE(SUB_64)
-		INST_HANDLE(SUB_32)
-		INST_HANDLE(MUL_64)
-		INST_HANDLE(MULH_64)
-		INST_HANDLE(MUL_32)
-		INST_HANDLE(IMUL_32)
-		INST_HANDLE(IMULH_64)
-		INST_HANDLE(DIV_64)
-		INST_HANDLE(IDIV_64)
-		INST_HANDLE(AND_64)
-		INST_HANDLE(AND_32)
-		INST_HANDLE(OR_64)
-		INST_HANDLE(OR_32)
-		INST_HANDLE(XOR_64)
-		INST_HANDLE(XOR_32)
-		INST_HANDLE(SHL_64)
-		INST_HANDLE(SHR_64)
-		INST_HANDLE(SAR_64)
-		INST_HANDLE(ROL_64)
-		INST_HANDLE(ROR_64)
-		INST_HANDLE(FPADD)
-		INST_HANDLE(FPSUB)
-		INST_HANDLE(FPMUL)
-		INST_HANDLE(FPDIV)
-		INST_HANDLE(FPSQRT)
-		INST_HANDLE(FPROUND)
-		INST_HANDLE(JUMP)
-		INST_HANDLE(CALL)
-		INST_HANDLE(RET)
+
 	};
 }

+ 2 - 2
src/JitCompilerX86.cpp

@@ -38,9 +38,9 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 
 namespace RandomX {
 
-#if !defined(_M_X64) && !defined(__x86_64__)
+#if true || !defined(_M_X64) && !defined(__x86_64__)
 	JitCompilerX86::JitCompilerX86() {
-		throw std::runtime_error("JIT compiler only supports x86-64 CPUs");
+		//throw std::runtime_error("JIT compiler only supports x86-64 CPUs");
 	}
 
 	void JitCompilerX86::generateProgram(Pcg32& gen) {

+ 0 - 1
src/Program.cpp

@@ -30,7 +30,6 @@ namespace RandomX {
 	void Program::print(std::ostream& os) const {
 		for (int i = 0; i < RandomX::ProgramLength; ++i) {
 			auto instr = programBuffer[i];
-			os << std::dec << instr.getName() << " (" << i << "):" << std::endl;
 			os << instr;
 		}
 	}

+ 10 - 6
src/common.hpp

@@ -46,7 +46,7 @@ namespace RandomX {
 	constexpr int CacheBlockCount = CacheSize / CacheLineSize;
 	constexpr int BlockExpansionRatio = DatasetSize / CacheSize;
 	constexpr int DatasetBlockCount = BlockExpansionRatio * CacheBlockCount;
-	constexpr int DatasetIterations = 10;
+	constexpr int DatasetIterations = 3;
 
 
 #ifdef TRACE
@@ -72,13 +72,15 @@ namespace RandomX {
 		convertible_t hi;
 	};
 
-	constexpr int ProgramLength = 512;
-	constexpr uint32_t InstructionCount = 1024 * 1024;
+	constexpr int ProgramLength = 256;
+	constexpr uint32_t InstructionCount = 1024;
 	constexpr uint32_t ScratchpadSize = 1024 * 1024;
 	constexpr uint32_t ScratchpadLength = ScratchpadSize / sizeof(convertible_t);
 	constexpr uint32_t ScratchpadL1 = ScratchpadSize / 64 / sizeof(convertible_t);
 	constexpr uint32_t ScratchpadL2 = ScratchpadSize / 4 / sizeof(convertible_t);
 	constexpr uint32_t ScratchpadL3 = ScratchpadSize / sizeof(convertible_t);
+	constexpr int ScratchpadL1Mask = (ScratchpadL1 - 1) * 8;
+	constexpr int ScratchpadL2Mask = (ScratchpadL2 - 1) * 8;
 	constexpr uint32_t TransformationCount = 90;
 	constexpr int RegistersCount = 8;
 
@@ -118,17 +120,19 @@ namespace RandomX {
 
 	struct RegisterFile {
 		convertible_t r[RegistersCount];
-		fpu_reg_t f[RegistersCount];
+		fpu_reg_t f[RegistersCount / 2];
+		fpu_reg_t g[RegistersCount / 2];
+		fpu_reg_t a[RegistersCount / 2];
 	};
 
-	static_assert(sizeof(RegisterFile) == 3 * RegistersCount * sizeof(convertible_t), "Invalid alignment of struct RandomX::RegisterFile");
+	static_assert(sizeof(RegisterFile) == 256, "Invalid alignment of struct RandomX::RegisterFile");
 
 	typedef void(*DatasetReadFunc)(addr_t, MemoryRegisters&, RegisterFile&);
 
 	typedef void(*ProgramFunc)(RegisterFile&, MemoryRegisters&, convertible_t*);
 
 	extern "C" {
-		void executeProgram(RegisterFile&, MemoryRegisters&, convertible_t*, DatasetReadFunc);
+		void executeProgram(RegisterFile&, MemoryRegisters&, convertible_t*, uint64_t);
 	}
 }
 

+ 133 - 112
src/executeProgram-win64.asm

@@ -21,16 +21,24 @@ _RANDOMX_EXECUTE_PROGRAM SEGMENT PAGE READ EXECUTE
 
 PUBLIC executeProgram
 
+ALIGN 16
+minDbl:
+db 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0
+absMask:
+db 255, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 127
+signMask:
+db 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 128
+
 executeProgram PROC
 	; REGISTER ALLOCATION:
 	; rax -> temporary
 	; rbx -> "ic"
 	; rcx -> temporary
 	; rdx -> temporary
-	; rsi -> convertible_t& scratchpad
-	; rdi -> beginning of VM stack
+	; rsi -> scratchpad pointer
+	; rdi -> dataset pointer
 	; rbp -> "ma", "mx"
-	; rsp -> end of VM stack
+	; rsp -> stack pointer
 	; r8 	-> "r0"
 	; r9 	-> "r1"
 	; r10 -> "r2"
@@ -39,32 +47,22 @@ executeProgram PROC
 	; r13 -> "r5"
 	; r14 -> "r6"
 	; r15 -> "r7"
-	; xmm0 -> temporary
-	; xmm1 -> temporary
+	; xmm0 -> "f0"
+	; xmm1 -> "f1"
 	; xmm2 -> "f2"
 	; xmm3 -> "f3"
-	; xmm4 -> "f4"
-	; xmm5 -> "f5"
-	; xmm6 -> "f6"
-	; xmm7 -> "f7"
-	; xmm8 -> "f0"
-	; xmm9 -> "f1"
-	; xmm10 -> absolute value mask
-
-	; STACK STRUCTURE:
-	;   |
-	;   |
-	;   | saved registers
-	;   |
-	;   v
-	; [rbx+8] RegisterFile& registerFile
-	; [rbx+0] uint8_t* dataset
-	;   |
-	;   |
-	;   | VM stack
-	;   |
-	;   v
-	; [rsp] last element of VM stack
+	; xmm4 -> "e0"
+	; xmm5 -> "e1"
+	; xmm6 -> "e2"
+	; xmm7 -> "e3"
+	; xmm8 -> "a0"
+	; xmm9 -> "a1"
+	; xmm10 -> "a2"
+	; xmm11 -> "a3"
+	; xmm12 -> temporary
+	; xmm13 -> DBL_MIN
+	; xmm14 -> absolute value mask
+	; xmm15 -> sign mask
 
 	; store callee-saved registers
 	push rbx
@@ -81,100 +79,117 @@ executeProgram PROC
 	movdqu xmmword ptr [rsp+32], xmm8
 	movdqu xmmword ptr [rsp+16], xmm9
 	movdqu xmmword ptr [rsp+0], xmm10
+	sub rsp, 80
+	movdqu xmmword ptr [rsp+64], xmm11
+	movdqu xmmword ptr [rsp+48], xmm12
+	movdqu xmmword ptr [rsp+32], xmm13
+	movdqu xmmword ptr [rsp+16], xmm14
+	movdqu xmmword ptr [rsp+0], xmm15
 
 	; function arguments
 	push rcx                    ; RegisterFile& registerFile
 	mov rbp, qword ptr [rdx]    ; "mx", "ma"
-	mov rax, qword ptr [rdx+8]  ; uint8_t* dataset
-	push rax
+	mov eax, ebp                ; "mx"
+	mov rdi, qword ptr [rdx+8]  ; uint8_t* dataset
 	mov rsi, r8                 ; convertible_t* scratchpad
+	mov rbx, r9                 ; loop counter
+	
+	;# zero integer registers
+	xor r8, r8
+	xor r9, r9
+	xor r10, r10
+	xor r11, r11
+	xor r12, r12
+	xor r13, r13
+	xor r14, r14
+	xor r15, r15
+	
+	;# load constant registers
+	lea rcx, [rcx+120]
+	movapd xmm8, xmmword ptr [rcx+72]
+	movapd xmm9, xmmword ptr [rcx+88]
+	movapd xmm10, xmmword ptr [rcx+104]
+	movapd xmm11, xmmword ptr [rcx+120]
+	movapd xmm13, xmmword ptr [minDbl]
+	movapd xmm14, xmmword ptr [absMask]
+	movapd xmm15, xmmword ptr [signMask]
 
-	mov rdi, rsp                ; beginning of VM stack
-	mov ebx, 1048577            ; number of VM instructions to execute + 1
-
-	xorps xmm10, xmm10
-	cmpeqpd xmm10, xmm10
-	psrlq xmm10, 1		          ; mask for absolute value = 0x7fffffffffffffff7fffffffffffffff
-
-	; reset rounding mode
-	mov dword ptr [rsp-8], 40896
-	ldmxcsr dword ptr [rsp-8]
-
-	; load integer registers
-	mov r8, qword ptr [rcx+0]
-	mov r9, qword ptr [rcx+8]
-	mov r10, qword ptr [rcx+16]
-	mov r11, qword ptr [rcx+24]
-	mov r12, qword ptr [rcx+32]
-	mov r13, qword ptr [rcx+40]
-	mov r14, qword ptr [rcx+48]
-	mov r15, qword ptr [rcx+56]
-
-	; load register f0 hi, lo
-	xorps xmm8, xmm8
-	cvtsi2sd xmm8, qword ptr [rcx+72]
-	pslldq xmm8, 8
-	cvtsi2sd xmm8, qword ptr [rcx+64]
-
-	; load register f1 hi, lo
-	xorps xmm9, xmm9
-	cvtsi2sd xmm9, qword ptr [rcx+88]
-	pslldq xmm9, 8
-	cvtsi2sd xmm9, qword ptr [rcx+80]
-
-	; load register f2 hi, lo
-	xorps xmm2, xmm2
-	cvtsi2sd xmm2, qword ptr [rcx+104]
-	pslldq xmm2, 8
-	cvtsi2sd xmm2, qword ptr [rcx+96]
-
-	; load register f3 hi, lo
-	xorps xmm3, xmm3
-	cvtsi2sd xmm3, qword ptr [rcx+120]
-	pslldq xmm3, 8
-	cvtsi2sd xmm3, qword ptr [rcx+112]
-
-	lea rcx, [rcx+64]
-
-	; load register f4 hi, lo
-	xorps xmm4, xmm4
-	cvtsi2sd xmm4, qword ptr [rcx+72]
-	pslldq xmm4, 8
-	cvtsi2sd xmm4, qword ptr [rcx+64]
-
-	; load register f5 hi, lo
-	xorps xmm5, xmm5
-	cvtsi2sd xmm5, qword ptr [rcx+88]
-	pslldq xmm5, 8
-	cvtsi2sd xmm5, qword ptr [rcx+80]
-
-	; load register f6 hi, lo
-	xorps xmm6, xmm6
-	cvtsi2sd xmm6, qword ptr [rcx+104]
-	pslldq xmm6, 8
-	cvtsi2sd xmm6, qword ptr [rcx+96]
-
-	; load register f7 hi, lo
-	xorps xmm7, xmm7
-	cvtsi2sd xmm7, qword ptr [rcx+120]
-	pslldq xmm7, 8
-	cvtsi2sd xmm7, qword ptr [rcx+112]
-
-	jmp program_begin
-
-	; program body
-ALIGN 64
 program_begin:
-	include program.inc
+	xor eax, r8d                      ;# read address register 1
+	and eax, 262080
+	lea rcx, [rsi+rax]
+	xor r8,  qword ptr [rcx+0]
+	xor r9,  qword ptr [rcx+8]
+	xor r10, qword ptr [rcx+16]
+	xor r11, qword ptr [rcx+24]
+	xor r12, qword ptr [rcx+32]
+	xor r13, qword ptr [rcx+40]
+	xor r14, qword ptr [rcx+48]
+	xor r15, qword ptr [rcx+56]
+	xor eax, r9d                      ;# read address register 2
+	and eax, 262080
+	lea rcx, [rsi+rax]
+	cvtdq2pd xmm0, qword ptr [rcx+0]
+	cvtdq2pd xmm1, qword ptr [rcx+8]
+	cvtdq2pd xmm2, qword ptr [rcx+16]
+	cvtdq2pd xmm3, qword ptr [rcx+24]
+	cvtdq2pd xmm4, qword ptr [rcx+32]
+	cvtdq2pd xmm5, qword ptr [rcx+40]
+	cvtdq2pd xmm6, qword ptr [rcx+48]
+	cvtdq2pd xmm7, qword ptr [rcx+56]
+	andps xmm4, xmm14
+	andps xmm5, xmm14
+	andps xmm6, xmm14
+	andps xmm7, xmm14
 
-ALIGN 64
+	;# 256 instructions
+	include program.inc
+	
+	mov eax, r8d                       ;# read address register 1
+	xor eax, r9d                       ;# read address register 2
+	xor rbp, rax                       ;# modify "mx"
+	and rbp, -64                       ;# align "mx" to the start of a cache line
+	mov edx, ebp                       ;# edx = mx
+	prefetchnta byte ptr [rdi+rdx]
+	ror rbp, 32                        ;# swap "ma" and "mx"
+	mov edx, ebp                       ;# edx = ma
+	lea rcx, [rdi+rdx]                 ;# dataset cache line
+	xor r8,  qword ptr [rcx+0]
+	xor r9,  qword ptr [rcx+8]
+	xor r10, qword ptr [rcx+16]
+	xor r11, qword ptr [rcx+24]
+	xor r12, qword ptr [rcx+32]
+	xor r13, qword ptr [rcx+40]
+	xor r14, qword ptr [rcx+48]
+	xor r15, qword ptr [rcx+56]                 
+	mov eax, r12d                      ;# write address register 1
+	and eax, 262080
+	lea rcx, [rsi+rax]
+	mov qword ptr [rcx+0], r8
+	mov qword ptr [rcx+8], r9
+	mov qword ptr [rcx+16], r10
+	mov qword ptr [rcx+24], r11
+	mov qword ptr [rcx+32], r12
+	mov qword ptr [rcx+40], r13
+	mov qword ptr [rcx+48], r14
+	mov qword ptr [rcx+56], r15
+	xor eax, r13d                      ;# write address register 2
+	and eax, 262080
+	lea rcx, [rsi+rax]
+	mulpd xmm0, xmm4
+	mulpd xmm1, xmm5
+	mulpd xmm2, xmm6
+	mulpd xmm3, xmm7
+	movapd xmmword ptr [rcx+0], xmm0
+	movapd xmmword ptr [rcx+16], xmm1
+	movapd xmmword ptr [rcx+32], xmm2
+	movapd xmmword ptr [rcx+48], xmm3
+	dec ebx
+	jnz program_begin
+	
 rx_finish:
-	; unroll the stack
-	mov rsp, rdi
-
 	; save VM register values
 	pop rcx
-	pop rcx
 	mov qword ptr [rcx+0], r8
 	mov qword ptr [rcx+8], r9
 	mov qword ptr [rcx+16], r10
@@ -183,8 +198,8 @@ rx_finish:
 	mov qword ptr [rcx+40], r13
 	mov qword ptr [rcx+48], r14
 	mov qword ptr [rcx+56], r15
-	movdqa xmmword ptr [rcx+64], xmm8
-	movdqa xmmword ptr [rcx+80], xmm9
+	movdqa xmmword ptr [rcx+64], xmm0
+	movdqa xmmword ptr [rcx+80], xmm1
 	movdqa xmmword ptr [rcx+96], xmm2
 	movdqa xmmword ptr [rcx+112], xmm3
 	lea rcx, [rcx+64]
@@ -194,6 +209,12 @@ rx_finish:
 	movdqa xmmword ptr [rcx+112], xmm7
 
 	; load callee-saved registers
+	movdqu xmm15, xmmword ptr [rsp]
+	movdqu xmm14, xmmword ptr [rsp+16]
+	movdqu xmm13, xmmword ptr [rsp+32]
+	movdqu xmm12, xmmword ptr [rsp+48]
+	movdqu xmm11, xmmword ptr [rsp+64]
+	add rsp, 80
 	movdqu xmm10, xmmword ptr [rsp]
 	movdqu xmm9, xmmword ptr [rsp+16]
 	movdqu xmm8, xmmword ptr [rsp+32]

+ 50 - 38
src/instructionWeights.hpp

@@ -19,46 +19,58 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 
 #pragma once
 
-#define WT_ADD_64 12
-#define WT_ADD_32 2
-#define WT_SUB_64 12
-#define WT_SUB_32 2
-#define WT_MUL_64 23
-#define WT_MULH_64 5
-#define WT_MUL_32 15
-#define WT_IMUL_32 15
-#define WT_IMULH_64 3
-#define WT_DIV_64 8
-#define WT_IDIV_64 8
-#define WT_AND_64 4
-#define WT_AND_32 2
-#define WT_OR_64 4
-#define WT_OR_32 2
-#define WT_XOR_64 4
-#define WT_XOR_32 2
-#define WT_SHL_64 3
-#define WT_SHR_64 3
-#define WT_SAR_64 3
-#define WT_ROL_64 6
-#define WT_ROR_64 6
-#define WT_FPADD 20
-#define WT_FPSUB 20
-#define WT_FPMUL 22
-#define WT_FPDIV 8
-#define WT_FPSQRT 6
-#define WT_FPROUND 2
-#define WT_JUMP 11
-#define WT_CALL 11
-#define WT_RET 12
-#define WT_NOP 0
+//Integer
+#define WT_IADD_R 10
+#define WT_IADD_M 3
+#define WT_IADD_RC 12
+#define WT_ISUB_R 10
+#define WT_ISUB_M 3
+#define WT_IMUL_9C 12
+#define WT_IMUL_R 24
+#define WT_IMUL_M 8
+#define WT_IMULH_R 6
+#define WT_IMULH_M 2
+#define WT_ISMULH_R 6
+#define WT_ISMULH_M 2
+#define WT_IDIV_C 4
+#define WT_ISDIV_C 2
+#define WT_INEG_R 4
+#define WT_IXOR_R 15
+#define WT_IXOR_M 5
+#define WT_IROR_R 10
+#define WT_IROL_R 10
+
+//Common floating point
+#define WT_FPSWAP_R 6
+
+//Floating point group F
+#define WT_FPADD_R 18
+#define WT_FPADD_M 3
+#define WT_FPSUB_R 18
+#define WT_FPSUB_M 3
+#define WT_FPNEG_R 5
 
+//Floating point group E
+#define WT_FPMUL_R 18
+#define WT_FPMUL_M 3
+#define WT_FPDIV_R 6
+#define WT_FPDIV_M 1
+#define WT_FPSQRT_R 6
+
+//Control
+#define WT_COND_R 15
+#define WT_COND_M 5
+#define WT_CFROUND 1
+
+#define WT_NOP 0
 
-constexpr int wtSum = WT_ADD_64 + WT_ADD_32 + WT_SUB_64 + WT_SUB_32 + \
-WT_MUL_64 + WT_MULH_64 + WT_MUL_32 + WT_IMUL_32 + WT_IMULH_64 + \
-WT_DIV_64 + WT_IDIV_64 + WT_AND_64 + WT_AND_32 + WT_OR_64 + \
-WT_OR_32 + WT_XOR_64 + WT_XOR_32 + WT_SHL_64 + WT_SHR_64 + \
-WT_SAR_64 + WT_ROL_64 + WT_ROR_64 + WT_FPADD + WT_FPSUB + WT_FPMUL \
-+ WT_FPDIV + WT_FPSQRT + WT_FPROUND + WT_JUMP + WT_CALL + WT_RET + WT_NOP;
+constexpr int wtSum = WT_IADD_R + WT_IADD_M + WT_IADD_RC + WT_ISUB_R + \
+WT_ISUB_M + WT_IMUL_9C + WT_IMUL_R + WT_IMUL_M + WT_IMULH_R + \
+WT_IMULH_M + WT_ISMULH_R + WT_ISMULH_M + WT_IDIV_C + WT_ISDIV_C + \
+WT_INEG_R + WT_IXOR_R + WT_IXOR_M + WT_IROR_R + WT_IROL_R + \
+WT_FPSWAP_R + WT_FPADD_R + WT_FPADD_M + WT_FPSUB_R + WT_FPSUB_M + \
+WT_FPNEG_R + WT_FPMUL_R + WT_FPMUL_M + WT_FPDIV_R + WT_FPDIV_M + \
+WT_FPSQRT_R + WT_COND_R + WT_COND_M + WT_CFROUND + WT_NOP;
 
 static_assert(wtSum == 256,
 	"Sum of instruction weights must be 256");

+ 38 - 12
src/main.cpp

@@ -34,6 +34,7 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>.
 #include <atomic>
 #include "dataset.hpp"
 #include "Cache.hpp"
+#include "Pcg32.hpp"
 
 const uint8_t seed[32] = { 191, 182, 222, 175, 249, 89, 134, 104, 241, 68, 191, 62, 162, 166, 61, 64, 123, 191, 227, 193, 118, 60, 188, 53, 223, 133, 175, 24, 123, 230, 55, 74 };
 
@@ -130,6 +131,27 @@ void generateAsm(int nonce) {
 	asmX86.printCode(std::cout);
 }
 
+void generateNative(int nonce) {
+	uint64_t hash[4];
+	unsigned char blockTemplate[] = {
+		0x07, 0x07, 0xf7, 0xa4, 0xf0, 0xd6, 0x05, 0xb3, 0x03, 0x26, 0x08, 0x16, 0xba, 0x3f, 0x10, 0x90, 0x2e, 0x1a, 0x14,
+		0x5a, 0xc5, 0xfa, 0xd3, 0xaa, 0x3a, 0xf6, 0xea, 0x44, 0xc1, 0x18, 0x69, 0xdc, 0x4f, 0x85, 0x3f, 0x00, 0x2b, 0x2e,
+		0xea, 0x00, 0x00, 0x00, 0x00, 0x77, 0xb2, 0x06, 0xa0, 0x2c, 0xa5, 0xb1, 0xd4, 0xce, 0x6b, 0xbf, 0xdf, 0x0a, 0xca,
+		0xc3, 0x8b, 0xde, 0xd3, 0x4d, 0x2d, 0xcd, 0xee, 0xf9, 0x5c, 0xd2, 0x0c, 0xef, 0xc1, 0x2f, 0x61, 0xd5, 0x61, 0x09
+	};
+	int* noncePtr = (int*)(blockTemplate + 39);
+	*noncePtr = nonce;
+	blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
+	RandomX::Program prog;
+	Pcg32 gen(hash);
+	prog.initialize(gen);
+	for (int i = 0; i < RandomX::ProgramLength; ++i) {
+		prog(i).dst %= 8;
+		prog(i).src %= 8;
+	}
+	std::cout << prog << std::endl;
+}
+
 void mine(RandomX::VirtualMachine* vm, std::atomic<int>& atomicNonce, AtomicHash& result, int noncesCount, int thread, uint8_t* scratchpad) {
 	uint64_t hash[4];
 	unsigned char blockTemplate[] = {
@@ -147,18 +169,16 @@ void mine(RandomX::VirtualMachine* vm, std::atomic<int>& atomicNonce, AtomicHash
 		blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
 		int spIndex = ((uint8_t*)hash)[24] | ((((uint8_t*)hash)[25] & 15) << 8);
 		vm->initializeScratchpad(scratchpad, spIndex);
-		vm->initializeProgram(hash);
+		//vm->initializeProgram(hash);
 		//dump((char*)((RandomX::CompiledVirtualMachine*)vm)->getProgram(), RandomX::CodeSize, "code-1337-jmp.txt");
-		vm->setScratchpad(scratchpad + 3 * RandomX::ScratchpadSize / 4);
-		vm->execute();
-		vm->setScratchpad(scratchpad + 2 * RandomX::ScratchpadSize / 4);
-		vm->execute();
-		vm->getResult(nullptr, 0, hash);
-		vm->initializeProgram(hash);
-		vm->setScratchpad(scratchpad + 1 * RandomX::ScratchpadSize / 4);
-		vm->execute();
-		vm->setScratchpad(scratchpad + 0 * RandomX::ScratchpadSize / 4);
-		vm->execute();
+		for (int chain = 0; chain < 16; ++chain) {
+			vm->initializeProgram(hash);
+			int segment = hash[3] & 3;
+			vm->setScratchpad(scratchpad);// +segment * RandomX::ScratchpadSize / 4);
+			vm->execute();
+			vm->getResult(nullptr, 0, hash);
+		}
+		//vm->initializeProgram(hash);
 		vm->getResult(scratchpad, RandomX::ScratchpadSize, hash);
 		result.xorWith(hash);
 		if (RandomX::trace) {
@@ -171,7 +191,7 @@ void mine(RandomX::VirtualMachine* vm, std::atomic<int>& atomicNonce, AtomicHash
 }
 
 int main(int argc, char** argv) {
-	bool softAes, lightClient, genAsm, compiled, help, largePages, async, aesBench;
+	bool softAes, lightClient, genAsm, compiled, help, largePages, async, aesBench, genNative;
 	int programCount, threadCount;
 	readOption("--help", argc, argv, help);
 
@@ -189,12 +209,18 @@ int main(int argc, char** argv) {
 	readOption("--largePages", argc, argv, largePages);
 	readOption("--async", argc, argv, async);
 	readOption("--aesBench", argc, argv, aesBench);
+	readOption("--genNative", argc, argv, genNative);
 
 	if (genAsm) {
 		generateAsm(programCount);
 		return 0;
 	}
 
+	if (genNative) {
+		generateNative(programCount);
+		return 0;
+	}
+
 	if (softAes)
 		std::cout << "Using software AES." << std::endl;
 

+ 740 - 8918
src/program.inc

@@ -1,8923 +1,745 @@
-rx_i_0: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r9, 0ca9788ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_0
-	call rx_read
-rx_body_0:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r12, rax
-	cmp r11d, 445530481
-	ja short rx_i_1
-	call rx_i_30
-
-rx_i_1: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r15, 06afc2fa4h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_1
-	call rx_read
-rx_body_1:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov edx, r10d
-	cmp edx, -1
-	jne short body_idiv_1
-	neg rax
-	jmp short result_idiv_1
-body_idiv_1:
-	mov ecx, 1
-	test edx, edx
-	cmovne ecx, edx
-	movsxd rcx, ecx
-	cqo
-	idiv rcx
-result_idiv_1:
-	mov r12, rax
-
-rx_i_2: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r15, 097210f7bh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_2
-	call rx_read
-rx_body_2:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 05060ccf7h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r11d, 1348521207
-	jno rx_i_47
-
-rx_i_3: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r13, 082c73195h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_3
-	call rx_read
-rx_body_3:
-	xor rbp, rax
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_4: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r14, 077daefb4h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_4
-	call rx_read
-rx_body_4:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r14d
-	imul rax, rcx
-	mov r9, rax
-
-rx_i_5: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r15, 0379f9ee0h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_5
-	call rx_read
-rx_body_5:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 1037420699
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 03dd5c89bh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_6: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r8, 03bae7272h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_6
-	call rx_read
-rx_body_6:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 098a649d1h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_7: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r10, 0e264ed81h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_7
-	call rx_read
-rx_body_7:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm6, xmm0
-
-rx_i_8: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r13, 068c1e5d2h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_8
-	call rx_read
-rx_body_8:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r11
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 050267ebdh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_9: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 085121c54h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_9
-	call rx_read
-rx_body_9:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 565870810
-	mov rdx, 8750690209911200579
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 28
-	sets dl
-	add rax, rdx
-	mov r10, rax
-
-rx_i_10: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r8, 052efde3eh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_10
-	call rx_read
-rx_body_10:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, r10
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0d49dbd9fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_11: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r10, 0a9bf8aa1h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_11
-	call rx_read
-rx_body_11:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 0852d40d8h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_12: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r10, 0db2691ch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_12
-	call rx_read
-rx_body_12:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm8, xmm0
-
-rx_i_13: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 061c0d34dh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_13
-	call rx_read
-rx_body_13:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 04f2f223ch
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_14: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0e761d1beh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_14
-	call rx_read
-rx_body_14:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r9
-	mov r10, rax
-
-rx_i_15: ;RET
-	dec ebx
-	jz rx_finish
-	xor r11, 074ddb688h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_15
-	call rx_read
-rx_body_15:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r14, rax
-	cmp rsp, rdi
-	je short rx_i_16
-	ret
-
-rx_i_16: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r14, 06be90627h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_16
-	call rx_read
-rx_body_16:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0d7e75aeh
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_17: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0fbc6fc35h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_17
-	call rx_read
-rx_body_17:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm4
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_18: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r14, 0c28ca080h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_18
-	call rx_read
-rx_body_18:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm4
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 0869baa81h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_19: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 0ac009c30h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_19
-	call rx_read
-rx_body_19:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm7, xmm0
-
-rx_i_20: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 0ecca967dh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_20
-	call rx_read
-rx_body_20:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm7, xmm0
-
-rx_i_21: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0977f0284h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_21
-	call rx_read
-rx_body_21:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	ror rax, cl
-	mov r15, rax
-
-rx_i_22: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r13, 080bdfefah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_22
-	call rx_read
-rx_body_22:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r8
-	mov r10, rax
-
-rx_i_23: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0e1e0d3c4h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_23
-	call rx_read
-rx_body_23:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 1283724485
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 04c8414c5h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_24: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r8, 070d3b8c7h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_24
-	call rx_read
-rx_body_24:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, 1
-	mov edx, r15d
-	test edx, edx
-	cmovne ecx, edx
-	xor edx, edx
-	div rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 099b77a68h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_25: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r12, 01cf77a04h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_25
-	call rx_read
-rx_body_25:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 0baf5c2d4h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_26: ;IMULH_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0e311468ch
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_26
-	call rx_read
-rx_body_26:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, 812644844
-	imul rcx
-	mov rax, rdx
-	mov r9, rax
-
-rx_i_27: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r12, 01fd9911ah
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_27
-	call rx_read
-rx_body_27:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-
-rx_i_28: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r13, 067df757eh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_28
-	call rx_read
-rx_body_28:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, 565865719
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 021ba6cf7h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_29: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0be2e7c42h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_29
-	call rx_read
-rx_body_29:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r13
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 073e1a073h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_30: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r11, 084d067f7h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_30
-	call rx_read
-rx_body_30:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm7, xmm0
-
-rx_i_31: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0d352ce37h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_31
-	call rx_read
-rx_body_31:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 55
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 01e2da792h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_32: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0a1f248dah
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_32
-	call rx_read
-rx_body_32:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, r14d
-	mov r9, rax
-
-rx_i_33: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0554720fch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_33
-	call rx_read
-rx_body_33:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov r12, rax
-
-rx_i_34: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r13, 0665e91f1h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_34
-	call rx_read
-rx_body_34:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0e9563b32h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r14d, -380224718
-	jns short rx_i_35
-	call rx_i_108
-
-rx_i_35: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r15, 05ef1be79h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_35
-	call rx_read
-rx_body_35:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0865c0f66h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r9d, -2040787098
-	jns short rx_i_36
-	call rx_i_58
-
-rx_i_36: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 012ec7e3ah
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_36
-	call rx_read
-rx_body_36:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_37: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r12, 0d0706601h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_37
-	call rx_read
-rx_body_37:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm9, xmm0
-
-rx_i_38: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r9, 064056913h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_38
-	call rx_read
-rx_body_38:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r14
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 087c32de2h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_39: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r14, 02c1f1eb0h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_39
-	call rx_read
-rx_body_39:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r14
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0f4101ad9h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_40: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r10, 068fd9009h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_40
-	call rx_read
-rx_body_40:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0b2a27eceh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r12d, -1297973554
-	jns short rx_i_41
-	call rx_i_90
-
-rx_i_41: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 037a30933h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_41
-	call rx_read
-rx_body_41:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp r14d, -1070581824
-	jo rx_i_127
-
-rx_i_42: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0bc1de9f6h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_42
-	call rx_read
-rx_body_42:
-	xor rbp, rax
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm6, xmm0
-
-rx_i_43: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r12, 02b2a2eech
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_43
-	call rx_read
-rx_body_43:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r8
-	mov r11, rax
-
-rx_i_44: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0685817abh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_44
-	call rx_read
-rx_body_44:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	sar rax, cl
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0372116f6h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_45: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r12, 08cd244ebh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_45
-	call rx_read
-rx_body_45:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0977132cdh
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_46: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r8, 06d8f4254h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_46
-	call rx_read
-rx_body_46:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r9
-	mov r8, rax
-
-rx_i_47: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r12, 05ba232c6h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_47
-	call rx_read
-rx_body_47:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 071ba231h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r10d, 119251505
-	jbe rx_i_131
-
-rx_i_48: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r8, 0aaed618fh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_48
-	call rx_read
-rx_body_48:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-
-rx_i_49: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r8, 0f96c6a45h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_49
-	call rx_read
-rx_body_49:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm5, xmm0
-
-rx_i_50: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0da3e4842h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_50
-	call rx_read
-rx_body_50:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, r10
-	mov r15, rax
-
-rx_i_51: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0302b676ah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_51
-	call rx_read
-rx_body_51:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r15
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 018fd1fbfh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_52: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r11, 0fa88f48bh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_52
-	call rx_read
-rx_body_52:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm7, xmm0
-
-rx_i_53: ;RET
-	dec ebx
-	jz rx_finish
-	xor r13, 03dff9b9eh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_53
-	call rx_read
-rx_body_53:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 078ed00edh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_54
-	ret
-
-rx_i_54: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r11, 060638de0h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_54
-	call rx_read
-rx_body_54:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 282209221
-	mov rcx, 1096650948274100047
-	mul rcx
-	mov rax, rdx
-	shr rax, 24
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 010d22bc5h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_55: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r10, 0dda983d4h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_55
-	call rx_read
-rx_body_55:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm3, xmm0
-
-rx_i_56: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0f1456b8eh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_56
-	call rx_read
-rx_body_56:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -50768751
-	mov rcx, rax
-	mov rdx, 6254795139557318139
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sub rax, rcx
-	sar rax, 25
-	sets dl
-	add rax, rdx
-	mov r8, rax
-
-rx_i_57: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 010dc4571h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_57
-	call rx_read
-rx_body_57:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 172123015
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0a426387h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_58: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0bcec0ebah
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_58
-	call rx_read
-rx_body_58:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 1506547423
-	mov rcx, 6573653217342526495
-	mul rcx
-	mov rax, rdx
-	shr rax, 29
-	mov r8, rax
-
-rx_i_59: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r11, 0980dd402h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_59
-	call rx_read
-rx_body_59:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm7, xmm0
-
-rx_i_60: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r15, 03de14d1eh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_60
-	call rx_read
-rx_body_60:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 07bb60f45h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r11d, 2075529029
-	jo short rx_i_61
-	call rx_i_116
-
-rx_i_61: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r13, 05058ce64h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_61
-	call rx_read
-rx_body_61:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r15d, 1933164545
-	jns rx_i_120
-
-rx_i_62: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r15, 0c3089414h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_62
-	call rx_read
-rx_body_62:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 05c4789e3h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_63: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 065cf272eh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_63
-	call rx_read
-rx_body_63:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 0be13d69eh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_64: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0ae54dfbfh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_64
-	call rx_read
-rx_body_64:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r15
-	mov r9, rax
-
-rx_i_65: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r13, 07b366ce6h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_65
-	call rx_read
-rx_body_65:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0594a879fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r8d, 1498056607
-	js rx_i_129
-
-rx_i_66: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r15, 015a1b689h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_66
-	call rx_read
-rx_body_66:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 07305e78h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_67: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r14, 088393ba0h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_67
-	call rx_read
-rx_body_67:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 07916db59h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r13d, 2031541081
-	jns rx_i_79
-
-rx_i_68: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 03aa5c3a4h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_68
-	call rx_read
-rx_body_68:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 03c51ef39h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_69: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0376c9c27h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_69
-	call rx_read
-rx_body_69:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm8, xmm0
-
-rx_i_70: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0bbbec3fah
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_70
-	call rx_read
-rx_body_70:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	mul rcx
-	mov rax, rdx
-	mov r13, rax
-
-rx_i_71: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r14, 0e9efb350h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_71
-	call rx_read
-rx_body_71:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 056660eedh
-	and eax, 131071
-	movlpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_72: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r13, 0f4e51e28h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_72
-	call rx_read
-rx_body_72:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r9d, -631091751
-	jno rx_i_191
-
-rx_i_73: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r12, 0c24ddbd4h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_73
-	call rx_read
-rx_body_73:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm2, xmm0
-
-rx_i_74: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r8, 04c4b0c7fh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_74
-	call rx_read
-rx_body_74:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r13
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0aaaacb32h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_75: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r14, 03bcc02e3h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_75
-	call rx_read
-rx_body_75:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r13, rax
-	cmp r11d, -1160798683
-	jno short rx_i_76
-	call rx_i_202
-
-rx_i_76: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r11, 04b0ff63eh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_76
-	call rx_read
-rx_body_76:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 083bc0396h
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_77: ;RET
-	dec ebx
-	jz rx_finish
-	xor r14, 0b956b3e8h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_77
-	call rx_read
-rx_body_77:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 03a92bc7ah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_78
-	ret
-
-rx_i_78: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0edeca680h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_78
-	call rx_read
-rx_body_78:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r8d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0697e6195h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_79: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r11, 0fbdddcb5h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_79
-	call rx_read
-rx_body_79:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r13d, 1800043331
-	ja short rx_i_80
-	call rx_i_93
-
-rx_i_80: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r13, 09cec97a1h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_80
-	call rx_read
-rx_body_80:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r11
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 01a681d13h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_81: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r15, 078228167h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_81
-	call rx_read
-rx_body_81:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, 338325607
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0142a7067h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_82: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r11, 078cae1ffh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_82
-	call rx_read
-rx_body_82:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r10, rax
-	cmp r12d, -68969733
-	jo rx_i_145
-
-rx_i_83: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0d9b6a533h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_83
-	call rx_read
-rx_body_83:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 91850728
-	mov rdx, 842358619687110887
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 22
-	sets dl
-	add rax, rdx
-	mov r12, rax
-
-rx_i_84: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0e9e75336h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_84
-	call rx_read
-rx_body_84:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sar rax, 45
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0ec5c52e6h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_85: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 04c0d378ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_85
-	call rx_read
-rx_body_85:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 20014507
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 013165abh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_86: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r11, 04386e368h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_86
-	call rx_read
-rx_body_86:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, r8
-	mov r12, rax
-
-rx_i_87: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0d75a0ecfh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_87
-	call rx_read
-rx_body_87:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r12
-	mov r8, rax
-
-rx_i_88: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 031bb7f7ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_88
-	call rx_read
-rx_body_88:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	ror rax, cl
-	mov r9, rax
-
-rx_i_89: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 03b45ecebh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_89
-	call rx_read
-rx_body_89:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r8
-	mov r10, rax
-
-rx_i_90: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0ee08e76bh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_90
-	call rx_read
-rx_body_90:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm6, xmm0
-
-rx_i_91: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r9, 042e28e94h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_91
-	call rx_read
-rx_body_91:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_92: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r8, 0729260e1h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_92
-	call rx_read
-rx_body_92:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r12, rax
-	cmp r14d, 1288893603
-	jge rx_i_170
-
-rx_i_93: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0bfcebaf4h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_93
-	call rx_read
-rx_body_93:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 07e48a0d8h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_94: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r13, 0ea326630h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_94
-	call rx_read
-rx_body_94:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0eb8c5be0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r13d, -343122976
-	jns short rx_i_95
-	call rx_i_157
-
-rx_i_95: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0b5451a2dh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_95
-	call rx_read
-rx_body_95:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov r15, rax
-
-rx_i_96: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 04f912ef8h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_96
-	call rx_read
-rx_body_96:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r11d
-	imul rax, rcx
-	mov r11, rax
-
-rx_i_97: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r15, 0acc45b3bh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_97
-	call rx_read
-rx_body_97:
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_98: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r14, 09900a4e8h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_98
-	call rx_read
-rx_body_98:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r15
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0d067d49ah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_99: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r9, 0841b2984h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_99
-	call rx_read
-rx_body_99:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 04c21df83h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_100: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 07ebea48fh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_100
-	call rx_read
-rx_body_100:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r9
-	mov r14, rax
-
-rx_i_101: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0631209d3h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_101
-	call rx_read
-rx_body_101:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, 1732300336
-	mov r11, rax
-
-rx_i_102: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r10, 0e50bf07ah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_102
-	call rx_read
-rx_body_102:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_103: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 02b7096f1h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_103
-	call rx_read
-rx_body_103:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r13
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0e4dd92b6h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_104: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r11, 075deaf71h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_104
-	call rx_read
-rx_body_104:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 2381897207
-	mov rcx, 16631314374404138087
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov r15, rax
-
-rx_i_105: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 036a51f72h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_105
-	call rx_read
-rx_body_105:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r15d
-	imul rax, rcx
-	mov r14, rax
-
-rx_i_106: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 07b512986h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_106
-	call rx_read
-rx_body_106:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 03cb2505h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_107: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r12, 0f1d2e50h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_107
-	call rx_read
-rx_body_107:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 07243ab81h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r11d, 1917037441
-	jl rx_i_143
-
-rx_i_108: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r9, 07327ba60h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_108
-	call rx_read
-rx_body_108:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-
-rx_i_109: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0594e37deh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_109
-	call rx_read
-rx_body_109:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r10
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 094ab5a5ch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_110: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 04cdf5ebah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_110
-	call rx_read
-rx_body_110:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	shr rax, cl
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0ec68532fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_111: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r8, 02e16c97ch
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_111
-	call rx_read
-rx_body_111:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 05d237d0bh
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r14d, 1562606859
-	jl short rx_i_112
-	call rx_i_212
-
-rx_i_112: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0d42ddbd4h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_112
-	call rx_read
-rx_body_112:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, -1025977295
-	mov r14, rax
-
-rx_i_113: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r10, 07a4f8cbbh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_113
-	call rx_read
-rx_body_113:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	mul rcx
-	mov rax, rdx
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0dea3f7e3h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_114: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r13, 06e83e2cdh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_114
-	call rx_read
-rx_body_114:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 770835683
-	mov rcx, 12847770974664443757
-	mul rcx
-	mov rax, rdx
-	shr rax, 29
-	mov r14, rax
-
-rx_i_115: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0336c980eh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_115
-	call rx_read
-rx_body_115:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 587029837
-	mov rdx, 527204905636414983
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 24
-	sets dl
-	add rax, rdx
-	mov r14, rax
-
-rx_i_116: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0d122702eh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_116
-	call rx_read
-rx_body_116:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 2444190605
-	mov rcx, 16207443550472271289
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 091af638dh
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_117: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r11, 015f2012bh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_117
-	call rx_read
-rx_body_117:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -1205826972
-	mov rdx, -8213052572424165513
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 29
-	sets dl
-	add rax, rdx
-	mov r15, rax
-
-rx_i_118: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 037ddf43dh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_118
-	call rx_read
-rx_body_118:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm5
-	movaps xmm6, xmm0
-
-rx_i_119: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 0bba475f3h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_119
-	call rx_read
-rx_body_119:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 02401488h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_120: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0e5561e3eh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_120
-	call rx_read
-rx_body_120:
-	xor rbp, rax
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm8, xmm0
-
-rx_i_121: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 03ab8f73h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_121
-	call rx_read
-rx_body_121:
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm5
-	movaps xmm8, xmm0
-
-rx_i_122: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r10, 04e0dbd40h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_122
-	call rx_read
-rx_body_122:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 078f6ec29h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r11d, 2029448233
-	jno short rx_i_123
-	call rx_i_192
-
-rx_i_123: ;ADD_32
-	dec ebx
-	jz rx_finish
-	xor r13, 073e9f58ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_123
-	call rx_read
-rx_body_123:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add eax, 1530846772
-	mov r13, rax
-
-rx_i_124: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r12, 0e3fa3670h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_124
-	call rx_read
-rx_body_124:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r11d, 1719505436
-	jns rx_i_237
-
-rx_i_125: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r8, 0ebec27cdh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_125
-	call rx_read
-rx_body_125:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 1774711622
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 069c7f346h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_126: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 01feb5264h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_126
-	call rx_read
-rx_body_126:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm2, xmm0
-
-rx_i_127: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0405f500fh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_127
-	call rx_read
-rx_body_127:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, -1027270754
-	imul rax, rcx
-	mov r8, rax
-
-rx_i_128: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0459f1154h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_128
-	call rx_read
-rx_body_128:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r9
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0cb2ee635h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_129: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 081918b4ch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_129
-	call rx_read
-rx_body_129:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp r13d, -590624856
-	jge rx_i_154
-
-rx_i_130: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 077c3b332h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_130
-	call rx_read
-rx_body_130:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -281794782
-	mov rdx, -8786110448882479839
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 27
-	sets dl
-	add rax, rdx
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0ef342722h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_131: ;RET
-	dec ebx
-	jz rx_finish
-	xor r12, 05792310bh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_131
-	call rx_read
-rx_body_131:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r15, rax
-	cmp rsp, rdi
-	je short rx_i_132
-	ret
-
-rx_i_132: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r10, 0ebc6e10h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_132
-	call rx_read
-rx_body_132:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 0b0c38959h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_133: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0822f8b60h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_133
-	call rx_read
-rx_body_133:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r13
-	mov r15, rax
-
-rx_i_134: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0d0f18593h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_134
-	call rx_read
-rx_body_134:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r8
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 05a5de2cbh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_135: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 088212ef9h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_135
-	call rx_read
-rx_body_135:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 0b29f3d2ah
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_136: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r8, 01ae56e03h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_136
-	call rx_read
-rx_body_136:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm8
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_137: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 015a24231h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_137
-	call rx_read
-rx_body_137:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	shr rax, cl
-	mov r11, rax
-
-rx_i_138: ;RET
-	dec ebx
-	jz rx_finish
-	xor r13, 02fd380c5h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_138
-	call rx_read
-rx_body_138:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 08e1fd158h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_139
-	ret
-
-rx_i_139: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r9, 093172470h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_139
-	call rx_read
-rx_body_139:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r8
-	mov r11, rax
-
-rx_i_140: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r14, 052543553h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_140
-	call rx_read
-rx_body_140:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, -140239781
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0f7a41c5bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_141: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 02f636da1h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_141
-	call rx_read
-rx_body_141:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 099ff9ffdh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_142: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r11, 0b11a4f2ch
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_142
-	call rx_read
-rx_body_142:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0516a9452h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r12d, 1365939282
-	js rx_i_257
-
-rx_i_143: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r15, 037f4b5d0h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_143
-	call rx_read
-rx_body_143:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r11d
-	imul rax, rcx
-	mov r9, rax
-
-rx_i_144: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r10, 02e59e00ah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_144
-	call rx_read
-rx_body_144:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, 1
-	mov edx, r11d
-	test edx, edx
-	cmovne ecx, edx
-	xor edx, edx
-	div rcx
-	mov r15, rax
-
-rx_i_145: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r13, 08d5c798h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_145
-	call rx_read
-rx_body_145:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 3712555397
-	mov rcx, 10670300378317066981
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0dd491985h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_146: ;IMULH_64
-	dec ebx
-	jz rx_finish
-	xor r13, 02327e6e2h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_146
-	call rx_read
-rx_body_146:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r12
-	imul rcx
-	mov rax, rdx
-	mov r10, rax
-
-rx_i_147: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 03a7df043h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_147
-	call rx_read
-rx_body_147:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r11
-	mov r12, rax
-
-rx_i_148: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0783e5c4eh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_148
-	call rx_read
-rx_body_148:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r14
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 08c783d2ch
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_149: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0aa0f5b2fh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_149
-	call rx_read
-rx_body_149:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r14d
-	imul rax, rcx
-	mov r8, rax
-
-rx_i_150: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 01504ca7ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_150
-	call rx_read
-rx_body_150:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, 1
-	mov edx, r8d
-	test edx, edx
-	cmovne ecx, edx
-	xor edx, edx
-	div rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0c854a524h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_151: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0ea72a7cfh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_151
-	call rx_read
-rx_body_151:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, -2018584590
-	mov r11, rax
-
-rx_i_152: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0ad0e7a88h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_152
-	call rx_read
-rx_body_152:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r10
-	sar rax, cl
-	mov r10, rax
-
-rx_i_153: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r15, 0fd95ab87h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_153
-	call rx_read
-rx_body_153:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_154: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r10, 0256697b0h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_154
-	call rx_read
-rx_body_154:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, -820047839
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0cf1f1021h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_155: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0d23f3b78h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_155
-	call rx_read
-rx_body_155:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r10
-	rol rax, cl
-	mov r13, rax
-
-rx_i_156: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r10, 098917533h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_156
-	call rx_read
-rx_body_156:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r15d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0b803e8a9h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_157: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0dfac3efch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_157
-	call rx_read
-rx_body_157:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r12
-	mov r14, rax
-
-rx_i_158: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0a64de090h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_158
-	call rx_read
-rx_body_158:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r13
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 04984392fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_159: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r13, 0952a3abbh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_159
-	call rx_read
-rx_body_159:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov r13, rax
-	cmp r15d, -8571241
-	ja short rx_i_160
-	call rx_i_181
-
-rx_i_160: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0b1685b90h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_160
-	call rx_read
-rx_body_160:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r14
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 05a86b929h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_161: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0ea992531h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_161
-	call rx_read
-rx_body_161:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov edx, r14d
-	cmp edx, -1
-	jne short body_idiv_161
-	neg rax
-	jmp short result_idiv_161
-body_idiv_161:
-	mov ecx, 1
-	test edx, edx
-	cmovne ecx, edx
-	movsxd rcx, ecx
-	cqo
-	idiv rcx
-result_idiv_161:
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0db9043dah
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_162: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 01fd57a4ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_162
-	call rx_read
-rx_body_162:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shl rax, 7
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0170a46d8h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_163: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0e3486c0ah
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_163
-	call rx_read
-rx_body_163:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r8
-	mov r14, rax
-
-rx_i_164: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 01f0c2737h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_164
-	call rx_read
-rx_body_164:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r9d
-	imul rax, rcx
-	mov r13, rax
-
-rx_i_165: ;RET
-	dec ebx
-	jz rx_finish
-	xor r12, 0debb493eh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_165
-	call rx_read
-rx_body_165:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp rsp, rdi
-	je short rx_i_166
-	ret
-
-rx_i_166: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0fe684081h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_166
-	call rx_read
-rx_body_166:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shr rax, 62
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0bb67f8abh
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_167: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0d10371ch
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_167
-	call rx_read
-rx_body_167:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm4
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm2, xmm0
-
-rx_i_168: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r12, 071b15effh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_168
-	call rx_read
-rx_body_168:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 08d1a76f8h
-	and eax, 131071
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_169: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r11, 072790347h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_169
-	call rx_read
-rx_body_169:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0b353bf8dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r10d, -1286357107
-	ja short rx_i_170
-	call rx_i_197
-
-rx_i_170: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r8, 04ae8a020h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_170
-	call rx_read
-rx_body_170:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm6, xmm0
-
-rx_i_171: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r15, 09901e05bh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_171
-	call rx_read
-rx_body_171:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 2064150457
-	add rax, 1
-	sbb rax, 0
-	mov rcx, 4797867461985617359
-	mul rcx
-	mov rax, rdx
-	shr rax, 29
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 07b086fb9h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_172: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r13, 050e8c510h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_172
-	call rx_read
-rx_body_172:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, -478081934
-	mov r12, rax
-
-rx_i_173: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 05422cf8fh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_173
-	call rx_read
-rx_body_173:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, -1386172772
-	mov r12, rax
-
-rx_i_174: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r12, 0a025c3dbh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_174
-	call rx_read
-rx_body_174:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 02be6989fh
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_175: ;XOR_32
-	dec ebx
-	jz rx_finish
-	xor r13, 08f74c11h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_175
-	call rx_read
-rx_body_175:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor eax, r8d
-	mov r8, rax
-
-rx_i_176: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r9, 01f2ed5f1h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_176
-	call rx_read
-rx_body_176:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, -2101315181
-	mov r10, rax
-
-rx_i_177: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0d2072c79h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_177
-	call rx_read
-rx_body_177:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, 794235831
-	mov r13, rax
-
-rx_i_178: ;RET
-	dec ebx
-	jz rx_finish
-	xor r15, 0a8e51933h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_178
-	call rx_read
-rx_body_178:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0c366b275h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_179
-	ret
-
-rx_i_179: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0934ad492h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_179
-	call rx_read
-rx_body_179:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm8, xmm0
-
-rx_i_180: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r15, 01cb3ce1fh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_180
-	call rx_read
-rx_body_180:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, r9d
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 076edfe13h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_181: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r10, 023c7845fh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_181
-	call rx_read
-rx_body_181:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r10, rax
-	cmp r12d, -1612576918
-	jbe short rx_i_182
-	call rx_i_211
-
-rx_i_182: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r8, 0f8884327h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_182
-	call rx_read
-rx_body_182:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 07c8d12a5h
-	and eax, 131071
-	movhpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_183: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r13, 013070461h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_183
-	call rx_read
-rx_body_183:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r11
-	mov r10, rax
-
-rx_i_184: ;XOR_32
-	dec ebx
-	jz rx_finish
-	xor r12, 04764cdf7h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_184
-	call rx_read
-rx_body_184:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor eax, r13d
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 02f185447h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_185: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r10, 03c41026fh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_185
-	call rx_read
-rx_body_185:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0a5fae4a3h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r15d, -1510284125
-	jbe rx_i_246
-
-rx_i_186: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0cded414bh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_186
-	call rx_read
-rx_body_186:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, -1252263008
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0b55bfba0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_187: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r13, 05c6d64a8h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_187
-	call rx_read
-rx_body_187:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_188: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 04659becbh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_188
-	call rx_read
-rx_body_188:
-	xor rbp, rax
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm4, xmm0
-
-rx_i_189: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r11, 0c52741d5h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_189
-	call rx_read
-rx_body_189:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm7
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_190: ;RET
-	dec ebx
-	jz rx_finish
-	xor r12, 0217bf5f3h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_190
-	call rx_read
-rx_body_190:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r13, rax
-	cmp rsp, rdi
-	je short rx_i_191
-	ret
-
-rx_i_191: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r15, 0884f3526h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_191
-	call rx_read
-rx_body_191:
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm6, xmm0
-
-rx_i_192: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r8, 0d76edad3h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_192
-	call rx_read
-rx_body_192:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm8, xmm0
-
-rx_i_193: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0e9939ach
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_193
-	call rx_read
-rx_body_193:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r12d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 074e097dch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_194: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r12, 0f21ca520h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_194
-	call rx_read
-rx_body_194:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_195: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 09405152ch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_195
-	call rx_read
-rx_body_195:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shl rax, 27
-	mov r9, rax
-
-rx_i_196: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0c2a9f41bh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_196
-	call rx_read
-rx_body_196:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r8
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 08e47b269h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_197: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0229208efh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_197
-	call rx_read
-rx_body_197:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0b1d1e60dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_198: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0c8d95bbbh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_198
-	call rx_read
-rx_body_198:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	mul rcx
-	mov rax, rdx
-	mov r8, rax
-
-rx_i_199: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r13, 050049e2eh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_199
-	call rx_read
-rx_body_199:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r10
-	mul rcx
-	mov rax, rdx
-	mov r10, rax
-
-rx_i_200: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r10, 0c63b99e8h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_200
-	call rx_read
-rx_body_200:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm4, xmm0
-
-rx_i_201: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0cdda801dh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_201
-	call rx_read
-rx_body_201:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 040cfe68eh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_202: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 0fa44b04ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_202
-	call rx_read
-rx_body_202:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm5, xmm0
-
-rx_i_203: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r10, 0d73e472ch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_203
-	call rx_read
-rx_body_203:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 09bdff355h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_204: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 01af8ab1dh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_204
-	call rx_read
-rx_body_204:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov r8, rax
-
-rx_i_205: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r14, 094e997c5h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_205
-	call rx_read
-rx_body_205:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm8
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-
-rx_i_206: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r11, 0e836a177h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_206
-	call rx_read
-rx_body_206:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 0d01fb731h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_207: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 039ccdd30h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_207
-	call rx_read
-rx_body_207:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 314297476
-	mov rdx, 1969376361274661135
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 25
-	sets dl
-	add rax, rdx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 012bbcc84h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_208: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0f4f126c5h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_208
-	call rx_read
-rx_body_208:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, -486588965
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0e2ff3ddbh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_209: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0b84811f1h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_209
-	call rx_read
-rx_body_209:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r15
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0c36b836ah
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_210: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0c5efc90ah
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_210
-	call rx_read
-rx_body_210:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r12d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0c2c6bee0h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_211: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0ce533072h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_211
-	call rx_read
-rx_body_211:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0212e615h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_212: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 06b465fdbh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_212
-	call rx_read
-rx_body_212:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r13
-	mov r15, rax
-
-rx_i_213: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 02dd1d503h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_213
-	call rx_read
-rx_body_213:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r14d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 07bf8b75h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_214: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0a159f313h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_214
-	call rx_read
-rx_body_214:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	shl rax, cl
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0936ebe0bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_215: ;ADD_32
-	dec ebx
-	jz rx_finish
-	xor r15, 08359265eh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_215
-	call rx_read
-rx_body_215:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add eax, r12d
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 01194f02bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_216: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 080696de3h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_216
-	call rx_read
-rx_body_216:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r13
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 03b609d2bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_217: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r8, 040d5b526h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_217
-	call rx_read
-rx_body_217:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r9d
-	imul rax, rcx
-	mov r10, rax
-
-rx_i_218: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r11, 083c0bd93h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_218
-	call rx_read
-rx_body_218:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm3, xmm0
-
-rx_i_219: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0ca37f668h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_219
-	call rx_read
-rx_body_219:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r10
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0d3d68798h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_220: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0bb44c384h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_220
-	call rx_read
-rx_body_220:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r11d
-	imul rax, rcx
-	mov r11, rax
-
-rx_i_221: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0a3deb512h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_221
-	call rx_read
-rx_body_221:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, 1
-	mov edx, r15d
-	test edx, edx
-	cmovne ecx, edx
-	xor edx, edx
-	div rcx
-	mov r11, rax
-
-rx_i_222: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r9, 084a02d64h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_222
-	call rx_read
-rx_body_222:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_223: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r8, 01e5cc085h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_223
-	call rx_read
-rx_body_223:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 07fca59eeh
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_224: ;XOR_32
-	dec ebx
-	jz rx_finish
-	xor r12, 053982440h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_224
-	call rx_read
-rx_body_224:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	xor eax, -452933987
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0e500c69dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_225: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0c558367eh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_225
-	call rx_read
-rx_body_225:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 4264577610
-	shr rax, 1
-	mov rcx, 9289098447696480965
-	mul rcx
-	mov rax, rdx
-	shr rax, 30
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0fe304a4ah
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_226: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r10, 040139b65h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_226
-	call rx_read
-rx_body_226:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp r8d, -1752488808
-	jno rx_i_328
-
-rx_i_227: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0fa312dbdh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_227
-	call rx_read
-rx_body_227:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm7
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 0aabe2a0ah
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_228: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r11, 0b64246c0h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_228
-	call rx_read
-rx_body_228:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm7, xmm0
-	mov eax, r15d
-	xor eax, 0ffdff798h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_229: ;IMULH_64
-	dec ebx
-	jz rx_finish
-	xor r11, 05c535836h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_229
-	call rx_read
-rx_body_229:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, 334017248
-	imul rcx
-	mov rax, rdx
-	mov r13, rax
-
-rx_i_230: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r15, 0f394972eh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_230
-	call rx_read
-rx_body_230:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 01dc2b4f6h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_231: ;RET
-	dec ebx
-	jz rx_finish
-	xor r9, 0bb56428dh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_231
-	call rx_read
-rx_body_231:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp rsp, rdi
-	je short rx_i_232
-	ret
-
-rx_i_232: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r15, 09ab46ab3h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_232
-	call rx_read
-rx_body_232:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 07e732935h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_233: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r13, 08eb2cd76h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_233
-	call rx_read
-rx_body_233:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r14, rax
-	cmp r12d, 392389867
-	jo rx_i_268
-
-rx_i_234: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r15, 0ba687578h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_234
-	call rx_read
-rx_body_234:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm4
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_235: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 0b6cb9ff2h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_235
-	call rx_read
-rx_body_235:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 212286089
-	imul rax, rcx
-	mov r15, rax
-
-rx_i_236: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 03ad196ach
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_236
-	call rx_read
-rx_body_236:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm3, xmm0
-
-rx_i_237: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r15, 0fab4600h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_237
-	call rx_read
-rx_body_237:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r12d, -121899164
-	jge rx_i_295
-
-rx_i_238: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0158f119fh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_238
-	call rx_read
-rx_body_238:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm7, xmm0
-
-rx_i_239: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r13, 044f30b3fh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_239
-	call rx_read
-rx_body_239:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0e42cdf41h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_240: ;IMULH_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0d65d29f9h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_240
-	call rx_read
-rx_body_240:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	imul rcx
-	mov rax, rdx
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0e6bcdcfbh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_241: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r11, 0ce5260adh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_241
-	call rx_read
-rx_body_241:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm7, xmm0
-
-rx_i_242: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 01119b0f9h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_242
-	call rx_read
-rx_body_242:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r12d
-	imul rax, rcx
-	mov r10, rax
-
-rx_i_243: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0d6c2ce3dh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_243
-	call rx_read
-rx_body_243:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r9
-	mov r14, rax
-
-rx_i_244: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0c6a6248h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_244
-	call rx_read
-rx_body_244:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0b4a1fad6h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_245: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r13, 084505739h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_245
-	call rx_read
-rx_body_245:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, r10d
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0a3d1ad8bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_246: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r15, 027eeaa2eh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_246
-	call rx_read
-rx_body_246:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -156808488
-	mov rdx, -3947299202596036367
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 25
-	sets dl
-	add rax, rdx
-	mov r12, rax
-
-rx_i_247: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r10, 0c4de0296h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_247
-	call rx_read
-rx_body_247:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r14d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 03814cf80h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_248: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r8, 0649df46fh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_248
-	call rx_read
-rx_body_248:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r15d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 07b10fc32h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_249: ;IMULH_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0499552cch
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_249
-	call rx_read
-rx_body_249:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, -508571655
-	imul rcx
-	mov rax, rdx
-	mov r13, rax
-
-rx_i_250: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 083eafe6fh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_250
-	call rx_read
-rx_body_250:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r8
-	mov r14, rax
-
-rx_i_251: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r13, 0a25a4d8ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_251
-	call rx_read
-rx_body_251:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_252: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 08a75ad41h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_252
-	call rx_read
-rx_body_252:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shl rax, 53
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0b178001h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_253: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r14, 057f3f596h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_253
-	call rx_read
-rx_body_253:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0654b460bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r15d, 1699431947
-	js short rx_i_254
-	call rx_i_367
-
-rx_i_254: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r14, 04cfb709eh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_254
-	call rx_read
-rx_body_254:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm8, xmm0
-
-rx_i_255: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0b96ec9ech
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_255
-	call rx_read
-rx_body_255:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 0ae781d10h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_256: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r8, 08375472ch
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_256
-	call rx_read
-rx_body_256:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r15
-	mul rcx
-	mov rax, rdx
-	mov r9, rax
-
-rx_i_257: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0d75a8c3fh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_257
-	call rx_read
-rx_body_257:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm3, xmm0
-
-rx_i_258: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 064fdbda0h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_258
-	call rx_read
-rx_body_258:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r14d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 01c58ef2dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_259: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r11, 02e36a073h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_259
-	call rx_read
-rx_body_259:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 06c1856f0h
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_260: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 0f94e9fa9h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_260
-	call rx_read
-rx_body_260:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm5
-	movaps xmm9, xmm0
-
-rx_i_261: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r14, 02346171ch
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_261
-	call rx_read
-rx_body_261:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 0745a48e9h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_262: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r10, 01c42baa6h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_262
-	call rx_read
-rx_body_262:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, -1569587450
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0a271ff06h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_263: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0b39b140h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_263
-	call rx_read
-rx_body_263:
-	xor rbp, rax
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm8
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-
-rx_i_264: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 01a07d201h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_264
-	call rx_read
-rx_body_264:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_265: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 07a3eb340h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_265
-	call rx_read
-rx_body_265:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm8
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 04c559414h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_266: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r13, 03d0a3a89h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_266
-	call rx_read
-rx_body_266:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r10, rax
-	cmp r12d, 136160027
-	jbe short rx_i_267
-	call rx_i_295
-
-rx_i_267: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0c6c7b37h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_267
-	call rx_read
-rx_body_267:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r10
-	rol rax, cl
-	mov r11, rax
-
-rx_i_268: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r12, 0c2510cebh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_268
-	call rx_read
-rx_body_268:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0850bf8dah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r15d, -2062812966
-	jl rx_i_381
-
-rx_i_269: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0c80cc899h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_269
-	call rx_read
-rx_body_269:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	rol rax, 50
-	mov r10, rax
-
-rx_i_270: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0eb355caah
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_270
-	call rx_read
-rx_body_270:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 03981662bh
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_271: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 0c6f12299h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_271
-	call rx_read
-rx_body_271:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r10d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 086ddd754h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_272: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0695a5dd2h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_272
-	call rx_read
-rx_body_272:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, r12
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0d45957b7h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_273: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 0d315e4dch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_273
-	call rx_read
-rx_body_273:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r13, rax
-	cmp r12d, 1670848568
-	jl rx_i_372
-
-rx_i_274: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0b66ca7e0h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_274
-	call rx_read
-rx_body_274:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm6, xmm0
-
-rx_i_275: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0788eceb7h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_275
-	call rx_read
-rx_body_275:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -333089764
-	mov rdx, -7433071640624659213
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 27
-	sets dl
-	add rax, rdx
-	mov r13, rax
-
-rx_i_276: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 0c6ac5edah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_276
-	call rx_read
-rx_body_276:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov r12, rax
-	cmp r11d, -1236180570
-	jns rx_i_404
-
-rx_i_277: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 0c9549789h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_277
-	call rx_read
-rx_body_277:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r10d
-	imul rax, rcx
-	mov r9, rax
-
-rx_i_278: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 0a2bc66c9h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_278
-	call rx_read
-rx_body_278:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm4, xmm0
-
-rx_i_279: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0f1a91458h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_279
-	call rx_read
-rx_body_279:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 0475ade01h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_280: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r12, 066246b43h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_280
-	call rx_read
-rx_body_280:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 555412224
-	mov rdx, 2228867111296024113
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 26
-	sets dl
-	add rax, rdx
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0211aeb00h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_281: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 05a762727h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_281
-	call rx_read
-rx_body_281:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, -202979002
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0f3e6c946h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_282: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0de1ab603h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_282
-	call rx_read
-rx_body_282:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r12
-	mov r11, rax
-
-rx_i_283: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0df4d084fh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_283
-	call rx_read
-rx_body_283:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r12
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0bb0da7d0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_284: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0e68f36ach
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_284
-	call rx_read
-rx_body_284:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 0936f2960h
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_285: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r8, 09adb333bh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_285
-	call rx_read
-rx_body_285:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r8d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 09308cd6dh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_286: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 082f5e36ch
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_286
-	call rx_read
-rx_body_286:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	rol rax, cl
-	mov r15, rax
-
-rx_i_287: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r11, 049547c9ch
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_287
-	call rx_read
-rx_body_287:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 1227278330
-	mov rdx, 8069498232143512385
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 29
-	sets dl
-	add rax, rdx
-	mov r8, rax
-
-rx_i_288: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 08716ac8bh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_288
-	call rx_read
-rx_body_288:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r8
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 062eafa1bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_289: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r14, 0efef52b5h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_289
-	call rx_read
-rx_body_289:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_290: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r15, 060665748h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_290
-	call rx_read
-rx_body_290:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 02f4d18d7h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_291: ;RET
-	dec ebx
-	jz rx_finish
-	xor r13, 0ddf4bd1ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_291
-	call rx_read
-rx_body_291:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0768a9d75h
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_292
-	ret
-
-rx_i_292: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r13, 05a87cc3dh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_292
-	call rx_read
-rx_body_292:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r8
-	rol rax, cl
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 035600fe9h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_293: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0c61f4279h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_293
-	call rx_read
-rx_body_293:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 014844990h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_294: ;RET
-	dec ebx
-	jz rx_finish
-	xor r14, 0f3b9d85h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_294
-	call rx_read
-rx_body_294:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp rsp, rdi
-	je short rx_i_295
-	ret
-
-rx_i_295: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 0f42798fdh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_295
-	call rx_read
-rx_body_295:
-	xor rbp, rax
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 08a66e69fh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_296: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r14, 018738758h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_296
-	call rx_read
-rx_body_296:
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm8, xmm0
-	mov eax, r8d
-	xor eax, 0f3a594cah
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_297: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0de3b9d9bh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_297
-	call rx_read
-rx_body_297:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov r14, rax
-
-rx_i_298: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r14, 084f53637h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_298
-	call rx_read
-rx_body_298:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 0d10f7c42h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_299: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r12, 042f4897h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_299
-	call rx_read
-rx_body_299:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov r12, rax
-
-rx_i_300: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r12, 095765693h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_300
-	call rx_read
-rx_body_300:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm8
-	movaps xmm2, xmm0
-
-rx_i_301: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 0a0ec5eech
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_301
-	call rx_read
-rx_body_301:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm5
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_302: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0f6f8c345h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_302
-	call rx_read
-rx_body_302:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0afbbe406h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_303: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r14, 082a3e965h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_303
-	call rx_read
-rx_body_303:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm9, xmm0
-
-rx_i_304: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 04940c652h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_304
-	call rx_read
-rx_body_304:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 2007686513
-	mov r13, rax
-
-rx_i_305: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 03c6c62b8h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_305
-	call rx_read
-rx_body_305:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0fc12db20h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_306: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 08b34cdfch
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_306
-	call rx_read
-rx_body_306:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, 400578979
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 017e059a3h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_307: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r15, 04c36adb1h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_307
-	call rx_read
-rx_body_307:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shl rax, 33
-	mov r10, rax
-
-rx_i_308: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0a4213b21h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_308
-	call rx_read
-rx_body_308:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r13
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0c2d34e82h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_309: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 090c42304h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_309
-	call rx_read
-rx_body_309:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 2642117268
-	mov rcx, 14993309243657753043
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov r9, rax
-
-rx_i_310: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r9, 0f78e1c8ch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_310
-	call rx_read
-rx_body_310:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm7, xmm0
-
-rx_i_311: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 0ff8848cfh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_311
-	call rx_read
-rx_body_311:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm4
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_312: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 0b18904cdh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_312
-	call rx_read
-rx_body_312:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r14d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0bb93ffb8h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_313: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0a0d0befh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_313
-	call rx_read
-rx_body_313:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 62
-	mov r14, rax
-
-rx_i_314: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r15, 01e3c65f7h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_314
-	call rx_read
-rx_body_314:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 2143811925
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 07fc7f955h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_315: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 02e36ddafh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_315
-	call rx_read
-rx_body_315:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r15
-	mov r9, rax
-
-rx_i_316: ;RET
-	dec ebx
-	jz rx_finish
-	xor r14, 05b0cb5bbh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_316
-	call rx_read
-rx_body_316:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 03602c513h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_317
-	ret
-
-rx_i_317: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0c74e7415h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_317
-	call rx_read
-rx_body_317:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm7
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0b5bc8h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_318: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 057621d9ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_318
-	call rx_read
-rx_body_318:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r11
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 061cb9db8h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_319: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r13, 08ee02d99h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_319
-	call rx_read
-rx_body_319:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shr rax, 46
-	mov r11, rax
-
-rx_i_320: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 013461188h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_320
-	call rx_read
-rx_body_320:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm2, xmm0
-
-rx_i_321: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 0a7bae383h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_321
-	call rx_read
-rx_body_321:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r9d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0f213dach
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_322: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r14, 08215399bh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_322
-	call rx_read
-rx_body_322:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp r11d, 1411981860
-	jno short rx_i_323
-	call rx_i_343
-
-rx_i_323: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r14, 07b07664bh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_323
-	call rx_read
-rx_body_323:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r14
-	mul rcx
-	mov rax, rdx
-	mov r14, rax
-
-rx_i_324: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r9, 0f956baffh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_324
-	call rx_read
-rx_body_324:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-
-rx_i_325: ;OR_32
-	dec ebx
-	jz rx_finish
-	xor r11, 0708ab9d1h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_325
-	call rx_read
-rx_body_325:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or eax, r8d
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0ef376c54h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_326: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0d1b27540h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_326
-	call rx_read
-rx_body_326:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, -1233771581
-	mul rcx
-	mov rax, rdx
-	mov r9, rax
-
-rx_i_327: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 09665f98dh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_327
-	call rx_read
-rx_body_327:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 1572662125
-	mov rcx, rax
-	mov rdx, -5852150286715358951
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	add rax, rcx
-	sar rax, 30
-	sets dl
-	add rax, rdx
-	mov r12, rax
-
-rx_i_328: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0fb9c32adh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_328
-	call rx_read
-rx_body_328:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shr rax, 18
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 04d159415h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_329: ;RET
-	dec ebx
-	jz rx_finish
-	xor r11, 0e1110623h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_329
-	call rx_read
-rx_body_329:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp rsp, rdi
-	je short rx_i_330
-	ret
-
-rx_i_330: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0f6a93f19h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_330
-	call rx_read
-rx_body_330:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, -1349816041
-	imul rax, rcx
-	mov r11, rax
-
-rx_i_331: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0bc9bbe4ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_331
-	call rx_read
-rx_body_331:
-	xor rbp, rax
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm9, xmm0
-
-rx_i_332: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0f253cd4eh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_332
-	call rx_read
-rx_body_332:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm3, xmm0
-
-rx_i_333: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0f009758bh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_333
-	call rx_read
-rx_body_333:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r12
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0f58fcaa8h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_334: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0dda04168h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_334
-	call rx_read
-rx_body_334:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r13
-	mov r8, rax
-
-rx_i_335: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r15, 03e6cfb73h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_335
-	call rx_read
-rx_body_335:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r8
-	mov r12, rax
-
-rx_i_336: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0aea0a435h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_336
-	call rx_read
-rx_body_336:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 42
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 02644c5ah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_337: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r8, 03d6c4ab2h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_337
-	call rx_read
-rx_body_337:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r12
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0dab07c39h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_338: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0d428a742h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_338
-	call rx_read
-rx_body_338:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r12
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0184d2abbh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_339: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 04596ef73h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_339
-	call rx_read
-rx_body_339:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm2, xmm0
-
-rx_i_340: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0e51629cch
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_340
-	call rx_read
-rx_body_340:
-	and eax, 131071
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 038b653beh
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_341: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 019eb9ea5h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_341
-	call rx_read
-rx_body_341:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r15d
-	imul rax, rcx
-	mov r8, rax
-
-rx_i_342: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 09ccc7abah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_342
-	call rx_read
-rx_body_342:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm3, xmm0
-
-rx_i_343: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 056f6cf0bh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_343
-	call rx_read
-rx_body_343:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r13
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 0d9a469a9h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_344: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r10, 03ef9bcc4h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_344
-	call rx_read
-rx_body_344:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm6
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0627d9feah
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_345: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0bbbcdbach
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_345
-	call rx_read
-rx_body_345:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r13
-	mul rcx
-	mov rax, rdx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0ef03b0ddh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_346: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0ae9d1e96h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_346
-	call rx_read
-rx_body_346:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, r15d
-	mov r13, rax
-
-rx_i_347: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r14, 070c34d69h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_347
-	call rx_read
-rx_body_347:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0d529429ah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_348: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 0523ff904h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_348
-	call rx_read
-rx_body_348:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 039c35461h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_349: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 018e0e5ddh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_349
-	call rx_read
-rx_body_349:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r15
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 05c449453h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_350: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r9, 09bd050f0h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_350
-	call rx_read
-rx_body_350:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r12, rax
-	cmp r9d, -980411581
-	ja short rx_i_351
-	call rx_i_352
-
-rx_i_351: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0a3a5906fh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_351
-	call rx_read
-rx_body_351:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0985ba4h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_352: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r10, 0afc9af2bh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_352
-	call rx_read
-rx_body_352:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 03bf686f2h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_353: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 02e65278bh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_353
-	call rx_read
-rx_body_353:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm7, xmm0
-
-rx_i_354: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 02412fc10h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_354
-	call rx_read
-rx_body_354:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r13d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 049cc2e0ch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_355: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 06bd6e65fh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_355
-	call rx_read
-rx_body_355:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r14
-	mov r8, rax
-
-rx_i_356: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 01cd85d80h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_356
-	call rx_read
-rx_body_356:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov r11, rax
-
-rx_i_357: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0f7daed36h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_357
-	call rx_read
-rx_body_357:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r11
-	mov r11, rax
-
-rx_i_358: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r13, 088fa6e5ah
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_358
-	call rx_read
-rx_body_358:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 3667831238
-	shr rax, 1
-	mov rcx, 2700102505175032865
-	mul rcx
-	mov rax, rdx
-	shr rax, 28
-	mov r9, rax
-
-rx_i_359: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r10, 0714fc2cdh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_359
-	call rx_read
-rx_body_359:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm9
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 0f16b9be3h
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_360: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r10, 0c2d110b5h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_360
-	call rx_read
-rx_body_360:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm8
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 0c41a4103h
-	and eax, 131071
-	movlpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_361: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r15, 01d125a7fh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_361
-	call rx_read
-rx_body_361:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-
-rx_i_362: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0ed8954bdh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_362
-	call rx_read
-rx_body_362:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r9
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 04080bf8dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_363: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r12, 09f75887bh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_363
-	call rx_read
-rx_body_363:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm6
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm3, xmm0
-
-rx_i_364: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 0badaf867h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_364
-	call rx_read
-rx_body_364:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r8d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0bb8ee9ch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_365: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r15, 02db4444ah
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_365
-	call rx_read
-rx_body_365:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r9d
-	imul rax, rcx
-	mov r12, rax
-
-rx_i_366: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 0bff7218fh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_366
-	call rx_read
-rx_body_366:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r8d
-	imul rax, rcx
-	mov r15, rax
-
-rx_i_367: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 04d14cb3ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_367
-	call rx_read
-rx_body_367:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 18
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0ad9b92e8h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_368: ;SUB_32
-	dec ebx
-	jz rx_finish
-	xor r10, 0a14836bah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_368
-	call rx_read
-rx_body_368:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub eax, r10d
-	mov r8, rax
-
-rx_i_369: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 053fe22e2h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_369
-	call rx_read
-rx_body_369:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 470792991
-	mov rdx, 1314739240972876203
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 25
-	sets dl
-	add rax, rdx
-	mov r9, rax
-
-rx_i_370: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r15, 010e1fb24h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_370
-	call rx_read
-rx_body_370:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm6
-	movaps xmm6, xmm0
-
-rx_i_371: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0ebbd5cc9h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_371
-	call rx_read
-rx_body_371:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0c40fe413h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_372: ;SHL_64
-	dec ebx
-	jz rx_finish
-	xor r10, 098ab79d7h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_372
-	call rx_read
-rx_body_372:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r13
-	shl rax, cl
-	mov r9, rax
-
-rx_i_373: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r15, 056438b3h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_373
-	call rx_read
-rx_body_373:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm8
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-
-rx_i_374: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0dbcce604h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_374
-	call rx_read
-rx_body_374:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 03507e810h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_375: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0edea6200h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_375
-	call rx_read
-rx_body_375:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, -332030999
-	mov r12, rax
-
-rx_i_376: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r14, 05e61b279h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_376
-	call rx_read
-rx_body_376:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r9
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 01c614282h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_377: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r14, 0fc1fb433h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_377
-	call rx_read
-rx_body_377:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm7, xmm0
-
-rx_i_378: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 082aa21ach
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_378
-	call rx_read
-rx_body_378:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r14d
-	imul rax, rcx
-	mov r15, rax
-
-rx_i_379: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r10, 05dba41fbh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_379
-	call rx_read
-rx_body_379:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	ror rax, cl
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 03a2dc429h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_380: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0229e3d6eh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_380
-	call rx_read
-rx_body_380:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0a9fd85e0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_381: ;XOR_32
-	dec ebx
-	jz rx_finish
-	xor r8, 019816ff9h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_381
-	call rx_read
-rx_body_381:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor eax, r14d
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 032349ff8h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_382: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 036b5b81fh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_382
-	call rx_read
-rx_body_382:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	rol rax, 55
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0a6a2e0b1h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_383: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r15, 05f798ec3h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_383
-	call rx_read
-rx_body_383:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm4
-	movaps xmm5, xmm0
-
-rx_i_384: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r10, 05b459fd7h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_384
-	call rx_read
-rx_body_384:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, 1413715044
-	mov r9, rax
-
-rx_i_385: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0c91749bbh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_385
-	call rx_read
-rx_body_385:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r12
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 0fb9b50b9h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_386: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0575b4bdch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_386
-	call rx_read
-rx_body_386:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
+	; ISUB_R r0, r4
+	sub r8, r12
+	; IROR_R r5, 15
+	ror r13, 15
+	; ISUB_M r6, L1[r5]
+	mov eax, r13d
+	and eax, 16376
+	sub r14, qword ptr [rsi+rax]
+	; IMUL_R r7, r6
+	imul r15, r14
+	; FPADD_R f3, a1
+	addpd xmm3, xmm9
+	; FPMUL_R e1, a3
+	mulpd xmm5, xmm11
+	; IMUL_R r2, r4
+	imul r10, r12
+	; IADD_RC r4, r5, 1789610138
+	lea r12, [r12+r13+1789610138]
+	; IADD_R r1, r4
+	add r9, r12
+	; IADD_R r6, r0
+	add r14, r8
+	; IXOR_R r7, r2
+	xor r15, r10
+	; ISMULH_M r6, L1[6816]
+	mov rax, r14
+	imul qword ptr [rsi+6816]
+	mov r14, rdx
+	; ISUB_R r0, r4
+	sub r8, r12
+	; IXOR_R r7, r2
+	xor r15, r10
+	; INEG_R r4
+	neg r12
+	; IROL_R r3, r0
+	mov ecx, r8d
+	rol r11, cl
+	; IADD_RC r2, r5, -1667142135
+	lea r10, [r10+r13-1667142135]
+	; ISUB_R r6, r2
+	sub r14, r10
+	; IDIV_C r3, 2650709570
+	mov rax, 3736177069856446853
+	mul r11
+	shr rdx, 29
+	add r11, rdx
+	; IMULH_R r3, r0
+	mov rax, r11
+	mul r8
+	mov r11, rdx
+	; FPSUB_R f0, a2
+	subpd xmm0, xmm10
+	; FPADD_M f3, L2[r4]
+	mov eax, r12d
+	and eax, 262136
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	addpd xmm3, xmm12
+	; FPMUL_M e1, L1[r5]
+	mov eax, r13d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	mulpd xmm5, xmm12
+	maxpd xmm5, xmm13
+	; IMUL_9C r7, -778247271
+	lea r15, [r15+r15*8-778247271]
+	; IXOR_R r4, 1846379510
+	xor r12, 1846379510
+	; COND_M r6, of(L1[r1], -397786451)
+	xor ecx, ecx
+	mov eax, r9d
+	and eax, 16376
+	cmp dword ptr [rsi+rax], -397786451
+	seto cl
+	add r14, rcx
+	; COND_R r6, of(r3, -1033710571)
+	xor ecx, ecx
+	cmp r11d, -1033710571
+	seto cl
+	add r14, rcx
+	; COND_M r6, sg(L1[r6], 1413230028)
+	xor ecx, ecx
+	mov eax, r14d
+	and eax, 16376
+	cmp dword ptr [rsi+rax], 1413230028
+	sets cl
+	add r14, rcx
+	; IDIV_C r0, 2791108943
+	mov rax, 1774119268816201525
+	mul r8
+	shr rdx, 28
+	add r8, rdx
+	; FPSUB_M f1, L1[r6]
+	mov eax, r14d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	subpd xmm1, xmm12
+	; FPSWAP_R f0
+	shufpd xmm0, xmm0, 1
+	; IADD_RC r6, r5, -640194892
+	lea r14, [r14+r13-640194892]
+	; FPADD_M f0, L1[r2]
+	mov eax, r10d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	addpd xmm0, xmm12
+	; IMUL_R r6, r5
+	imul r14, r13
+	; IROL_R r4, r1
+	mov ecx, r9d
+	rol r12, cl
+	; FPDIV_R e2, a0
+	divpd xmm6, xmm8
+	maxpd xmm6, xmm13
+	; IADD_RC r0, r2, -487084195
+	lea r8, [r8+r10-487084195]
+	; FPADD_R f0, a0
 	addpd xmm0, xmm8
-	movaps xmm9, xmm0
-
-rx_i_387: ;SUB_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0d4f7bc6ah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_387
-	call rx_read
-rx_body_387:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub eax, r15d
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 028cbb7adh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_388: ;RET
-	dec ebx
-	jz rx_finish
-	xor r8, 08a949356h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_388
-	call rx_read
-rx_body_388:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp rsp, rdi
-	je short rx_i_389
-	ret
-
-rx_i_389: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r11, 06531ad2eh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_389
-	call rx_read
-rx_body_389:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0eb1a1f50h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r9d, -350609584
-	jge rx_i_421
-
-rx_i_390: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 02914abeah
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_390
-	call rx_read
-rx_body_390:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 0e5c5acbbh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_391: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0473a41f0h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_391
-	call rx_read
-rx_body_391:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm6, xmm0
-
-rx_i_392: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 01ebc1f0dh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_392
-	call rx_read
-rx_body_392:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	sar rax, cl
-	mov r13, rax
-
-rx_i_393: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0742e95b1h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_393
-	call rx_read
-rx_body_393:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, r12
-	mov r13, rax
-
-rx_i_394: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0db885c2ch
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_394
-	call rx_read
-rx_body_394:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
+	; IXOR_R r5, r3
+	xor r13, r11
+	; IMUL_R r2, r4
+	imul r10, r12
+	; FPMUL_R e0, a0
+	mulpd xmm4, xmm8
+	; FPSUB_R f3, a3
+	subpd xmm3, xmm11
+	; IMUL_M r4, L1[4856]
+	imul r12, qword ptr [rsi+4856]
+	; IMUL_9C r2, 7951348
+	lea r10, [r10+r10*8+7951348]
+	; COND_R r3, ab(r7, 984532162)
+	xor ecx, ecx
+	cmp r15d, 984532162
+	seta cl
+	add r11, rcx
+	; IXOR_M r7, L1[r4]
+	mov eax, r12d
+	and eax, 16376
+	xor r15, qword ptr [rsi+rax]
+	; IMUL_R r4, 248971329
+	imul r12, 248971329
+	; IXOR_R r3, r1
+	xor r11, r9
+	; IMUL_R r3, 2098482639
+	imul r11, 2098482639
+	; IXOR_R r6, r3
+	xor r14, r11
+	; IXOR_R r5, r4
+	xor r13, r12
+	; IADD_R r5, r4
+	add r13, r12
+	; IMUL_9C r7, 66530302
+	lea r15, [r15+r15*8+66530302]
+	; IMULH_R r0, r5
+	mov rax, r8
+	mul r13
+	mov r8, rdx
+	; IMUL_R r2, r7
+	imul r10, r15
+	; IMUL_R r1, 770985098
+	imul r9, 770985098
+	; COND_R r7, be(r5, 58538265)
+	xor ecx, ecx
+	cmp r13d, 58538265
+	setbe cl
+	add r15, rcx
+	; IMUL_9C r3, 245704334
+	lea r11, [r11+r11*8+245704334]
+	; ISMULH_R r2, r4
+	mov rax, r10
+	imul r12
+	mov r10, rdx
+	; FPDIV_R e3, a3
+	divpd xmm7, xmm11
+	maxpd xmm7, xmm13
+	; IMULH_R r5, r2
+	mov rax, r13
+	mul r10
+	mov r13, rdx
+	; ISUB_M r7, L1[r5]
+	mov eax, r13d
+	and eax, 16376
+	sub r15, qword ptr [rsi+rax]
+	; FPMUL_R e3, a3
+	mulpd xmm7, xmm11
+	; IMUL_R r3, r4
+	imul r11, r12
+	; FPSWAP_R f1
+	shufpd xmm1, xmm1, 1
+	; IMULH_R r1, 633797287
+	mov eax, 633797287
+	mul r9
+	add r9, rdx
+	; IADD_R r4, r3
+	add r12, r11
+	; IROR_R r2, r7
+	mov ecx, r15d
+	ror r10, cl
+	; FPSUB_R f0, a2
+	subpd xmm0, xmm10
+	; FPSUB_R f2, a2
+	subpd xmm2, xmm10
+	; FPMUL_R e0, a2
+	mulpd xmm4, xmm10
+	; IMUL_M r4, L1[r3]
+	mov eax, r11d
+	and eax, 16376
+	imul r12, qword ptr [rsi+rax]
+	; IMUL_9C r1, -1901091890
+	lea r9, [r9+r9*8-1901091890]
+	; IROR_R r2, r6
+	mov ecx, r14d
+	ror r10, cl
+	; IMULH_R r5, r3
+	mov rax, r13
+	mul r11
+	mov r13, rdx
+	; FPSUB_M f1, L1[r7]
+	mov eax, r15d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	subpd xmm1, xmm12
+	; IMUL_M r2, L1[r1]
+	mov eax, r9d
+	and eax, 16376
+	imul r10, qword ptr [rsi+rax]
+	; IMUL_R r6, r0
+	imul r14, r8
+	; IADD_R r7, r6
+	add r15, r14
+	; FPSUB_R f2, a3
+	subpd xmm2, xmm11
+	; COND_R r5, no(r2, -1589295370)
+	xor ecx, ecx
+	cmp r10d, -1589295370
+	setno cl
+	add r13, rcx
+	; IMUL_9C r7, 420978486
+	lea r15, [r15+r15*8+420978486]
+	; IROL_R r4, r2
+	mov ecx, r10d
+	rol r12, cl
+	; IMUL_9C r0, -1084530831
+	lea r8, [r8+r8*8-1084530831]
+	; FPNEG_R f3
+	xorps xmm3, xmm15
+	; IROR_R r6, r4
+	mov ecx, r12d
+	ror r14, cl
+	; IROL_R r4, r5
+	mov ecx, r13d
+	rol r12, cl
+	; FPSUB_R f2, a3
+	subpd xmm2, xmm11
+	; FPMUL_R e2, a2
+	mulpd xmm6, xmm10
+	; ISMULH_M r6, L2[98600]
+	mov rax, r14
+	imul qword ptr [rsi+98600]
+	mov r14, rdx
+	; IXOR_R r0, r6
+	xor r8, r14
+	; FPSWAP_R f1
+	shufpd xmm1, xmm1, 1
+	; FPADD_R f0, a1
 	addpd xmm0, xmm9
-	movaps xmm6, xmm0
-
-rx_i_395: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r8, 04ae4fe8ch
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_395
-	call rx_read
-rx_body_395:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 939698704
-	mov rcx, 5269518980991934091
-	mul rcx
-	mov rax, rdx
-	shr rax, 28
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 03802aa10h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_396: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r10, 07b41862bh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_396
-	call rx_read
-rx_body_396:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 62
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 01ee1c837h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_397: ;SUB_32
-	dec ebx
-	jz rx_finish
-	xor r8, 0916f3819h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_397
-	call rx_read
-rx_body_397:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	sub eax, r12d
-	mov r10, rax
-
-rx_i_398: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 04eb6fd2ah
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_398
-	call rx_read
-rx_body_398:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r8
-	shr rax, cl
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0724e7136h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_399: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0899a98cfh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_399
-	call rx_read
-rx_body_399:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm6, xmm0
-
-rx_i_400: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r13, 0aae75db6h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_400
-	call rx_read
-rx_body_400:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, -1800645748
-	mov r14, rax
-
-rx_i_401: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 032e81f25h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_401
-	call rx_read
-rx_body_401:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm4
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 03ea60344h
-	and eax, 32767
-	movlpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_402: ;RET
-	dec ebx
-	jz rx_finish
-	xor r9, 0fa1a07ffh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_402
-	call rx_read
-rx_body_402:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r14, rax
-	cmp rsp, rdi
-	je short rx_i_403
-	ret
-
-rx_i_403: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0e59500f7h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_403
-	call rx_read
-rx_body_403:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 536056992
-	mov rcx, 4618688153536407095
-	mul rcx
-	mov rax, rdx
-	shr rax, 27
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 01ff394a0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_404: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r15, 05b8ceb2fh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_404
-	call rx_read
-rx_body_404:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r8d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 08f83c4f1h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_405: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r8, 0f61082a3h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_405
-	call rx_read
-rx_body_405:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r12, rax
-	cmp r10d, 1795880641
-	ja short rx_i_406
-	call rx_i_494
-
-rx_i_406: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r9, 0af6886b7h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_406
-	call rx_read
-rx_body_406:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm7
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-
-rx_i_407: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r14, 09699566fh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_407
-	call rx_read
-rx_body_407:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm9
-	movaps xmm8, xmm0
-
-rx_i_408: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r15, 066e79fa6h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_408
-	call rx_read
-rx_body_408:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 693109961
-	mov r10, rax
-
-rx_i_409: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r11, 04b6caa9ah
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_409
-	call rx_read
-rx_body_409:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 05a68b80fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_410: ;RET
-	dec ebx
-	jz rx_finish
-	xor r15, 0d17f245eh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_410
-	call rx_read
-rx_body_410:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp rsp, rdi
-	je short rx_i_411
-	ret
-
-rx_i_411: ;RET
-	dec ebx
-	jz rx_finish
-	xor r12, 0364f10e7h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_411
-	call rx_read
-rx_body_411:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 0b492f6bah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp rsp, rdi
-	je short rx_i_412
-	ret
-
-rx_i_412: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r10, 0ac90e7ah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_412
-	call rx_read
-rx_body_412:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm4
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm3, xmm0
-
-rx_i_413: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 04b6037abh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_413
-	call rx_read
-rx_body_413:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 043989376h
-	and eax, 131071
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_414: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r14, 06c01554dh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_414
-	call rx_read
-rx_body_414:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, -378293327
-	mov r10, rax
-
-rx_i_415: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r8, 08c3e59a1h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_415
-	call rx_read
-rx_body_415:
-	xor rbp, rax
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 3756873911
-	add rax, 1
-	sbb rax, 0
-	mov rcx, 10544426615208851175
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov r9, rax
-
-rx_i_416: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0f3fafde9h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_416
-	call rx_read
-rx_body_416:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm3
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0f84b5382h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_417: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 03c6481fah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_417
-	call rx_read
-rx_body_417:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r12
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0dfa7569ch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_418: ;MULH_64
-	dec ebx
-	jz rx_finish
-	xor r10, 02bd61c5fh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_418
-	call rx_read
-rx_body_418:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r11
-	mul rcx
-	mov rax, rdx
-	mov r10, rax
-
-rx_i_419: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0b6ab9d32h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_419
-	call rx_read
-rx_body_419:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r14
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 0beeca8dbh
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_420: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0f9690ceah
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_420
-	call rx_read
-rx_body_420:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	ror rax, 38
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 08f7bb3ech
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_421: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r12, 01ada0f39h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_421
-	call rx_read
-rx_body_421:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r10, rax
-	cmp r8d, -1600409762
-	jo short rx_i_422
-	call rx_i_31
-
-rx_i_422: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 04dd16ca4h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_422
-	call rx_read
-rx_body_422:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r10d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 07c614e2h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_423: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 04df5ce05h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_423
-	call rx_read
-rx_body_423:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov r15, rax
-
-rx_i_424: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 01ad12ce2h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_424
-	call rx_read
-rx_body_424:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm7
-	movaps xmm9, xmm0
-
-rx_i_425: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r8, 0a3c5391dh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_425
-	call rx_read
-rx_body_425:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 1776029069
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 069dc0d8dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_426: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r12, 09dd55ba0h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_426
-	call rx_read
-rx_body_426:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -590728721
-	mov rdx, -4191230239118101979
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 27
-	sets dl
-	add rax, rdx
-	mov r14, rax
-
-rx_i_427: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r11, 0d6cae9aeh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_427
-	call rx_read
-rx_body_427:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, -2146332428
-	imul rax, rcx
-	mov r9, rax
-
-rx_i_428: ;RET
-	dec ebx
-	jz rx_finish
-	xor r11, 0f807a961h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_428
-	call rx_read
-rx_body_428:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp rsp, rdi
-	je short rx_i_429
-	ret
-
-rx_i_429: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0650a4102h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_429
-	call rx_read
-rx_body_429:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r9
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 076a3ad84h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_430: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r14, 019cc0e5h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_430
-	call rx_read
-rx_body_430:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
+	; COND_R r1, ab(r3, -991705199)
+	xor ecx, ecx
+	cmp r11d, -991705199
+	seta cl
+	add r9, rcx
+	; IMULH_M r4, L2[r2]
+	mov ecx, r10d
+	and ecx, 262136
+	mov rax, r12
+	mul qword ptr [rsi+rcx]
+	mov r12, rdx
+	; IROR_R r2, r6
+	mov ecx, r14d
+	ror r10, cl
+	; FPDIV_R e0, a1
+	divpd xmm4, xmm9
+	maxpd xmm4, xmm13
+	; IMUL_R r1, r7
+	imul r9, r15
+	; COND_R r6, ns(r2, 939392855)
+	xor ecx, ecx
+	cmp r10d, 939392855
+	setns cl
+	add r14, rcx
+	; FPMUL_R e3, a1
+	mulpd xmm7, xmm9
+	; COND_R r2, ab(r2, -499266314)
+	xor ecx, ecx
+	cmp r10d, -499266314
+	seta cl
+	add r10, rcx
+	; COND_M r7, lt(L1[r1], -1624420482)
+	xor ecx, ecx
+	mov eax, r9d
+	and eax, 16376
+	cmp dword ptr [rsi+rax], -1624420482
+	setl cl
+	add r15, rcx
+	; COND_R r1, lt(r1, 1525413977)
+	xor ecx, ecx
+	cmp r9d, 1525413977
+	setl cl
+	add r9, rcx
+	; IMUL_R r4, r5
+	imul r12, r13
+	; IMUL_R r4, r2
+	imul r12, r10
+	; FPSQRT_R e1
+	sqrtpd xmm5, xmm5
+	; ISUB_R r2, r6
+	sub r10, r14
+	; FPDIV_R e1, a0
+	divpd xmm5, xmm8
+	maxpd xmm5, xmm13
+	; FPMUL_R e2, a3
+	mulpd xmm6, xmm11
+	; IADD_R r6, 671627590
+	add r14, 671627590
+	; COND_M r6, sg(L1[r4], -780452820)
+	xor ecx, ecx
+	mov eax, r12d
+	and eax, 16376
+	cmp dword ptr [rsi+rax], -780452820
+	sets cl
+	add r14, rcx
+	; IMULH_R r4, r7
+	mov rax, r12
+	mul r15
+	mov r12, rdx
+	; FPMUL_R e3, a1
+	mulpd xmm7, xmm9
+	; FPADD_R f0, a0
 	addpd xmm0, xmm8
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 058891433h
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_431: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0ed17ab58h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_431
-	call rx_read
-rx_body_431:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r13
-	ror rax, cl
-	mov r13, rax
-
-rx_i_432: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r10, 01c3b321fh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_432
-	call rx_read
-rx_body_432:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, 876274173
-	mov r8, rax
-
-rx_i_433: ;ADD_32
-	dec ebx
-	jz rx_finish
-	xor r13, 0bbb88499h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_433
-	call rx_read
-rx_body_433:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add eax, 1193456495
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 04722b36fh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_434: ;FPDIV
-	dec ebx
-	jz rx_finish
-	xor r13, 0167edabdh
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_434
-	call rx_read
-rx_body_434:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	divpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm9, xmm0
-
-rx_i_435: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0b940480ah
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_435
-	call rx_read
-rx_body_435:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, rax, 1971717631
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 0758605ffh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_436: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r15, 0bfc3ca8bh
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_436
-	call rx_read
-rx_body_436:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm7, xmm0
-
-rx_i_437: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 098a6bcf7h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_437
-	call rx_read
-rx_body_437:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_438: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r10, 0325b38ebh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_438
-	call rx_read
-rx_body_438:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 0b7c490eeh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_439: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r13, 05e807e81h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_439
-	call rx_read
-rx_body_439:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, -1299288575
-	mov r10, rax
-
-rx_i_440: ;CALL
-	dec ebx
-	jz rx_finish
-	xor r10, 062f83728h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_440
-	call rx_read
-rx_body_440:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 07ed31f7ah
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r12d, 2127765370
-	jns short rx_i_441
-	call rx_i_41
-
-rx_i_441: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0d18ec075h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_441
-	call rx_read
-rx_body_441:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r14
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 01f93242ch
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_442: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r14, 0a53dd1bh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_442
-	call rx_read
-rx_body_442:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm3, xmm0
-
-rx_i_443: ;RET
-	dec ebx
-	jz rx_finish
-	xor r14, 0232d1285h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_443
-	call rx_read
-rx_body_443:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp rsp, rdi
-	je short rx_i_444
-	ret
-
-rx_i_444: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r8, 042455dd8h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_444
-	call rx_read
-rx_body_444:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm7
-	movaps xmm5, xmm0
-
-rx_i_445: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r13, 09ae009b2h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_445
-	call rx_read
-rx_body_445:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r11
-	mov r9, rax
-
-rx_i_446: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 01734708eh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_446
-	call rx_read
-rx_body_446:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r15d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 03166163h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_447: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 01596d0e8h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_447
-	call rx_read
-rx_body_447:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm7
-	movaps xmm5, xmm0
-	mov eax, r13d
-	xor eax, 0b384d4afh
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm5
-
-rx_i_448: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 0390cfdb0h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_448
-	call rx_read
-rx_body_448:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm3
-	movaps xmm9, xmm0
-
-rx_i_449: ;ROL_64
-	dec ebx
-	jz rx_finish
-	xor r8, 04f27744bh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_449
-	call rx_read
-rx_body_449:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	rol rax, 28
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 089e19790h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_450: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 04e2c76ffh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_450
-	call rx_read
-rx_body_450:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r12
-	sar rax, cl
-	mov r8, rax
-
-rx_i_451: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r8, 0c4d99ac9h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_451
-	call rx_read
-rx_body_451:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r10
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 0eedd10b3h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_452: ;RET
-	dec ebx
-	jz rx_finish
-	xor r13, 040130b88h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_452
-	call rx_read
-rx_body_452:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	mov r11, rax
-	cmp rsp, rdi
-	je short rx_i_453
-	ret
-
-rx_i_453: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0a2096aa4h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_453
-	call rx_read
-rx_body_453:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 380157076
-	shr rax, 2
-	mov rcx, 3256390890604862173
-	mul rcx
-	mov rax, rdx
-	shr rax, 24
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 016a8bc94h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_454: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 081314291h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_454
-	call rx_read
-rx_body_454:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm4, xmm0
-
-rx_i_455: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 059263cdbh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_455
-	call rx_read
-rx_body_455:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r9
-	mov r8, rax
-
-rx_i_456: ;AND_64
-	dec ebx
-	jz rx_finish
-	xor r9, 010e8fe6h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_456
-	call rx_read
-rx_body_456:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and rax, 401943615
-	mov r9, rax
-
-rx_i_457: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r9, 09de1a3efh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_457
-	call rx_read
-rx_body_457:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, 1482178870
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 058584136h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_458: ;SAR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 05c79df6eh
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_458
-	call rx_read
-rx_body_458:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r8
-	sar rax, cl
-	mov rcx, rax
-	mov eax, r14d
-	xor eax, 028f0a8ch
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_459: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0346f46adh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_459
-	call rx_read
-rx_body_459:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r9
-	mov rcx, rax
-	mov eax, r13d
-	xor eax, 016bb0164h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_460: ;ADD_32
-	dec ebx
-	jz rx_finish
-	xor r11, 098ab71fch
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_460
-	call rx_read
-rx_body_460:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add eax, -347784553
-	mov r12, rax
-
-rx_i_461: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 0c814e926h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_461
-	call rx_read
-rx_body_461:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, 1659853721
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 062ef5b99h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_462: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r10, 0c64b4a9eh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_462
-	call rx_read
-rx_body_462:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r8
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 098a05350h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_463: ;ADD_32
-	dec ebx
-	jz rx_finish
-	xor r9, 08c29341h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_463
-	call rx_read
-rx_body_463:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add eax, r15d
-	mov rcx, rax
-	mov eax, r10d
-	xor eax, 0c8204c90h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_464: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 06ff587fdh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_464
-	call rx_read
-rx_body_464:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r15
-	mov r13, rax
-
-rx_i_465: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 0b62c0003h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_465
-	call rx_read
-rx_body_465:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm5
-	movaps xmm2, xmm0
-	mov eax, r10d
-	xor eax, 0d11c1242h
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_466: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r13, 05c541c42h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_466
-	call rx_read
-rx_body_466:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r13d
-	imul rax, rcx
-	mov r9, rax
-
-rx_i_467: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0cbb33f81h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_467
-	call rx_read
-rx_body_467:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm8, xmm0
-
-rx_i_468: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r8, 091044dc3h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_468
-	call rx_read
-rx_body_468:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 4281572471
-	add rax, 1
-	sbb rax, 0
-	mov rcx, 9252227195836753313
-	mul rcx
-	mov rax, rdx
-	shr rax, 31
-	mov r8, rax
-
-rx_i_469: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r9, 0c0186beh
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_469
-	call rx_read
-rx_body_469:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r9d
-	imul rax, rcx
-	mov rcx, rax
-	mov eax, r9d
-	xor eax, 01186619dh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_470: ;OR_64
-	dec ebx
-	jz rx_finish
-	xor r14, 090849e3eh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_470
-	call rx_read
-rx_body_470:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	or rax, r11
-	mov r14, rax
-
-rx_i_471: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r14, 0cedba9b6h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_471
-	call rx_read
-rx_body_471:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	mov rax, 1914863189
-	imul rax, rcx
-	mov r14, rax
-
-rx_i_472: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 038f4b9d6h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_472
-	call rx_read
-rx_body_472:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r10, rax
-	cmp r10d, 1738497427
-	jl rx_i_8
-
-rx_i_473: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 01fb7637dh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_473
-	call rx_read
-rx_body_473:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r11
-	mov r12, rax
-
-rx_i_474: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r9, 0b5c0b4d4h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_474
-	call rx_read
-rx_body_474:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r15, rax
-	cmp r15d, -233120543
-	jo rx_i_69
-
-rx_i_475: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r10, 0910dcdeeh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_475
-	call rx_read
-rx_body_475:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm9
-	movaps xmm7, xmm0
-
-rx_i_476: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 07ab3b5a4h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_476
-	call rx_read
-rx_body_476:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 0b01bb14ch
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_477: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r12, 07a29ec63h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_477
-	call rx_read
-rx_body_477:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm6, xmm0
-
-rx_i_478: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r14, 02d3d7e7fh
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_478
-	call rx_read
-rx_body_478:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r10
-	mov r12, rax
-
-rx_i_479: ;MUL_64
-	dec ebx
-	jz rx_finish
-	xor r12, 09b49c793h
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_479
-	call rx_read
-rx_body_479:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	imul rax, r14
-	mov r13, rax
-
-rx_i_480: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r9, 0a9cc4f01h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_480
-	call rx_read
-rx_body_480:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm4
-	movaps xmm6, xmm0
-
-rx_i_481: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0225ba1f9h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_481
-	call rx_read
-rx_body_481:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 2101516912
-	shr rax, 4
-	mov rcx, 147267437180322377
-	mul rcx
-	mov rax, rdx
-	shr rax, 20
-	mov r12, rax
-
-rx_i_482: ;AND_32
-	dec ebx
-	jz rx_finish
-	xor r14, 044a0f592h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_482
-	call rx_read
-rx_body_482:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	and eax, 1304556205
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 04dc1f2adh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_483: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r11, 07f71f219h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_483
-	call rx_read
-rx_body_483:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm6
-	movaps xmm6, xmm0
-	mov eax, r14d
-	xor eax, 0545908cah
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm6
-
-rx_i_484: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r12, 07027bacdh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_484
-	call rx_read
-rx_body_484:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	shr rax, 37
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 074a50ee0h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_485: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r13, 03a04647h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_485
-	call rx_read
-rx_body_485:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	mov eax, r15d
-	xor eax, 02112cbaeh
-	and eax, 131071
-	mov qword ptr [rsi + rax * 8], rcx
-	cmp r8d, 554879918
-	jno rx_i_58
-
-rx_i_486: ;ADD_64
-	dec ebx
-	jz rx_finish
-	xor r15, 0ad072937h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_486
-	call rx_read
-rx_body_486:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	add rax, r8
-	mov rcx, rax
-	mov eax, r8d
-	xor eax, 03832b3b2h
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_487: ;SUB_64
-	dec ebx
-	jz rx_finish
-	xor r11, 07f78ad34h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_487
-	call rx_read
-rx_body_487:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	sub rax, r9
-	mov rcx, rax
-	mov eax, r11d
-	xor eax, 0ec228e26h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_488: ;DIV_64
-	dec ebx
-	jz rx_finish
-	xor r12, 0d8b1788eh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_488
-	call rx_read
-rx_body_488:
-	and eax, 32767
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by 297357073
-	mov rcx, 16652572300311555393
-	mul rcx
-	mov rax, rdx
-	shr rax, 28
-	mov r12, rax
-
-rx_i_489: ;JUMP
-	dec ebx
-	jz rx_finish
-	xor r10, 0b2ec9f3ah
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_489
-	call rx_read
-rx_body_489:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp r15d, -1127175870
-	jge rx_i_75
-
-rx_i_490: ;ROR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 015c7f598h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_490
-	call rx_read
-rx_body_490:
-	xor rbp, rax
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, r9
-	ror rax, cl
-	mov r15, rax
-
-rx_i_491: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0902da6bdh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_491
-	call rx_read
-rx_body_491:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm9
-	movaps xmm7, xmm0
-	mov eax, r15d
-	xor eax, 0b0f0fca4h
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm7
-
-rx_i_492: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r9, 0491090d9h
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_492
-	call rx_read
-rx_body_492:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -1779388031
-	mov rcx, rax
-	mov rdx, 7315366159790064091
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sub rax, rcx
-	sar rax, 30
-	sets dl
-	add rax, rdx
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 095f0b181h
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_493: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r8, 09de81282h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_493
-	call rx_read
-rx_body_493:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm9
-	movaps xmm4, xmm0
-	mov eax, r12d
-	xor eax, 02feb2fd7h
-	and eax, 2047
-	movhpd qword ptr [rsi + rax * 8], xmm4
-
-rx_i_494: ;MUL_32
-	dec ebx
-	jz rx_finish
-	xor r10, 0b0d50e46h
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_494
-	call rx_read
-rx_body_494:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov ecx, eax
-	mov eax, r11d
-	imul rax, rcx
-	mov r14, rax
-
-rx_i_495: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r11, 0e276cad1h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_495
-	call rx_read
-rx_body_495:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm2
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 02d12bd27h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_496: ;IDIV_64
-	dec ebx
-	jz rx_finish
-	xor r14, 0fe757b73h
-	mov eax, r14d
-	test bl, 63
-	jnz short rx_body_496
-	call rx_read
-rx_body_496:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	; magic divide by -359802064
-	mov rdx, -860153514353783887
-	imul rdx
-	mov rax, rdx
-	xor edx, edx
-	sar rax, 24
-	sets dl
-	add rax, rdx
-	mov r9, rax
-
-rx_i_497: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r8, 08d25742eh
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_497
-	call rx_read
-rx_body_497:
-	xor rbp, rax
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm3
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_498: ;FPMUL
-	dec ebx
-	jz rx_finish
-	xor r15, 0e066fd15h
-	mov eax, r15d
-	test bl, 63
-	jnz short rx_body_498
-	call rx_read
-rx_body_498:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	mulpd xmm0, xmm9
-	movaps xmm1, xmm0
-	cmpeqpd xmm1, xmm1
-	andps xmm0, xmm1
-	movaps xmm8, xmm0
-
-rx_i_499: ;IMUL_32
-	dec ebx
-	jz rx_finish
-	xor r12, 08925556bh
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_499
-	call rx_read
-rx_body_499:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	movsxd rcx, eax
-	movsxd rax, r13d
-	imul rax, rcx
-	mov r8, rax
-
-rx_i_500: ;FPSQRT
-	dec ebx
-	jz rx_finish
-	xor r10, 04bc870ebh
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_500
-	call rx_read
-rx_body_500:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	andps xmm0, xmm10
-	sqrtpd xmm2, xmm0
-	mov eax, r10d
-	xor eax, 04a250342h
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm2
-
-rx_i_501: ;XOR_64
-	dec ebx
-	jz rx_finish
-	xor r8, 07d46c503h
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_501
-	call rx_read
-rx_body_501:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	xor rax, r10
-	mov rcx, rax
-	mov eax, r12d
-	xor eax, 03e22874bh
-	and eax, 2047
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_502: ;RET
-	dec ebx
-	jz rx_finish
-	xor r10, 09e70b20ch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_502
-	call rx_read
-rx_body_502:
-	xor rbp, rax
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	mov r9, rax
-	cmp rsp, rdi
-	je short rx_i_503
-	ret
-
-rx_i_503: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r13, 0442e4850h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_503
-	call rx_read
-rx_body_503:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm2
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 080465282h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_504: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r13, 099d48347h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_504
-	call rx_read
-rx_body_504:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
+	; FPMUL_R e0, a1
+	mulpd xmm4, xmm9
+	; IMUL_R r7, r3
+	imul r15, r11
+	; IROL_R r0, r7
+	mov ecx, r15d
+	rol r8, cl
+	; IMUL_R r1, r7
+	imul r9, r15
+	; COND_R r0, no(r7, 449007464)
+	xor ecx, ecx
+	cmp r15d, 449007464
+	setno cl
+	add r8, rcx
+	; ISMULH_M r6, L2[134288]
+	mov rax, r14
+	imul qword ptr [rsi+134288]
+	mov r14, rdx
+	; IMULH_R r5, r2
+	mov rax, r13
+	mul r10
+	mov r13, rdx
+	; IMULH_R r7, r4
+	mov rax, r15
+	mul r12
+	mov r15, rdx
+	; FPDIV_R e3, a0
+	divpd xmm7, xmm8
+	maxpd xmm7, xmm13
+	; IXOR_R r3, r4
+	xor r11, r12
+	; IDIV_C r1, 72349044
+	mov rax, 8555331009525020641
+	mul r9
+	shr rdx, 25
+	add r9, rdx
+	; IADD_R r5, r4
+	add r13, r12
+	; IROR_R r2, r4
+	mov ecx, r12d
+	ror r10, cl
+	; FPSUB_M f1, L1[r2]
+	mov eax, r10d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	subpd xmm1, xmm12
+	; FPMUL_R e2, a3
+	mulpd xmm6, xmm11
+	; IADD_R r5, r6
+	add r13, r14
+	; IXOR_M r1, L1[r4]
+	mov eax, r12d
+	and eax, 16376
+	xor r9, qword ptr [rsi+rax]
+	; ISUB_R r2, -1544880589
+	sub r10, -1544880589
+	; FPNEG_R f0
+	xorps xmm0, xmm15
+	; IROR_R r1, r6
+	mov ecx, r14d
+	ror r9, cl
+	; IMUL_R r6, r4
+	imul r14, r12
+	; IMULH_M r4, L2[r1]
+	mov ecx, r9d
+	and ecx, 262136
+	mov rax, r12
+	mul qword ptr [rsi+rcx]
+	mov r12, rdx
+	; IXOR_R r3, r0
+	xor r11, r8
+	; FPSWAP_R f0
+	shufpd xmm0, xmm0, 1
+	; FPSWAP_R f0
+	shufpd xmm0, xmm0, 1
+	; COND_R r0, ns(r2, -308295242)
+	xor ecx, ecx
+	cmp r10d, -308295242
+	setns cl
+	add r8, rcx
+	; IMUL_9C r1, 591587965
+	lea r9, [r9+r9*8+591587965]
+	; FPADD_R f3, a1
+	addpd xmm3, xmm9
+	; IMUL_R r5, r4
+	imul r13, r12
+	; IMUL_M r7, L1[r0]
+	mov eax, r8d
+	and eax, 16376
+	imul r15, qword ptr [rsi+rax]
+	; COND_R r6, sg(r5, -1119525789)
+	xor ecx, ecx
+	cmp r13d, -1119525789
+	sets cl
+	add r14, rcx
+	; IMUL_M r0, L1[r1]
+	mov eax, r9d
+	and eax, 16376
+	imul r8, qword ptr [rsi+rax]
+	; IADD_M r3, L2[r7]
+	mov eax, r15d
+	and eax, 262136
+	add r11, qword ptr [rsi+rax]
+	; IADD_R r0, r1
+	add r8, r9
+	; FPSUB_R f2, a1
+	subpd xmm2, xmm9
+	; IXOR_M r0, L2[r7]
+	mov eax, r15d
+	and eax, 262136
+	xor r8, qword ptr [rsi+rax]
+	; COND_R r6, be(r6, 1481939391)
+	xor ecx, ecx
+	cmp r14d, 1481939391
+	setbe cl
+	add r14, rcx
+	; FPADD_R f0, a1
 	addpd xmm0, xmm9
-	movaps xmm4, xmm0
-
-rx_i_505: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r12, 032c0a28ah
-	mov eax, r12d
-	test bl, 63
-	jnz short rx_body_505
-	call rx_read
-rx_body_505:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	subpd xmm0, xmm4
-	movaps xmm8, xmm0
-	mov eax, r8d
-	xor eax, 021b54eaeh
-	and eax, 32767
-	movhpd qword ptr [rsi + rax * 8], xmm8
-
-rx_i_506: ;FPSUB
-	dec ebx
-	jz rx_finish
-	xor r9, 0a973d58ch
-	mov eax, r9d
-	test bl, 63
-	jnz short rx_body_506
-	call rx_read
-rx_body_506:
-	and eax, 32767
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
+	; IXOR_R r3, r2
+	xor r11, r10
+	; FPSUB_R f0, a1
 	subpd xmm0, xmm9
-	movaps xmm3, xmm0
-	mov eax, r11d
-	xor eax, 05e890759h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm3
-
-rx_i_507: ;RET
-	dec ebx
-	jz rx_finish
-	xor r10, 0d3b7165ch
-	mov eax, r10d
-	test bl, 63
-	jnz short rx_body_507
-	call rx_read
-rx_body_507:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r14, rax
-	cmp rsp, rdi
-	je short rx_i_508
-	ret
-
-rx_i_508: ;RET
-	dec ebx
-	jz rx_finish
-	xor r13, 0da34d818h
-	mov eax, r13d
-	test bl, 63
-	jnz short rx_body_508
-	call rx_read
-rx_body_508:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov r8, rax
-	cmp rsp, rdi
-	je short rx_i_509
-	ret
-
-rx_i_509: ;FPROUND
-	dec ebx
-	jz rx_finish
-	xor r11, 01b2873f2h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_509
-	call rx_read
-rx_body_509:
-	and eax, 2047
-	mov rax, qword ptr [rsi+rax*8]
-	mov rcx, rax
-	rol rax, 34
-	and eax, 24576
-	or eax, 40896
-	mov dword ptr [rsp - 8], eax
-	ldmxcsr dword ptr [rsp - 8]
-	mov eax, r10d
-	xor eax, 06cd84each
-	and eax, 32767
-	mov qword ptr [rsi + rax * 8], rcx
-
-rx_i_510: ;FPADD
-	dec ebx
-	jz rx_finish
-	xor r8, 0db65513ch
-	mov eax, r8d
-	test bl, 63
-	jnz short rx_body_510
-	call rx_read
-rx_body_510:
-	and eax, 2047
-	cvtdq2pd xmm0, qword ptr [rsi+rax*8]
-	addpd xmm0, xmm2
-	movaps xmm9, xmm0
-	mov eax, r9d
-	xor eax, 097614097h
-	and eax, 2047
-	movlpd qword ptr [rsi + rax * 8], xmm9
-
-rx_i_511: ;SHR_64
-	dec ebx
-	jz rx_finish
-	xor r11, 02bd79286h
-	mov eax, r11d
-	test bl, 63
-	jnz short rx_body_511
-	call rx_read
-rx_body_511:
-	and eax, 131071
-	mov rax, qword ptr [rsi+rax*8]
-	shr rax, 56
-	mov r11, rax
-
-	jmp rx_i_0
+	; IXOR_R r7, r3
+	xor r15, r11
+	; IXOR_M r6, L1[r4]
+	mov eax, r12d
+	and eax, 16376
+	xor r14, qword ptr [rsi+rax]
+	; IMULH_R r2, r7
+	mov rax, r10
+	mul r15
+	mov r10, rdx
+	; ISUB_R r5, r1
+	sub r13, r9
+	; FPMUL_R e1, a3
+	mulpd xmm5, xmm11
+	; FPADD_R f3, a2
+	addpd xmm3, xmm10
+	; FPSWAP_R f1
+	shufpd xmm1, xmm1, 1
+	; FPSUB_R f1, a3
+	subpd xmm1, xmm11
+	; FPSUB_M f0, L1[r4]
+	mov eax, r12d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	subpd xmm0, xmm12
+	; FPMUL_R e1, a2
+	mulpd xmm5, xmm10
+	; FPADD_R f3, a0
+	addpd xmm3, xmm8
+	; IROL_R r2, r4
+	mov ecx, r12d
+	rol r10, cl
+	; COND_M r7, ab(L2[r7], -2012390318)
+	xor ecx, ecx
+	mov eax, r15d
+	and eax, 262136
+	cmp dword ptr [rsi+rax], -2012390318
+	seta cl
+	add r15, rcx
+	; IMUL_9C r4, -38079585
+	lea r12, [r12+r12*8-38079585]
+	; IXOR_R r0, r1
+	xor r8, r9
+	; FPMUL_R e1, a3
+	mulpd xmm5, xmm11
+	; FPMUL_R e1, a1
+	mulpd xmm5, xmm9
+	; FPSUB_R f1, a2
+	subpd xmm1, xmm10
+	; IMUL_9C r4, -847745598
+	lea r12, [r12+r12*8-847745598]
+	; FPSQRT_R e1
+	sqrtpd xmm5, xmm5
+	; IADD_R r7, r6
+	add r15, r14
+	; FPSUB_R f3, a0
+	subpd xmm3, xmm8
+	; FPSUB_R f1, a1
+	subpd xmm1, xmm9
+	; IADD_R r7, r6
+	add r15, r14
+	; IROL_R r2, r5
+	mov ecx, r13d
+	rol r10, cl
+	; IADD_RC r4, r2, 1338806320
+	lea r12, [r12+r10+1338806320]
+	; FPSQRT_R e3
+	sqrtpd xmm7, xmm7
+	; IMUL_R r5, r0
+	imul r13, r8
+	; FPADD_R f2, a1
+	addpd xmm2, xmm9
+	; INEG_R r6
+	neg r14
+	; IXOR_M r6, L1[r2]
+	mov eax, r10d
+	and eax, 16376
+	xor r14, qword ptr [rsi+rax]
+	; FPSUB_R f2, a2
+	subpd xmm2, xmm10
+	; FPADD_R f2, a2
+	addpd xmm2, xmm10
+	; FPADD_R f1, a2
+	addpd xmm1, xmm10
+	; COND_R r3, be(r4, 174667458)
+	xor ecx, ecx
+	cmp r12d, 174667458
+	setbe cl
+	add r11, rcx
+	; INEG_R r6
+	neg r14
+	; IXOR_R r6, r3
+	xor r14, r11
+	; COND_M r5, sg(L1[r0], -864345921)
+	xor ecx, ecx
+	mov eax, r8d
+	and eax, 16376
+	cmp dword ptr [rsi+rax], -864345921
+	sets cl
+	add r13, rcx
+	; IROL_R r7, r3
+	mov ecx, r11d
+	rol r15, cl
+	; FPSUB_R f1, a2
+	subpd xmm1, xmm10
+	; IADD_M r1, L1[r0]
+	mov eax, r8d
+	and eax, 16376
+	add r9, qword ptr [rsi+rax]
+	; IMULH_R r1, r3
+	mov rax, r9
+	mul r11
+	mov r9, rdx
+	; IMUL_R r0, -1489192296
+	imul r8, -1489192296
+	; FPMUL_R e0, a2
+	mulpd xmm4, xmm10
+	; COND_R r1, ge(r1, -1358904097)
+	xor ecx, ecx
+	cmp r9d, -1358904097
+	setge cl
+	add r9, rcx
+	; FPSUB_R f1, a1
+	subpd xmm1, xmm9
+	; FPADD_R f2, a3
+	addpd xmm2, xmm11
+	; IROR_R r4, r7
+	mov ecx, r15d
+	ror r12, cl
+	; ISDIV_C r1, -1368098113
+	mov rax, -7238896260565957085
+	imul r9
+	xor eax, eax
+	sar rdx, 29
+	sets al
+	add rdx, rax
+	add r9, rdx
+	; IADD_M r4, L1[r1]
+	mov eax, r9d
+	and eax, 16376
+	add r12, qword ptr [rsi+rax]
+	; IMUL_R r0, -1011605520
+	imul r8, -1011605520
+	; FPSUB_R f3, a1
+	subpd xmm3, xmm9
+	; IADD_RC r1, r4, 272540736
+	lea r9, [r9+r12+272540736]
+	; FPSWAP_R f2
+	shufpd xmm2, xmm2, 1
+	; IROR_R r3, r2
+	mov ecx, r10d
+	ror r11, cl
+	; IMUL_R r3, 2085105439
+	imul r11, 2085105439
+	; FPMUL_R e0, a0
+	mulpd xmm4, xmm8
+	; IMUL_9C r6, -483723153
+	lea r14, [r14+r14*8-483723153]
+	; FPSUB_M f3, L1[r7]
+	mov eax, r15d
+	and eax, 16376
+	cvtdq2pd xmm12, qword ptr [rsi+rax]
+	subpd xmm3, xmm12
+	; IMUL_R r3, r2
+	imul r11, r10
+	; ISMULH_R r7, r1
+	mov rax, r15
+	imul r9
+	mov r15, rdx
+	; COND_R r1, of(r7, 778804236)
+	xor ecx, ecx
+	cmp r15d, 778804236
+	seto cl
+	add r9, rcx
+	; FPSUB_R f3, a2
+	subpd xmm3, xmm10
+	; IROL_R r5, r7
+	mov ecx, r15d
+	rol r13, cl
+	; FPADD_R f1, a0
+	addpd xmm1, xmm8
+	; FPADD_R f2, a3
+	addpd xmm2, xmm11
+	; IMUL_R r6, r0
+	imul r14, r8
+	; ISUB_M r2, L2[r4]
+	mov eax, r12d
+	and eax, 262136
+	sub r10, qword ptr [rsi+rax]
+	; IXOR_R r0, r6
+	xor r8, r14
+	; INEG_R r6
+	neg r14
+	; FPMUL_R e2, a3
+	mulpd xmm6, xmm11
+	; IADD_RC r4, r6, -1312075035
+	lea r12, [r12+r14-1312075035]
+	; IMUL_R r1, r5
+	imul r9, r13
+	; IXOR_M r7, L2[r6]
+	mov eax, r14d
+	and eax, 262136
+	xor r15, qword ptr [rsi+rax]
+	; IROR_R r2, 23
+	ror r10, 23
+	; FPMUL_R e0, a2
+	mulpd xmm4, xmm10
+	; ISMULH_M r5, L1[r2]
+	mov ecx, r10d
+	and ecx, 16376
+	mov rax, r13
+	imul qword ptr [rsi+rcx]
+	mov r13, rdx
+	; ISUB_M r7, L1[r4]
+	mov eax, r12d
+	and eax, 16376
+	sub r15, qword ptr [rsi+rax]
+	; COND_R r0, sg(r2, 1538841628)
+	xor ecx, ecx
+	cmp r10d, 1538841628
+	sets cl
+	add r8, rcx
+	; IMUL_R r6, r2
+	imul r14, r10
+	; ISUB_R r0, r1
+	sub r8, r9
+	; IMUL_R r5, r7
+	imul r13, r15
+	; IADD_RC r1, r0, 516706834
+	lea r9, [r9+r8+516706834]
+	; INEG_R r5
+	neg r13
+	; FPSQRT_R e3
+	sqrtpd xmm7, xmm7
+	; IADD_RC r5, r4, -1679394922
+	lea r13, [r13+r12-1679394922]
+	; FPSUB_R f1, a1
+	subpd xmm1, xmm9
+	; IMUL_R r0, r2
+	imul r8, r10
+	; ISUB_R r3, r2
+	sub r11, r10
+	; FPDIV_R e0, a3
+	divpd xmm4, xmm11
+	maxpd xmm4, xmm13
+	; ISUB_R r1, r5
+	sub r9, r13
+	; COND_M r2, be(L2[r2], 1840094725)
+	xor ecx, ecx
+	mov eax, r10d
+	and eax, 262136
+	cmp dword ptr [rsi+rax], 1840094725
+	setbe cl
+	add r10, rcx
+	; IMUL_M r6, L1[r7]
+	mov eax, r15d
+	and eax, 16376
+	imul r14, qword ptr [rsi+rax]
+	; IMULH_M r6, L1[r5]
+	mov ecx, r13d
+	and ecx, 16376
+	mov rax, r14
+	mul qword ptr [rsi+rcx]
+	mov r14, rdx
+	; IMUL_9C r7, -1048659408
+	lea r15, [r15+r15*8-1048659408]
+	; IMUL_R r6, r3
+	imul r14, r11
+	; FPADD_R f3, a0
+	addpd xmm3, xmm8
+	; IMULH_R r0, r3
+	mov rax, r8
+	mul r11
+	mov r8, rdx
+	; FPSWAP_R f0
+	shufpd xmm0, xmm0, 1
+	; FPSQRT_R e3
+	sqrtpd xmm7, xmm7
+	; IMULH_R r2, r0
+	mov rax, r10
+	mul r8
+	mov r10, rdx
+	; FPDIV_R e1, a1
+	divpd xmm5, xmm9
+	maxpd xmm5, xmm13