diff --git a/.gitignore b/.gitignore
index 0f69877..35c1e9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,4 @@ obj/
*.user
*.suo
.vs
-
+x64
diff --git a/randomx.sln b/randomx.sln
new file mode 100644
index 0000000..c4d5a2a
--- /dev/null
+++ b/randomx.sln
@@ -0,0 +1,57 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.572
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "randomx", "vcxproj\randomx.vcxproj", "{3346A4AD-C438-4324-8B77-47A16452954B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4A4A689F-86AF-41C0-A974-1080506D0923}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-avalanche", "vcxproj\superscalar-avalanche.vcxproj", "{CF34A7EF-7DC9-4077-94A5-76F5425EA938}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-init", "vcxproj\superscalar-init.vcxproj", "{E59DC709-9B12-4A53-BAF3-79398821C376}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Debug|x64.ActiveCfg = Debug|x64
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Debug|x64.Build.0 = Debug|x64
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Debug|x86.ActiveCfg = Debug|Win32
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Debug|x86.Build.0 = Debug|Win32
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Release|x64.ActiveCfg = Release|x64
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Release|x64.Build.0 = Release|x64
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Release|x86.ActiveCfg = Release|Win32
+ {3346A4AD-C438-4324-8B77-47A16452954B}.Release|x86.Build.0 = Release|Win32
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Debug|x64.ActiveCfg = Debug|x64
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Debug|x64.Build.0 = Debug|x64
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Debug|x86.ActiveCfg = Debug|Win32
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Debug|x86.Build.0 = Debug|Win32
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Release|x64.ActiveCfg = Release|x64
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Release|x64.Build.0 = Release|x64
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Release|x86.ActiveCfg = Release|Win32
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}.Release|x86.Build.0 = Release|Win32
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Debug|x64.ActiveCfg = Debug|x64
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Debug|x64.Build.0 = Debug|x64
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Debug|x86.ActiveCfg = Debug|Win32
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Debug|x86.Build.0 = Debug|Win32
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Release|x64.ActiveCfg = Release|x64
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Release|x64.Build.0 = Release|x64
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Release|x86.ActiveCfg = Release|Win32
+ {E59DC709-9B12-4A53-BAF3-79398821C376}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938} = {4A4A689F-86AF-41C0-A974-1080506D0923}
+ {E59DC709-9B12-4A53-BAF3-79398821C376} = {4A4A689F-86AF-41C0-A974-1080506D0923}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {4EBC03DB-AE37-4141-8147-692F16E0ED02}
+ EndGlobalSection
+EndGlobal
diff --git a/src/tests/superscalar-avalanche.cpp b/src/tests/superscalar-avalanche.cpp
new file mode 100644
index 0000000..9c91a88
--- /dev/null
+++ b/src/tests/superscalar-avalanche.cpp
@@ -0,0 +1,68 @@
+/*
+Copyright (c) 2019 tevador
+
+This file is part of RandomX.
+
+RandomX is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+RandomX is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with RandomX. If not, see.
+*/
+
+#include
+#include
+#include
+#include "../LightProgramGenerator.hpp"
+#include "../InterpretedVirtualMachine.hpp"
+#include "../intrinPortable.h"
+
+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 };
+
+int main() {
+
+ int insensitiveProgCount[64] = { 0 };
+ std::vector dummy;
+ for (int bit = 0; bit < 64; ++bit) {
+ for (int i = 0; i < 10000; ++i) {
+ uint64_t ra[8] = {
+ 6364136223846793005ULL,
+ 9298410992540426048ULL,
+ 12065312585734608966ULL,
+ 9306329213124610396ULL,
+ 5281919268842080866ULL,
+ 10536153434571861004ULL,
+ 3398623926847679864ULL,
+ 9549104520008361294ULL,
+ };
+ uint64_t rb[8];
+ memcpy(rb, ra, sizeof rb);
+ rb[0] ^= (1ULL << bit);
+ RandomX::LightProgram p;
+ RandomX::Blake2Generator gen(seed, i);
+ RandomX::generateLightProg2(p, gen);
+ RandomX::InterpretedVirtualMachine::executeSuperscalar(ra, p, dummy);
+ RandomX::InterpretedVirtualMachine::executeSuperscalar(rb, p, dummy);
+ uint64_t diff = 0;
+ for (int j = 0; j < 8; ++j) {
+ diff += __popcnt64(ra[j] ^ rb[j]);
+ }
+ if (diff < 192 || diff > 320) {
+ std::cout << "Seed: " << i << " diff = " << diff << std::endl;
+ insensitiveProgCount[bit]++;
+ }
+ }
+ }
+ for (int bit = 0; bit < 64; ++bit) {
+ std::cout << bit << " " << insensitiveProgCount[bit] << std::endl;
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/src/tests/superscalar-init.cpp b/src/tests/superscalar-init.cpp
new file mode 100644
index 0000000..b366355
--- /dev/null
+++ b/src/tests/superscalar-init.cpp
@@ -0,0 +1,78 @@
+/*
+Copyright (c) 2019 tevador
+
+This file is part of RandomX.
+
+RandomX is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+RandomX is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with RandomX. If not, see.
+*/
+
+#include
+#include
+#include
+#include
+#include "../LightProgramGenerator.hpp"
+#include "../InterpretedVirtualMachine.hpp"
+#include "../intrinPortable.h"
+#include "../configuration.h"
+
+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 };
+
+int main() {
+ std::cout << "THIS PROGRAM REQUIRES MORE THAN 10 GB OF RAM TO COMPLETE" << std::endl;
+ std::vector dummy;
+ constexpr uint64_t superscalarMul0 = 6364136223846793005ULL;
+ constexpr uint64_t superscalarAdd1 = 9298410992540426748ULL; //9298410992540426048ULL
+ constexpr uint64_t superscalarAdd2 = 12065312585734608966ULL;
+ constexpr uint64_t superscalarAdd3 = 9306329213124610396ULL;
+ constexpr uint64_t superscalarAdd4 = 5281919268842080866ULL;
+ constexpr uint64_t superscalarAdd5 = 10536153434571861004ULL;
+ constexpr uint64_t superscalarAdd6 = 3398623926847679864ULL;
+ constexpr uint64_t superscalarAdd7 = 9549104520008361294ULL;
+ constexpr uint32_t totalBlocks = RANDOMX_DATASET_SIZE / RandomX::CacheLineSize;
+ std::unordered_set registerValues;
+ registerValues.reserve(totalBlocks);
+ registerValues.rehash(totalBlocks);
+ int collisionCount[9] = { 0 };
+ for (uint32_t blockNumber = 0; blockNumber < totalBlocks; ++blockNumber) {
+ uint64_t rl[8];
+ rl[0] = (blockNumber + 1) * superscalarMul0;
+ rl[1] = rl[0] ^ superscalarAdd1;
+ rl[2] = rl[0] ^ superscalarAdd2;
+ rl[3] = rl[0] ^ superscalarAdd3;
+ rl[4] = rl[0] ^ superscalarAdd4;
+ rl[5] = rl[0] ^ superscalarAdd5;
+ rl[6] = rl[0] ^ superscalarAdd6;
+ rl[7] = rl[0] ^ superscalarAdd7;
+ int blockCollisions = 0;
+ for (int i = 0; i < 8; ++i) {
+ uint64_t reducedValue = rl[i] & 0x3FFFFFFFFFFFF8; //bits 3-53 only
+ if (registerValues.find(reducedValue) != registerValues.end()) {
+ blockCollisions++;
+ std::cout << "Block " << blockNumber << ": collision of register r" << i << std::endl;
+ }
+ else {
+ registerValues.insert(reducedValue);
+ }
+ }
+ collisionCount[blockCollisions]++;
+ if ((blockNumber % (320 * 1024)) == 0)
+ std::cout << "Block " << blockNumber << " processed" << std::endl;
+ }
+
+ for (int i = 0; i < 9; ++i) {
+ std::cout << i << " register(s) collide in " << collisionCount[i] << " blocks" << std::endl;
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/vcxproj/randomx.vcxproj b/vcxproj/randomx.vcxproj
new file mode 100644
index 0000000..3dc09c8
--- /dev/null
+++ b/vcxproj/randomx.vcxproj
@@ -0,0 +1,156 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {3346A4AD-C438-4324-8B77-47A16452954B}
+ randomx
+ 10.0.17763.0
+
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ Disabled
+ false
+ true
+
+
+
+
+ Level4
+ Disabled
+ false
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ false
+ true
+
+
+ true
+ true
+ UseLinkTimeCodeGeneration
+ false
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ false
+ true
+ AssemblyCode
+
+
+ true
+ true
+ UseLinkTimeCodeGeneration
+ false
+
+
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vcxproj/randomx.vcxproj.filters b/vcxproj/randomx.vcxproj.filters
new file mode 100644
index 0000000..9f33e02
--- /dev/null
+++ b/vcxproj/randomx.vcxproj.filters
@@ -0,0 +1,87 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/vcxproj/superscalar-avalanche.vcxproj b/vcxproj/superscalar-avalanche.vcxproj
new file mode 100644
index 0000000..dab0311
--- /dev/null
+++ b/vcxproj/superscalar-avalanche.vcxproj
@@ -0,0 +1,142 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {CF34A7EF-7DC9-4077-94A5-76F5425EA938}
+ superscalaravalanche
+ 10.0.17763.0
+
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ false
+ true
+
+
+ true
+ true
+
+
+
+
+ Level3
+ Disabled
+ true
+ true
+
+
+
+
+ Level3
+ Disabled
+ true
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vcxproj/superscalar-avalanche.vcxproj.filters b/vcxproj/superscalar-avalanche.vcxproj.filters
new file mode 100644
index 0000000..9984ed1
--- /dev/null
+++ b/vcxproj/superscalar-avalanche.vcxproj.filters
@@ -0,0 +1,69 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/vcxproj/superscalar-init.vcxproj b/vcxproj/superscalar-init.vcxproj
new file mode 100644
index 0000000..4c4794c
--- /dev/null
+++ b/vcxproj/superscalar-init.vcxproj
@@ -0,0 +1,142 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {E59DC709-9B12-4A53-BAF3-79398821C376}
+ superscalarinit
+ 10.0.17763.0
+
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+ Application
+ true
+ v141
+ MultiByte
+
+
+ Application
+ false
+ v141
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ false
+ true
+
+
+ true
+ true
+
+
+
+
+ Level3
+ Disabled
+ false
+ true
+
+
+
+
+ Level3
+ Disabled
+ false
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ false
+ true
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vcxproj/superscalar-init.vcxproj.filters b/vcxproj/superscalar-init.vcxproj.filters
new file mode 100644
index 0000000..4666d07
--- /dev/null
+++ b/vcxproj/superscalar-init.vcxproj.filters
@@ -0,0 +1,69 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Source Files
+
+
+
\ No newline at end of file