diff --git a/src/AssemblyGeneratorX86.cpp b/src/AssemblyGeneratorX86.cpp
index 7bbb658..1922b0e 100644
--- a/src/AssemblyGeneratorX86.cpp
+++ b/src/AssemblyGeneratorX86.cpp
@@ -499,9 +499,6 @@ namespace RandomX {
gena(instr);
asmCode << "\tcmp rsp, rbp" << std::endl;
asmCode << "\tje short not_taken_ret_" << i << std::endl;
- asmCode << "\tcmp " << regR32[instr.regb % RegistersCount] << ", " << instr.imm32 << std::endl;
- asmCode << "\t" << jumpCondition(instr, true);
- asmCode << " short not_taken_ret_" << i << std::endl;
asmCode << "\txor rax, qword ptr [rsp + 8]" << std::endl;
gencr(instr);
asmCode << "\tret 8" << std::endl;
diff --git a/src/InterpretedVirtualMachine.cpp b/src/InterpretedVirtualMachine.cpp
index 84b4b11..2bb4d75 100644
--- a/src/InterpretedVirtualMachine.cpp
+++ b/src/InterpretedVirtualMachine.cpp
@@ -26,6 +26,9 @@ along with RandomX. If not, see.
#include
#include
#include
+#ifdef STATS
+#include
+#endif
#ifdef FPUCHECK
constexpr bool fpuCheck = true;
@@ -54,6 +57,9 @@ namespace RandomX {
void InterpretedVirtualMachine::execute() {
while (ic > 0) {
+#ifdef STATS
+ count_instructions[pc]++;
+#endif
auto& inst = p(pc);
if(trace) std::cout << inst.getName() << " (" << std::dec << pc << ")" << std::endl;
pc = (pc + 1) % ProgramLength;
@@ -61,6 +67,9 @@ namespace RandomX {
(this->*handler)(inst);
ic--;
}
+#ifdef STATS
+ count_endstack += stack.size();
+#endif
}
convertible_t InterpretedVirtualMachine::loada(Instruction& inst) {
@@ -284,9 +293,13 @@ namespace RandomX {
#ifdef STATS
count_CALL_taken++;
count_jump_taken[inst.locb & 7]++;
+ count_retdepth = std::max(0, count_retdepth - 1);
#endif
stackPush(a);
stackPush(pc);
+#ifdef STATS
+ count_max_stack = std::max(count_max_stack, (int)stack.size());
+#endif
pc += (inst.imm8 & 127) + 1;
pc = pc % ProgramLength;
if (trace) std::cout << std::hex << a.u64 << std::endl;
@@ -306,10 +319,11 @@ namespace RandomX {
convertible_t a = loada(inst);
convertible_t b = loadbr1(inst);
convertible_t& c = getcr(inst);
- if (stack.size() > 0 && JMP_COND(inst.locb, reg.r[inst.regb % RegistersCount], inst.imm32)) {
+ if (stack.size() > 0) {
#ifdef STATS
count_RET_taken++;
- count_jump_taken[inst.locb & 7]++;
+ count_retdepth++;
+ count_retdepth_max = std::max(count_retdepth_max, count_retdepth);
#endif
auto raddr = stackPopAddress();
auto retval = stackPopValue();
diff --git a/src/InterpretedVirtualMachine.hpp b/src/InterpretedVirtualMachine.hpp
index 1427c1b..5a6f49a 100644
--- a/src/InterpretedVirtualMachine.hpp
+++ b/src/InterpretedVirtualMachine.hpp
@@ -18,7 +18,7 @@ along with RandomX. If not, see.
*/
#pragma once
-//#define STATS
+#define STATS
#include "VirtualMachine.hpp"
#include "Program.hpp"
#include
@@ -43,41 +43,46 @@ namespace RandomX {
std::vector stack;
uint64_t pc, ic;
#ifdef STATS
- int count_ADD_64;
- int count_ADD_32;
- int count_SUB_64;
- int count_SUB_32;
- int count_MUL_64;
- int count_MULH_64;
- int count_MUL_32;
- int count_IMUL_32;
- int count_IMULH_64;
- int count_DIV_64;
- int count_IDIV_64;
- int count_AND_64;
- int count_AND_32;
- int count_OR_64;
- int count_OR_32;
- int count_XOR_64;
- int count_XOR_32;
- int count_SHL_64;
- int count_SHR_64;
- int count_SAR_64;
- int count_ROL_64;
- int count_ROR_64;
- int count_FPADD;
- int count_FPSUB;
- int count_FPMUL;
- int count_FPDIV;
- int count_FPSQRT;
- int count_FPROUND;
- int count_CALL_taken;
- int count_CALL_not_taken;
- int count_RET_stack_empty;
- int count_RET_taken;
- int count_RET_not_taken;
+ int count_ADD_64 = 0;
+ int count_ADD_32 = 0;
+ int count_SUB_64 = 0;
+ int count_SUB_32 = 0;
+ int count_MUL_64 = 0;
+ int count_MULH_64 = 0;
+ int count_MUL_32 = 0;
+ int count_IMUL_32 = 0;
+ int count_IMULH_64 = 0;
+ int count_DIV_64 = 0;
+ int count_IDIV_64 = 0;
+ int count_AND_64 = 0;
+ int count_AND_32 = 0;
+ int count_OR_64 = 0;
+ int count_OR_32 = 0;
+ int count_XOR_64 = 0;
+ int count_XOR_32 = 0;
+ int count_SHL_64 = 0;
+ int count_SHR_64 = 0;
+ int count_SAR_64 = 0;
+ int count_ROL_64 = 0;
+ int count_ROR_64 = 0;
+ int count_FPADD = 0;
+ int count_FPSUB = 0;
+ int count_FPMUL = 0;
+ int count_FPDIV = 0;
+ int count_FPSQRT = 0;
+ int count_FPROUND = 0;
+ int count_CALL_taken = 0;
+ int count_CALL_not_taken = 0;
+ int count_RET_stack_empty = 0;
+ int count_RET_taken = 0;
+ int count_RET_not_taken = 0;
int count_jump_taken[8] = { 0 };
int count_jump_not_taken[8] = { 0 };
+ int count_max_stack = 0;
+ int count_retdepth = 0;
+ int count_retdepth_max = 0;
+ int count_endstack = 0;
+ int count_instructions[ProgramLength] = { 0 };
#endif
convertible_t loada(Instruction&);
diff --git a/src/JitCompilerX86.cpp b/src/JitCompilerX86.cpp
index 6f83e40..644fd9b 100644
--- a/src/JitCompilerX86.cpp
+++ b/src/JitCompilerX86.cpp
@@ -712,11 +712,6 @@ namespace RandomX {
crlen = 17;
}
emit(0x74e53b48); //cmp rsp, rbp; je
- emitByte(20 + crlen);
- emit(uint16_t(0x8141)); //cmp regb, imm32
- emitByte(0xf8 + (instr.regb % RegistersCount));
- emit(instr.imm32);
- emitByte(jumpCondition(instr, true));
emitByte(11 + crlen);
emitByte(0x48);
emit(0x08244433); //xor rax,QWORD PTR [rsp+0x8]