mirror of
https://git.wownero.com/wownero/RandomWOW.git
synced 2024-12-22 07:48:54 +00:00
randomx project changed to a static library
separate benchmark project API usage examples
This commit is contained in:
parent
d7eefce583
commit
41557ce010
44
randomx.sln
44
randomx.sln
@ -13,6 +13,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-init", "vcxproj
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-stats", "vcxproj\superscalar-stats.vcxproj", "{0173D560-8C12-46B3-B467-0C6E7573AA0B}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-stats", "vcxproj\superscalar-stats.vcxproj", "{0173D560-8C12-46B3-B467-0C6E7573AA0B}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "benchmark", "vcxproj\benchmark.vcxproj", "{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "api-example1", "vcxproj\api-example1.vcxproj", "{83EA3E54-5D91-4E01-8EF6-C1E718334F83}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "api-example2", "vcxproj\api-example2.vcxproj", "{44947B9C-E6B1-4C06-BD01-F8EF43B59223}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "code-generator", "vcxproj\code-generator.vcxproj", "{3E490DEC-1874-43AA-92DA-1AC57C217EAC}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
@ -53,6 +61,38 @@ Global
|
|||||||
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x64.Build.0 = Release|x64
|
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x64.Build.0 = Release|x64
|
||||||
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x86.ActiveCfg = Release|Win32
|
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x86.Build.0 = Release|Win32
|
{0173D560-8C12-46B3-B467-0C6E7573AA0B}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Release|x64.Build.0 = Release|x64
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Release|x64.Build.0 = Release|x64
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Release|x64.Build.0 = Release|x64
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Release|x64.Build.0 = Release|x64
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -61,6 +101,10 @@ Global
|
|||||||
{CF34A7EF-7DC9-4077-94A5-76F5425EA938} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
{CF34A7EF-7DC9-4077-94A5-76F5425EA938} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
{E59DC709-9B12-4A53-BAF3-79398821C376} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
{E59DC709-9B12-4A53-BAF3-79398821C376} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
{0173D560-8C12-46B3-B467-0C6E7573AA0B} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
{0173D560-8C12-46B3-B467-0C6E7573AA0B} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
|
{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
|
{83EA3E54-5D91-4E01-8EF6-C1E718334F83} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
|
{44947B9C-E6B1-4C06-BD01-F8EF43B59223} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
|
{3E490DEC-1874-43AA-92DA-1AC57C217EAC} = {4A4A689F-86AF-41C0-A974-1080506D0923}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {4EBC03DB-AE37-4141-8147-692F16E0ED02}
|
SolutionGuid = {4EBC03DB-AE37-4141-8147-692F16E0ED02}
|
||||||
|
@ -1,401 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright (c) 2018 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<http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <limits>
|
|
||||||
#include "instructions.hpp"
|
|
||||||
//#define DEBUG
|
|
||||||
|
|
||||||
using namespace RandomX;
|
|
||||||
|
|
||||||
typedef void(*FpuOperation)(convertible_t&, fpu_reg_t&, fpu_reg_t&);
|
|
||||||
|
|
||||||
#define CATCH_CONFIG_MAIN
|
|
||||||
#include "catch.hpp"
|
|
||||||
|
|
||||||
uint64_t rxRound(uint32_t mode, int64_t x, int64_t y, FpuOperation op, bool hiEqualsLo = true) {
|
|
||||||
convertible_t a;
|
|
||||||
fpu_reg_t b, c;
|
|
||||||
a.u64 = mode;
|
|
||||||
FPROUND(a, b, c);
|
|
||||||
if (hiEqualsLo) {
|
|
||||||
a.i32lo = x;
|
|
||||||
a.i32hi = x;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
a.i64 = x;
|
|
||||||
}
|
|
||||||
b.lo.i64 = y;
|
|
||||||
b.hi.i64 = y;
|
|
||||||
op(a, b, c);
|
|
||||||
if (hiEqualsLo) {
|
|
||||||
CHECK(c.lo.u64 == c.hi.u64);
|
|
||||||
}
|
|
||||||
return c.lo.u64;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RX_EXECUTE_U64(va, vb, INST) do { \
|
|
||||||
a.u64 = va; \
|
|
||||||
b.u64 = vb; \
|
|
||||||
INST(a, b, c); \
|
|
||||||
} while(false)
|
|
||||||
|
|
||||||
#define RX_EXECUTE_I64(va, vb, INST) do { \
|
|
||||||
a.i64 = va; \
|
|
||||||
b.i64 = vb; \
|
|
||||||
INST(a, b, c); \
|
|
||||||
} while(false)
|
|
||||||
|
|
||||||
TEST_CASE("Integer addition (64-bit)", "[ADD_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xFFFFFFFF, 0x1, ADD_64);
|
|
||||||
CHECK(c.u64 == 0x100000000);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 0x8000000000000000, ADD_64);
|
|
||||||
CHECK(c.u64 == 0x0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Integer addition (32-bit)", "[ADD_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xFFFFFFFF, 0x1, ADD_32);
|
|
||||||
CHECK(c.u64 == 0);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xFF00000000000001, 0x0000000100000001, ADD_32);
|
|
||||||
CHECK(c.u64 == 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Integer subtraction (64-bit)", "[SUB_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(1, 0xFFFFFFFF, SUB_64);
|
|
||||||
CHECK(c.u64 == 0xFFFFFFFF00000002);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Integer subtraction (32-bit)", "[SUB_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(1, 0xFFFFFFFF, SUB_32);
|
|
||||||
CHECK(c.u64 == 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Unsigned multiplication (64-bit, low half)", "[MUL_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xBC550E96BA88A72B, 0xF5391FA9F18D6273, MUL_64);
|
|
||||||
CHECK(c.u64 == 0x28723424A9108E51);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Unsigned multiplication (64-bit, high half)", "[MULH_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xBC550E96BA88A72B, 0xF5391FA9F18D6273, MULH_64);
|
|
||||||
CHECK(c.u64 == 0xB4676D31D2B34883);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Unsigned multiplication (32-bit x 32-bit -> 64-bit)", "[MUL_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xBC550E96BA88A72B, 0xF5391FA9F18D6273, MUL_32);
|
|
||||||
CHECK(c.u64 == 0xB001AA5FA9108E51);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Signed multiplication (32-bit x 32-bit -> 64-bit)", "[IMUL_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xBC550E96BA88A72B, 0xF5391FA9F18D6273, IMUL_32);
|
|
||||||
CHECK(c.u64 == 0x03EBA0C1A9108E51);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Signed multiplication (64-bit, high half)", "[IMULH_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xBC550E96BA88A72B, 0xF5391FA9F18D6273, IMULH_64);
|
|
||||||
CHECK(c.u64 == 0x02D93EF1269D3EE5);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Unsigned division (64-bit / 32-bit -> 32-bit)", "[DIV_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(8774217225983458895, 3014068202, DIV_64);
|
|
||||||
CHECK(c.u64 == 2911087818);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(8774217225983458895, 0, DIV_64);
|
|
||||||
CHECK(c.u64 == 8774217225983458895);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(3014068202, 8774217225983458895, DIV_64);
|
|
||||||
CHECK(c.u64 == 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Signed division (64-bit / 32-bit -> 32-bit)", "[IDIV_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(8774217225983458895, 3014068202, IDIV_64);
|
|
||||||
CHECK(c.u64 == 0xFFFFFFFE67B4994E);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(5, 0xFFFFFFFFFFFFFFFF, IDIV_64);
|
|
||||||
CHECK(c.u64 == 0xFFFFFFFFFFFFFFFB);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(8774217225983458895, 0, IDIV_64);
|
|
||||||
CHECK(c.u64 == 8774217225983458895);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 0xFFFFFFFFFFFFFFFF, IDIV_64);
|
|
||||||
CHECK(c.u64 == 0x8000000000000000);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 0x93D1FFFFFFFFFFFF, IDIV_64);
|
|
||||||
CHECK(c.u64 == 0x8000000000000000);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xFFFFFFFFB3A707EA, 8774217225983458895, IDIV_64);
|
|
||||||
CHECK(c.u64 == 0xFFFFFFFFFFFFFFFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise AND (64-bit)", "[AND_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA, AND_64);
|
|
||||||
CHECK(c.u64 == 0x8888888888888888);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise AND (32-bit)", "[AND_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA, AND_32);
|
|
||||||
CHECK(c.u64 == 0x88888888);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise OR (64-bit)", "[OR_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x4444444444444444, 0xAAAAAAAAAAAAAAAA, OR_64);
|
|
||||||
CHECK(c.u64 == 0xEEEEEEEEEEEEEEEE);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise OR (32-bit)", "[OR_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x4444444444444444, 0xAAAAAAAAAAAAAAAA, OR_32);
|
|
||||||
CHECK(c.u64 == 0xEEEEEEEE);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise XOR (64-bit)", "[XOR_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8888888888888888, 0xAAAAAAAAAAAAAAAA, XOR_64);
|
|
||||||
CHECK(c.u64 == 0x2222222222222222);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Bitwise XOR (32-bit)", "[XOR_32]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8888888888888888, 0xAAAAAAAAAAAAAAAA, XOR_32);
|
|
||||||
CHECK(c.u64 == 0x22222222);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Logical left shift (64-bit)", "[SHL_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x3, 52, SHL_64);
|
|
||||||
CHECK(c.u64 == 0x30000000000000);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(953360005391419562, 4569451684712230561, SHL_64);
|
|
||||||
CHECK(c.u64 == 6978065200108797952);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 1, SHL_64);
|
|
||||||
CHECK(c.u64 == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Logical right shift (64-bit)", "[SHR_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x3, 52, SHR_64);
|
|
||||||
CHECK(c.u64 == 0);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(953360005391419562, 4569451684712230561, SHR_64);
|
|
||||||
CHECK(c.u64 == 110985711);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 1, SHR_64);
|
|
||||||
CHECK(c.u64 == 0x4000000000000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Arithmetic right shift (64-bit)", "[SAR_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_I64(-9, 2, SAR_64);
|
|
||||||
CHECK(c.i64 == -3);
|
|
||||||
|
|
||||||
RX_EXECUTE_I64(INT64_MIN, 63, SAR_64);
|
|
||||||
CHECK(c.i64 == -1);
|
|
||||||
|
|
||||||
RX_EXECUTE_I64(INT64_MAX, 163768499474606398, SAR_64);
|
|
||||||
CHECK(c.i64 == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Circular left shift (64-bit)", "[ROL_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x3, 52, ROL_64);
|
|
||||||
CHECK(c.u64 == 0x30000000000000);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(953360005391419562, 4569451684712230561, ROL_64);
|
|
||||||
CHECK(c.u64 == 6978065200552740799);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 1, ROL_64);
|
|
||||||
CHECK(c.u64 == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Circular right shift (64-bit)", "[ROR_64]") {
|
|
||||||
convertible_t a, b, c;
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x3, 52, ROR_64);
|
|
||||||
CHECK(c.u64 == 12288);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(953360005391419562, 4569451684712230561, ROR_64);
|
|
||||||
CHECK(c.u64 == 0xD835C455069D81EF);
|
|
||||||
|
|
||||||
RX_EXECUTE_U64(0x8000000000000000, 1, ROR_64);
|
|
||||||
CHECK(c.u64 == 0x4000000000000000);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Denormal results are not produced", "[FTZ]") {
|
|
||||||
FPINIT();
|
|
||||||
convertible_t a;
|
|
||||||
fpu_reg_t b;
|
|
||||||
a.i64 = 1;
|
|
||||||
b.lo.f64 = DBL_MAX;
|
|
||||||
FPDIV(a, b, b);
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << a.i64 << " / " << DBL_MAX << " = " << std::hex << b.lo.u64 << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(std::fpclassify(b.lo.f64) != FP_SUBNORMAL);
|
|
||||||
a.i64 = 0;
|
|
||||||
FPSUB(a, b, b);
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << a.i64 << " - " << b.lo.f64 << " = " << std::hex << b.lo.u64 << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(std::fpclassify(b.lo.f64) != FP_SUBNORMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("NaN results are not produced", "[NAN]") {
|
|
||||||
FPINIT();
|
|
||||||
convertible_t a;
|
|
||||||
fpu_reg_t b;
|
|
||||||
a.i64 = 0;
|
|
||||||
b.lo.f64 = 0;
|
|
||||||
FPDIV(a, b, b);
|
|
||||||
CHECK(std::fpclassify(b.lo.f64) != FP_NAN);
|
|
||||||
b.lo.f64 = std::numeric_limits<double>::infinity();
|
|
||||||
FPMUL(a, b, b);
|
|
||||||
CHECK(std::fpclassify(b.lo.f64) != FP_NAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
volatile int64_t fpRounda = 7379480244170225589;
|
|
||||||
volatile int32_t fpAdda = -2110701072;
|
|
||||||
volatile int64_t fpAddb = 5822431907862180274;
|
|
||||||
volatile int32_t fpSuba = -1651770302;
|
|
||||||
volatile int64_t fpSubb = 4982086006202596504;
|
|
||||||
volatile int32_t fpMula1 = 122885310;
|
|
||||||
volatile int64_t fpMulb1 = 6036690890763685020;
|
|
||||||
volatile int32_t fpMula2 = -1952486466;
|
|
||||||
volatile int64_t fpMulb2 = 5693689137909219638;
|
|
||||||
volatile int32_t fpDiva1 = -1675630642;
|
|
||||||
volatile int64_t fpDivb1 = -3959960229647489051;
|
|
||||||
volatile int32_t fpDiva2 = -1651770302;
|
|
||||||
volatile int64_t fpDivb2 = 4982086006202596504;
|
|
||||||
volatile int32_t fpSqrta1 = 440505508;
|
|
||||||
volatile int32_t fpSqrta2 = -2147483648;
|
|
||||||
|
|
||||||
TEST_CASE("IEEE-754 compliance", "[FPU]") {
|
|
||||||
FPINIT();
|
|
||||||
convertible_t a;
|
|
||||||
fpu_reg_t b, c;
|
|
||||||
b.lo.f64 = 0.0;
|
|
||||||
|
|
||||||
a.i64 = 1;
|
|
||||||
FPDIV(a, b, c);
|
|
||||||
CHECK(c.lo.f64 == std::numeric_limits<double>::infinity());
|
|
||||||
|
|
||||||
a.i64 = -1;
|
|
||||||
FPDIV(a, b, c);
|
|
||||||
CHECK(c.lo.f64 == -std::numeric_limits<double>::infinity());
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPROUND" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpRounda, 0, &FPROUND, false) == 0x43d99a4b8bc531dcU);
|
|
||||||
CHECK(rxRound(RoundDown, fpRounda, 0, &FPROUND, false) == 0x43d99a4b8bc531dcU);
|
|
||||||
CHECK(rxRound(RoundUp, fpRounda, 0, &FPROUND, false) == 0x43d99a4b8bc531dcU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpRounda, 0, &FPROUND, false) == 0x43d99a4b8bc531dcU);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPADD" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpAdda, fpAddb, &FPADD) == 0x50cd6ef8bd0671b2U);
|
|
||||||
CHECK(rxRound(RoundDown, fpAdda, fpAddb, &FPADD) == 0x50cd6ef8bd0671b1U);
|
|
||||||
CHECK(rxRound(RoundUp, fpAdda, fpAddb, &FPADD) == 0x50cd6ef8bd0671b2U);
|
|
||||||
CHECK(rxRound(RoundToZero, fpAdda, fpAddb, &FPADD) == 0x50cd6ef8bd0671b1U);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPSUB" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpSuba, fpSubb, &FPSUB) == 0xc523ecd390267c99U);
|
|
||||||
CHECK(rxRound(RoundDown, fpSuba, fpSubb, &FPSUB) == 0xc523ecd390267c99U);
|
|
||||||
CHECK(rxRound(RoundUp, fpSuba, fpSubb, &FPSUB) == 0xc523ecd390267c98U);
|
|
||||||
CHECK(rxRound(RoundToZero, fpSuba, fpSubb, &FPSUB) == 0xc523ecd390267c98U);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPMUL" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpMula1, fpMulb1, &FPMUL) == 0x5574b924d2f24542U);
|
|
||||||
CHECK(rxRound(RoundDown, fpMula1, fpMulb1, &FPMUL) == 0x5574b924d2f24541U);
|
|
||||||
CHECK(rxRound(RoundUp, fpMula1, fpMulb1, &FPMUL) == 0x5574b924d2f24542U);
|
|
||||||
CHECK(rxRound(RoundToZero, fpMula1, fpMulb1, &FPMUL) == 0x5574b924d2f24541U);
|
|
||||||
|
|
||||||
CHECK(rxRound(RoundToNearest, fpMula2, fpMulb2, &FPMUL) == 0xd0f23a18891a7470U);
|
|
||||||
CHECK(rxRound(RoundDown, fpMula2, fpMulb2, &FPMUL) == 0xd0f23a18891a7470U);
|
|
||||||
CHECK(rxRound(RoundUp, fpMula2, fpMulb2, &FPMUL) == 0xd0f23a18891a746fU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpMula2, fpMulb2, &FPMUL) == 0xd0f23a18891a746fU);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPDIV" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpDiva1, fpDivb1, &FPDIV) == 0x38bd2a7732b5eb0aU);
|
|
||||||
CHECK(rxRound(RoundDown, fpDiva1, fpDivb1, &FPDIV) == 0x38bd2a7732b5eb09U);
|
|
||||||
CHECK(rxRound(RoundUp, fpDiva1, fpDivb1, &FPDIV) == 0x38bd2a7732b5eb0aU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpDiva1, fpDivb1, &FPDIV) == 0x38bd2a7732b5eb09U);
|
|
||||||
|
|
||||||
CHECK(rxRound(RoundToNearest, fpDiva2, fpDivb2, &FPDIV) == 0xbca3c3c039ccc71cU);
|
|
||||||
CHECK(rxRound(RoundDown, fpDiva2, fpDivb2, &FPDIV) == 0xbca3c3c039ccc71cU);
|
|
||||||
CHECK(rxRound(RoundUp, fpDiva2, fpDivb2, &FPDIV) == 0xbca3c3c039ccc71bU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpDiva2, fpDivb2, &FPDIV) == 0xbca3c3c039ccc71bU);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
std::cout << "FPSQRT" << std::endl;
|
|
||||||
#endif
|
|
||||||
CHECK(rxRound(RoundToNearest, fpSqrta1, 0, &FPSQRT) == 0x40d47f0e46ebc19dU);
|
|
||||||
CHECK(rxRound(RoundDown, fpSqrta1, 0, &FPSQRT) == 0x40d47f0e46ebc19cU);
|
|
||||||
CHECK(rxRound(RoundUp, fpSqrta1, 0, &FPSQRT) == 0x40d47f0e46ebc19dU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpSqrta1, 0, &FPSQRT) == 0x40d47f0e46ebc19cU);
|
|
||||||
|
|
||||||
CHECK(rxRound(RoundToNearest, fpSqrta2, 0, &FPSQRT) == 0x40e6a09e667f3bcdU);
|
|
||||||
CHECK(rxRound(RoundDown, fpSqrta2, 0, &FPSQRT) == 0x40e6a09e667f3bccU);
|
|
||||||
CHECK(rxRound(RoundUp, fpSqrta2, 0, &FPSQRT) == 0x40e6a09e667f3bcdU);
|
|
||||||
CHECK(rxRound(RoundToZero, fpSqrta2, 0, &FPSQRT) == 0x40e6a09e667f3bccU);
|
|
||||||
}
|
|
14075
src/catch.hpp
14075
src/catch.hpp
File diff suppressed because it is too large
Load Diff
@ -106,7 +106,7 @@ void randomx_cache::initialize(const void *seed, size_t seedSize) {
|
|||||||
fill_memory_blocks(&instance);
|
fill_memory_blocks(&instance);
|
||||||
|
|
||||||
reciprocalCache.clear();
|
reciprocalCache.clear();
|
||||||
randomx::Blake2Generator gen(seed, seedSize, 1000); //TODO
|
randomx::Blake2Generator gen(seed, seedSize);
|
||||||
for (int i = 0; i < RANDOMX_CACHE_ACCESSES; ++i) {
|
for (int i = 0; i < RANDOMX_CACHE_ACCESSES; ++i) {
|
||||||
randomx::generateSuperscalar(programs[i], gen);
|
randomx::generateSuperscalar(programs[i], gen);
|
||||||
for (unsigned j = 0; j < programs[i].getSize(); ++j) {
|
for (unsigned j = 0; j < programs[i].getSize(); ++j) {
|
||||||
@ -123,9 +123,8 @@ void randomx_cache::initialize(const void *seed, size_t seedSize) {
|
|||||||
namespace randomx {
|
namespace randomx {
|
||||||
|
|
||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
bool Dataset<Allocator>::allocate() {
|
void Dataset<Allocator>::allocate() {
|
||||||
memory = (uint8_t*)Allocator::allocMemory(RANDOMX_DATASET_SIZE);
|
memory = (uint8_t*)Allocator::allocMemory(RANDOMX_DATASET_SIZE);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
@ -134,9 +133,8 @@ namespace randomx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
bool Cache<Allocator>::allocate() {
|
void Cache<Allocator>::allocate() {
|
||||||
memory = (uint8_t*)Allocator::allocMemory(RANDOMX_ARGON_MEMORY * ARGON2_BLOCK_SIZE);
|
memory = (uint8_t*)Allocator::allocMemory(RANDOMX_ARGON_MEMORY * ARGON2_BLOCK_SIZE);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
|
@ -29,7 +29,7 @@ along with RandomX. If not, see<http://www.gnu.org/licenses/>.
|
|||||||
/* Global scope for C binding */
|
/* Global scope for C binding */
|
||||||
struct randomx_dataset {
|
struct randomx_dataset {
|
||||||
virtual ~randomx_dataset() = 0;
|
virtual ~randomx_dataset() = 0;
|
||||||
virtual bool allocate() = 0;
|
virtual void allocate() = 0;
|
||||||
uint8_t* memory = nullptr;
|
uint8_t* memory = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ namespace randomx {
|
|||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
struct Dataset : public randomx_dataset {
|
struct Dataset : public randomx_dataset {
|
||||||
~Dataset() override;
|
~Dataset() override;
|
||||||
bool allocate() override;
|
void allocate() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
using DatasetDefault = Dataset<AlignedAllocator<CacheLineSize>>;
|
using DatasetDefault = Dataset<AlignedAllocator<CacheLineSize>>;
|
||||||
@ -55,7 +55,7 @@ namespace randomx {
|
|||||||
template<class Allocator>
|
template<class Allocator>
|
||||||
struct Cache : public randomx_cache {
|
struct Cache : public randomx_cache {
|
||||||
~Cache() override;
|
~Cache() override;
|
||||||
bool allocate() override;
|
void allocate() override;
|
||||||
DatasetInitFunc getInitFunc() override;
|
DatasetInitFunc getInitFunc() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,309 +0,0 @@
|
|||||||
;# Copyright (c) 2018 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<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
IFDEF RAX
|
|
||||||
|
|
||||||
_RANDOMX_EXECUTE_PROGRAM SEGMENT PAGE READ EXECUTE
|
|
||||||
|
|
||||||
PUBLIC executeProgram
|
|
||||||
|
|
||||||
executeProgram PROC
|
|
||||||
; REGISTER ALLOCATION:
|
|
||||||
; rax -> temporary
|
|
||||||
; rbx -> "ic"
|
|
||||||
; rcx -> temporary
|
|
||||||
; rdx -> temporary
|
|
||||||
; rsi -> scratchpad pointer
|
|
||||||
; rdi -> dataset pointer
|
|
||||||
; rbp -> "ma", "mx"
|
|
||||||
; rsp -> stack pointer
|
|
||||||
; r8 -> "r0"
|
|
||||||
; r9 -> "r1"
|
|
||||||
; r10 -> "r2"
|
|
||||||
; r11 -> "r3"
|
|
||||||
; r12 -> "r4"
|
|
||||||
; r13 -> "r5"
|
|
||||||
; r14 -> "r6"
|
|
||||||
; r15 -> "r7"
|
|
||||||
; xmm0 -> "f0"
|
|
||||||
; xmm1 -> "f1"
|
|
||||||
; xmm2 -> "f2"
|
|
||||||
; xmm3 -> "f3"
|
|
||||||
; xmm4 -> "e0"
|
|
||||||
; xmm5 -> "e1"
|
|
||||||
; xmm6 -> "e2"
|
|
||||||
; xmm7 -> "e3"
|
|
||||||
; xmm8 -> "a0"
|
|
||||||
; xmm9 -> "a1"
|
|
||||||
; xmm10 -> "a2"
|
|
||||||
; xmm11 -> "a3"
|
|
||||||
; xmm12 -> temporary
|
|
||||||
; xmm13 -> mantissa mask = 0x000fffffffffffff000fffffffffffff
|
|
||||||
; xmm14 -> exponent 2**-240 = 0x30f000000000000030f0000000000000
|
|
||||||
; xmm15 -> scale mask = 0x81f000000000000081f0000000000000
|
|
||||||
|
|
||||||
; store callee-saved registers
|
|
||||||
push rbx
|
|
||||||
push rbp
|
|
||||||
push rdi
|
|
||||||
push rsi
|
|
||||||
push r12
|
|
||||||
push r13
|
|
||||||
push r14
|
|
||||||
push r15
|
|
||||||
sub rsp, 80
|
|
||||||
movdqu xmmword ptr [rsp+64], xmm6
|
|
||||||
movdqu xmmword ptr [rsp+48], xmm7
|
|
||||||
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 rdi, qword ptr [rdx+8] ;# uint8_t* dataset
|
|
||||||
mov rsi, r8 ;# uint8_t* scratchpad
|
|
||||||
mov rbx, r9 ;# loop counter
|
|
||||||
|
|
||||||
mov rax, rbp
|
|
||||||
|
|
||||||
;# 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 [mantissaMask]
|
|
||||||
movapd xmm14, xmmword ptr [exp240]
|
|
||||||
movapd xmm15, xmmword ptr [scaleMask]
|
|
||||||
|
|
||||||
jmp program_begin
|
|
||||||
|
|
||||||
ALIGN 64
|
|
||||||
mantissaMask:
|
|
||||||
db 255, 255, 255, 255, 255, 255, 15, 0, 255, 255, 255, 255, 255, 255, 15, 0
|
|
||||||
exp240:
|
|
||||||
db 0, 0, 0, 0, 0, 0, 240, 48, 0, 0, 0, 0, 0, 0, 240, 48
|
|
||||||
scaleMask:
|
|
||||||
db 0, 0, 0, 0, 0, 0, 240, 129, 0, 0, 0, 0, 0, 0, 240, 129
|
|
||||||
|
|
||||||
ALIGN 64
|
|
||||||
program_begin:
|
|
||||||
xor rax, r8 ;# read address register 1
|
|
||||||
xor rax, r10
|
|
||||||
mov rdx, rax
|
|
||||||
and eax, 2097088
|
|
||||||
lea rcx, [rsi+rax]
|
|
||||||
push rcx
|
|
||||||
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]
|
|
||||||
ror rdx, 32
|
|
||||||
and edx, 2097088
|
|
||||||
lea rcx, [rsi+rdx]
|
|
||||||
push rcx
|
|
||||||
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, xmm13
|
|
||||||
andps xmm5, xmm13
|
|
||||||
andps xmm6, xmm13
|
|
||||||
andps xmm7, xmm13
|
|
||||||
orps xmm4, xmm14
|
|
||||||
orps xmm5, xmm14
|
|
||||||
orps xmm6, xmm14
|
|
||||||
orps xmm7, xmm14
|
|
||||||
|
|
||||||
;# 256 instructions
|
|
||||||
include program.inc
|
|
||||||
IF 1
|
|
||||||
mov eax, r12d ;# read address register 1
|
|
||||||
xor eax, r15d ;# read address register 2
|
|
||||||
xor rbp, rax ;# modify "mx"
|
|
||||||
xor eax, eax
|
|
||||||
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]
|
|
||||||
pop rcx
|
|
||||||
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
|
|
||||||
pop rcx
|
|
||||||
xorpd xmm0, xmm4
|
|
||||||
xorpd xmm1, xmm5
|
|
||||||
xorpd xmm2, xmm6
|
|
||||||
xorpd 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
|
|
||||||
else
|
|
||||||
; memcpy trace from stack to scratchpad
|
|
||||||
mov rax, rsi
|
|
||||||
mov rdx, rdi
|
|
||||||
|
|
||||||
cld
|
|
||||||
mov rsi, rsp
|
|
||||||
mov rdi, rax
|
|
||||||
mov rcx, 1024
|
|
||||||
|
|
||||||
rep movsq
|
|
||||||
|
|
||||||
add rsp, 8192
|
|
||||||
|
|
||||||
pop rcx
|
|
||||||
pop rcx
|
|
||||||
|
|
||||||
mov rsi, rax
|
|
||||||
mov rdi, rdx
|
|
||||||
endif
|
|
||||||
sub ebx, 1
|
|
||||||
jnz program_begin
|
|
||||||
|
|
||||||
rx_finish:
|
|
||||||
; save VM register values
|
|
||||||
pop rcx
|
|
||||||
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
|
|
||||||
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]
|
|
||||||
movdqa xmmword ptr [rcx+64], xmm4
|
|
||||||
movdqa xmmword ptr [rcx+80], xmm5
|
|
||||||
movdqa xmmword ptr [rcx+96], xmm6
|
|
||||||
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]
|
|
||||||
movdqu xmm7, xmmword ptr [rsp+48]
|
|
||||||
movdqu xmm6, xmmword ptr [rsp+64]
|
|
||||||
add rsp, 80
|
|
||||||
pop r15
|
|
||||||
pop r14
|
|
||||||
pop r13
|
|
||||||
pop r12
|
|
||||||
pop rsi
|
|
||||||
pop rdi
|
|
||||||
pop rbp
|
|
||||||
pop rbx
|
|
||||||
|
|
||||||
; return
|
|
||||||
ret
|
|
||||||
|
|
||||||
TransformAddress MACRO reg32, reg64
|
|
||||||
;# Transforms the address in the register so that the transformed address
|
|
||||||
;# lies in a different cache line than the original address (mod 2^N).
|
|
||||||
;# This is done to prevent a load-store dependency.
|
|
||||||
;# There are 3 different transformations that can be used: x -> 9*x+C, x -> x+C, x -> x^C
|
|
||||||
;lea reg32, [reg64+reg64*8+127] ;# C = -119 -110 -101 -92 -83 -74 -65 -55 -46 -37 -28 -19 -10 -1 9 18 27 36 45 54 63 73 82 91 100 109 118 127
|
|
||||||
db 64
|
|
||||||
add reg32, -39 ;# C = all except -7 to +7
|
|
||||||
;xor reg32, -8 ;# C = all except 0 to 7
|
|
||||||
ENDM
|
|
||||||
|
|
||||||
ALIGN 64
|
|
||||||
rx_read:
|
|
||||||
;# IN eax = random 32-bit address
|
|
||||||
;# GLOBAL rdi = address of the dataset address
|
|
||||||
;# GLOBAL rsi = address of the scratchpad
|
|
||||||
;# GLOBAL rbp = low 32 bits = "mx", high 32 bits = "ma"
|
|
||||||
;# MODIFY rcx, rdx
|
|
||||||
TransformAddress eax, rax ;# TransformAddress function
|
|
||||||
mov rcx, qword ptr [rdi] ;# load the dataset address
|
|
||||||
xor rbp, rax ;# modify "mx"
|
|
||||||
;# prefetch cacheline "mx"
|
|
||||||
and rbp, -64 ;# align "mx" to the start of a cache line
|
|
||||||
mov edx, ebp ;# edx = mx
|
|
||||||
prefetchnta byte ptr [rcx+rdx]
|
|
||||||
;# read cacheline "ma"
|
|
||||||
ror rbp, 32 ;# swap "ma" and "mx"
|
|
||||||
mov edx, ebp ;# edx = ma
|
|
||||||
lea rcx, [rcx+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]
|
|
||||||
ret
|
|
||||||
executeProgram ENDP
|
|
||||||
|
|
||||||
_RANDOMX_EXECUTE_PROGRAM ENDS
|
|
||||||
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
END
|
|
@ -51,7 +51,10 @@ extern "C" {
|
|||||||
UNREACHABLE;
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cache->allocate()) {
|
try {
|
||||||
|
cache->allocate();
|
||||||
|
}
|
||||||
|
catch (std::exception &ex) {
|
||||||
delete cache;
|
delete cache;
|
||||||
cache = nullptr;
|
cache = nullptr;
|
||||||
}
|
}
|
||||||
@ -75,7 +78,11 @@ extern "C" {
|
|||||||
else {
|
else {
|
||||||
dataset = new randomx::DatasetDefault();
|
dataset = new randomx::DatasetDefault();
|
||||||
}
|
}
|
||||||
if (!dataset->allocate()) {
|
|
||||||
|
try {
|
||||||
|
dataset->allocate();
|
||||||
|
}
|
||||||
|
catch (std::exception &ex) {
|
||||||
delete dataset;
|
delete dataset;
|
||||||
dataset = nullptr;
|
dataset = nullptr;
|
||||||
}
|
}
|
||||||
@ -183,7 +190,7 @@ extern "C" {
|
|||||||
delete machine;
|
delete machine;
|
||||||
}
|
}
|
||||||
|
|
||||||
void randomx_calculate_hash(randomx_vm *machine, void *input, size_t inputSize, void *output) {
|
void randomx_calculate_hash(randomx_vm *machine, const void *input, size_t inputSize, void *output) {
|
||||||
alignas(16) uint64_t hash[8];
|
alignas(16) uint64_t hash[8];
|
||||||
blake2b(hash, sizeof(hash), input, inputSize, nullptr, 0);
|
blake2b(hash, sizeof(hash), input, inputSize, nullptr, 0);
|
||||||
machine->initScratchpad(&hash);
|
machine->initScratchpad(&hash);
|
||||||
@ -194,7 +201,7 @@ extern "C" {
|
|||||||
blake2b(hash, sizeof(hash), machine->getRegisterFile(), sizeof(randomx::RegisterFile), nullptr, 0);
|
blake2b(hash, sizeof(hash), machine->getRegisterFile(), sizeof(randomx::RegisterFile), nullptr, 0);
|
||||||
}
|
}
|
||||||
machine->run(&hash);
|
machine->run(&hash);
|
||||||
machine->getFinalResult(output, 64);
|
machine->getFinalResult(output, RANDOMX_HASH_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,73 +20,6 @@ along with RandomX. If not, see<http://www.gnu.org/licenses/>.
|
|||||||
#ifndef RANDOMX_H
|
#ifndef RANDOMX_H
|
||||||
#define RANDOMX_H
|
#define RANDOMX_H
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Minimal usage example:
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
#include "randomx.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
const char mySeed[] = "RandomX example seed";
|
|
||||||
const char myInput[] = "RandomX example input";
|
|
||||||
char hash[RANDOMX_HASH_SIZE];
|
|
||||||
|
|
||||||
randomx_cache *myCache = randomx_alloc_cache(RANDOMX_FLAG_DEFAULT);
|
|
||||||
randomx_init_cache(myCache, mySeed, sizeof mySeed);
|
|
||||||
randomx_vm *myMachine = randomx_create_vm(RANDOMX_FLAG_DEFAULT);
|
|
||||||
randomx_vm_set_cache(myMachine, myCache);
|
|
||||||
|
|
||||||
randomx_calculate_hash(myMachine, myInput, sizeof myInput, hash);
|
|
||||||
|
|
||||||
randomx_destroy_vm(myMachine);
|
|
||||||
randomx_release_cache(myCache);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < RANDOMX_HASH_SIZE; ++i)
|
|
||||||
printf("%02x", hash[i]);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Optimized usage example:
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
#include "randomx.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
const char mySeed[] = "RandomX example seed";
|
|
||||||
const char myInput[] = "RandomX example input";
|
|
||||||
char hash[RANDOMX_HASH_SIZE];
|
|
||||||
|
|
||||||
randomx_cache *myCache = randomx_alloc_cache(RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES);
|
|
||||||
randomx_init_cache(myCache, mySeed, sizeof mySeed);
|
|
||||||
|
|
||||||
randomx_dataset *myDataset = randomx_alloc_dataset(RANDOMX_FLAG_LARGE_PAGES);
|
|
||||||
randomx_init_dataset(myDataset, myCache, 0, RANDOMX_DATASET_BLOCKS);
|
|
||||||
randomx_release_cache(myCache);
|
|
||||||
|
|
||||||
randomx_vm *myMachine = randomx_create_vm(RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES);
|
|
||||||
randomx_vm_set_dataset(myMachine, myDataset);
|
|
||||||
|
|
||||||
randomx_calculate_hash(myMachine, myInput, sizeof myInput, hash);
|
|
||||||
|
|
||||||
randomx_destroy_vm(myMachine);
|
|
||||||
randomx_release_dataset(myDataset);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < RANDOMX_HASH_SIZE; ++i)
|
|
||||||
printf("%02x", hash[i]);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#define RANDOMX_HASH_SIZE 32
|
#define RANDOMX_HASH_SIZE 32
|
||||||
@ -121,7 +54,7 @@ void randomx_vm_set_cache(randomx_vm *machine, randomx_cache* cache);
|
|||||||
void randomx_vm_set_dataset(randomx_vm *machine, randomx_dataset *dataset);
|
void randomx_vm_set_dataset(randomx_vm *machine, randomx_dataset *dataset);
|
||||||
void randomx_destroy_vm(randomx_vm *machine);
|
void randomx_destroy_vm(randomx_vm *machine);
|
||||||
|
|
||||||
void randomx_calculate_hash(randomx_vm *machine, void *input, size_t inputSize, void *output);
|
void randomx_calculate_hash(randomx_vm *machine, const void *input, size_t inputSize, void *output);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
25
src/tests/api-example1.c
Normal file
25
src/tests/api-example1.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "../randomx.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
const char mySeed[] = "RandomX example seed";
|
||||||
|
const char myInput[] = "RandomX example input";
|
||||||
|
char hash[RANDOMX_HASH_SIZE];
|
||||||
|
|
||||||
|
randomx_cache *myCache = randomx_alloc_cache(RANDOMX_FLAG_DEFAULT);
|
||||||
|
randomx_init_cache(myCache, mySeed, sizeof mySeed);
|
||||||
|
randomx_vm *myMachine = randomx_create_vm(RANDOMX_FLAG_DEFAULT);
|
||||||
|
randomx_vm_set_cache(myMachine, myCache);
|
||||||
|
|
||||||
|
randomx_calculate_hash(myMachine, &myInput, sizeof myInput, hash);
|
||||||
|
|
||||||
|
randomx_destroy_vm(myMachine);
|
||||||
|
randomx_release_cache(myCache);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < RANDOMX_HASH_SIZE; ++i)
|
||||||
|
printf("%02x", hash[i] & 0xff);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
43
src/tests/api-example2.cpp
Normal file
43
src/tests/api-example2.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "../randomx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
const char mySeed[] = "RandomX example seed";
|
||||||
|
const char myInput[] = "RandomX example input";
|
||||||
|
char hash[RANDOMX_HASH_SIZE];
|
||||||
|
|
||||||
|
randomx_cache *myCache = randomx_alloc_cache((randomx_flags)(RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES));
|
||||||
|
if (myCache == nullptr) {
|
||||||
|
std::cout << "Cache allocation failed" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
randomx_init_cache(myCache, mySeed, sizeof mySeed);
|
||||||
|
|
||||||
|
randomx_dataset *myDataset = randomx_alloc_dataset(RANDOMX_FLAG_LARGE_PAGES);
|
||||||
|
if (myDataset == nullptr) {
|
||||||
|
std::cout << "Dataset allocation failed" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::thread t1(&randomx_init_dataset, myDataset, myCache, 0, RANDOMX_DATASET_BLOCKS / 2);
|
||||||
|
std::thread t2(&randomx_init_dataset, myDataset, myCache, RANDOMX_DATASET_BLOCKS / 2, RANDOMX_DATASET_BLOCKS / 2);
|
||||||
|
t1.join();
|
||||||
|
t2.join();
|
||||||
|
randomx_release_cache(myCache);
|
||||||
|
|
||||||
|
randomx_vm *myMachine = randomx_create_vm((randomx_flags)(RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES));
|
||||||
|
randomx_vm_set_dataset(myMachine, myDataset);
|
||||||
|
|
||||||
|
randomx_calculate_hash(myMachine, &myInput, sizeof myInput, hash);
|
||||||
|
|
||||||
|
randomx_destroy_vm(myMachine);
|
||||||
|
randomx_release_dataset(myDataset);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < RANDOMX_HASH_SIZE; ++i)
|
||||||
|
std::cout << std::hex << ((int)hash[i] & 0xff);
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2018 tevador
|
Copyright (c) 2019 tevador
|
||||||
|
|
||||||
This file is part of RandomX.
|
This file is part of RandomX.
|
||||||
|
|
||||||
@ -16,25 +16,19 @@ GNU General Public License for more details.
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with RandomX. If not, see<http://www.gnu.org/licenses/>.
|
along with RandomX. If not, see<http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
//#define TRACE
|
|
||||||
|
|
||||||
//#include "AssemblyGeneratorX86.hpp"
|
|
||||||
#include "stopwatch.hpp"
|
|
||||||
//#include "blake2/blake2.h"
|
|
||||||
#include "blake2/endian.h"
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <cstring>
|
|
||||||
//#include "Program.hpp"
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
//#include "hashAes1Rx4.hpp"
|
#include "stopwatch.hpp"
|
||||||
//#include "JitCompilerX86.hpp"
|
#include "utility.hpp"
|
||||||
#include "randomx.h"
|
#include "../randomx.h"
|
||||||
|
#include "../blake2/endian.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 };
|
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 };
|
||||||
|
|
||||||
@ -45,12 +39,6 @@ const uint8_t blockTemplate_[] = {
|
|||||||
0xc3, 0x8b, 0xde, 0xd3, 0x4d, 0x2d, 0xcd, 0xee, 0xf9, 0x5c, 0xd2, 0x0c, 0xef, 0xc1, 0x2f, 0x61, 0xd5, 0x61, 0x09
|
0xc3, 0x8b, 0xde, 0xd3, 0x4d, 0x2d, 0xcd, 0xee, 0xf9, 0x5c, 0xd2, 0x0c, 0xef, 0xc1, 0x2f, 0x61, 0xd5, 0x61, 0x09
|
||||||
};
|
};
|
||||||
|
|
||||||
void dump(const char* buffer, uint64_t count, const char* name) {
|
|
||||||
std::ofstream fout(name, std::ios::out | std::ios::binary);
|
|
||||||
fout.write(buffer, count);
|
|
||||||
fout.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr char hexmap[] = "0123456789abcdef";
|
constexpr char hexmap[] = "0123456789abcdef";
|
||||||
void outputHex(std::ostream& os, const char* data, int length) {
|
void outputHex(std::ostream& os, const char* data, int length) {
|
||||||
for (int i = 0; i < length; ++i) {
|
for (int i = 0; i < length; ++i) {
|
||||||
@ -59,34 +47,6 @@ void outputHex(std::ostream& os, const char* data, int length) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void readOption(const char* option, int argc, char** argv, bool& out) {
|
|
||||||
for (int i = 0; i < argc; ++i) {
|
|
||||||
if (strcmp(argv[i], option) == 0) {
|
|
||||||
out = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void readIntOption(const char* option, int argc, char** argv, int& out, int defaultValue) {
|
|
||||||
for (int i = 0; i < argc - 1; ++i) {
|
|
||||||
if (strcmp(argv[i], option) == 0 && (out = atoi(argv[i + 1])) > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out = defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
void readInt(int argc, char** argv, int& out, int defaultValue) {
|
|
||||||
for (int i = 0; i < argc; ++i) {
|
|
||||||
if (*argv[i] != '-' && (out = atoi(argv[i])) > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out = defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AtomicHash {
|
class AtomicHash {
|
||||||
public:
|
public:
|
||||||
AtomicHash() {
|
AtomicHash() {
|
||||||
@ -114,131 +74,52 @@ void printUsage(const char* executable) {
|
|||||||
std::cout << "Usage: " << executable << " [OPTIONS]" << std::endl;
|
std::cout << "Usage: " << executable << " [OPTIONS]" << std::endl;
|
||||||
std::cout << "Supported options:" << std::endl;
|
std::cout << "Supported options:" << std::endl;
|
||||||
std::cout << " --help shows this message" << std::endl;
|
std::cout << " --help shows this message" << std::endl;
|
||||||
std::cout << " --mine mining mode: 2 GiB, x86-64 JIT compiled VM" << std::endl;
|
std::cout << " --mine mining mode: 2 GiB" << std::endl;
|
||||||
std::cout << " --verify verification mode: 256 MiB" << std::endl;
|
std::cout << " --verify verification mode: 256 MiB" << std::endl;
|
||||||
std::cout << " --jit x86-64 JIT compiled verification mode (default: interpreter)" << std::endl;
|
std::cout << " --jit x86-64 JIT compiled mode (default: interpreter)" << std::endl;
|
||||||
std::cout << " --largePages use large pages" << std::endl;
|
std::cout << " --largePages use large pages" << std::endl;
|
||||||
std::cout << " --softAes use software AES (default: x86 AES-NI)" << std::endl;
|
std::cout << " --softAes use software AES (default: x86 AES-NI)" << std::endl;
|
||||||
std::cout << " --threads T use T threads (default: 1)" << std::endl;
|
std::cout << " --threads T use T threads (default: 1)" << std::endl;
|
||||||
std::cout << " --init Q initialize dataset with Q threads (default: 1)" << std::endl;
|
std::cout << " --init Q initialize dataset with Q threads (default: 1)" << std::endl;
|
||||||
std::cout << " --nonces N run N nonces (default: 1000)" << std::endl;
|
std::cout << " --nonces N run N nonces (default: 1000)" << std::endl;
|
||||||
std::cout << " --genAsm generate x86-64 asm code for nonce N" << std::endl;
|
|
||||||
std::cout << " --genNative generate RandomX code for nonce N" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<bool softAes>
|
|
||||||
void generateAsm(uint32_t nonce) {
|
|
||||||
/*alignas(16) uint64_t hash[8];
|
|
||||||
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
|
||||||
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
|
||||||
store32(blockTemplate + 39, nonce);
|
|
||||||
blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
|
|
||||||
uint8_t scratchpad[RANDOMX_SCRATCHPAD_L3];
|
|
||||||
fillAes1Rx4<softAes>((void*)hash, RANDOMX_SCRATCHPAD_L3, scratchpad);
|
|
||||||
randomx::AssemblyGeneratorX86 asmX86;
|
|
||||||
randomx::Program p;
|
|
||||||
fillAes1Rx4<softAes>(hash, sizeof(p), &p);
|
|
||||||
asmX86.generateProgram(p);
|
|
||||||
asmX86.printCode(std::cout);*/
|
|
||||||
}
|
|
||||||
|
|
||||||
template<bool softAes>
|
|
||||||
void generateNative(uint32_t nonce) {
|
|
||||||
/*alignas(16) uint64_t hash[8];
|
|
||||||
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
|
||||||
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
|
||||||
store32(blockTemplate + 39, nonce);
|
|
||||||
blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
|
|
||||||
uint8_t scratchpad[RANDOMX_SCRATCHPAD_L3];
|
|
||||||
fillAes1Rx4<softAes>((void*)hash, RANDOMX_SCRATCHPAD_L3, scratchpad);
|
|
||||||
alignas(16) randomx::Program prog;
|
|
||||||
fillAes1Rx4<softAes>((void*)hash, sizeof(prog), &prog);
|
|
||||||
for (int i = 0; i < RANDOMX_PROGRAM_SIZE; ++i) {
|
|
||||||
prog(i).dst %= 8;
|
|
||||||
prog(i).src %= 8;
|
|
||||||
}
|
|
||||||
std::cout << prog << std::endl;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mine(randomx_vm* vm, std::atomic<uint32_t>& atomicNonce, AtomicHash& result, uint32_t noncesCount, int thread) {
|
void mine(randomx_vm* vm, std::atomic<uint32_t>& atomicNonce, AtomicHash& result, uint32_t noncesCount, int thread) {
|
||||||
uint64_t hash[RANDOMX_HASH_SIZE / 4];
|
uint64_t hash[RANDOMX_HASH_SIZE / sizeof(uint64_t)];
|
||||||
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
||||||
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
||||||
void* noncePtr = blockTemplate + 39;
|
void* noncePtr = blockTemplate + 39;
|
||||||
auto nonce = atomicNonce.fetch_add(1);
|
auto nonce = atomicNonce.fetch_add(1);
|
||||||
|
|
||||||
while (nonce < noncesCount) {
|
while (nonce < noncesCount) {
|
||||||
//std::cout << "Thread " << thread << " nonce " << nonce << std::endl;
|
|
||||||
store32(noncePtr, nonce);
|
store32(noncePtr, nonce);
|
||||||
|
|
||||||
randomx_calculate_hash(vm, blockTemplate, sizeof(blockTemplate), &hash);
|
randomx_calculate_hash(vm, blockTemplate, sizeof(blockTemplate), &hash);
|
||||||
|
|
||||||
result.xorWith(hash);
|
result.xorWith(hash);
|
||||||
/*if (randomx::trace) {
|
|
||||||
std::cout << "Nonce: " << nonce << " ";
|
|
||||||
outputHex(std::cout, (char*)hash, 16);
|
|
||||||
std::cout << std::endl;
|
|
||||||
}*/
|
|
||||||
nonce = atomicNonce.fetch_add(1);
|
nonce = atomicNonce.fetch_add(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
bool softAes, genAsm, miningMode, verificationMode, help, largePages, async, genNative, jit, genSuperscalar, legacy;
|
bool softAes, miningMode, verificationMode, help, largePages, jit;
|
||||||
int programCount, threadCount, initThreadCount, epoch;
|
int noncesCount, threadCount, initThreadCount;
|
||||||
|
|
||||||
readOption("--softAes", argc, argv, softAes);
|
readOption("--softAes", argc, argv, softAes);
|
||||||
readOption("--genAsm", argc, argv, genAsm);
|
|
||||||
readOption("--mine", argc, argv, miningMode);
|
readOption("--mine", argc, argv, miningMode);
|
||||||
readOption("--verify", argc, argv, verificationMode);
|
readOption("--verify", argc, argv, verificationMode);
|
||||||
readIntOption("--threads", argc, argv, threadCount, 1);
|
readIntOption("--threads", argc, argv, threadCount, 1);
|
||||||
readIntOption("--nonces", argc, argv, programCount, 1000);
|
readIntOption("--nonces", argc, argv, noncesCount, 1000);
|
||||||
readIntOption("--init", argc, argv, initThreadCount, 1);
|
readIntOption("--init", argc, argv, initThreadCount, 1);
|
||||||
readIntOption("--epoch", argc, argv, epoch, 0);
|
|
||||||
readOption("--largePages", argc, argv, largePages);
|
readOption("--largePages", argc, argv, largePages);
|
||||||
readOption("--jit", argc, argv, jit);
|
readOption("--jit", argc, argv, jit);
|
||||||
readOption("--genNative", argc, argv, genNative);
|
|
||||||
readOption("--help", argc, argv, help);
|
readOption("--help", argc, argv, help);
|
||||||
readOption("--genSuperscalar", argc, argv, genSuperscalar);
|
|
||||||
readOption("--legacy", argc, argv, legacy);
|
|
||||||
|
|
||||||
/*if (genSuperscalar) {
|
std::cout << "RandomX benchmark" << std::endl;
|
||||||
randomx::SuperscalarProgram p;
|
|
||||||
randomx::Blake2Generator gen(seed, programCount);
|
|
||||||
randomx::generateSuperscalar(p, gen);
|
|
||||||
randomx::AssemblyGeneratorX86 asmX86;
|
|
||||||
asmX86.generateAsm(p);
|
|
||||||
//std::ofstream file("lightProg2.asm");
|
|
||||||
asmX86.printCode(std::cout);
|
|
||||||
return 0;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (genAsm) {
|
|
||||||
if (softAes)
|
|
||||||
generateAsm<true>(programCount);
|
|
||||||
else
|
|
||||||
generateAsm<false>(programCount);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (genNative) {
|
|
||||||
if (softAes)
|
|
||||||
generateNative<true>(programCount);
|
|
||||||
else
|
|
||||||
generateNative<false>(programCount);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (help || (!miningMode && !verificationMode)) {
|
if (help || (!miningMode && !verificationMode)) {
|
||||||
printUsage(argv[0]);
|
printUsage(argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (softAes)
|
|
||||||
std::cout << "Using software AES." << std::endl;
|
|
||||||
|
|
||||||
std::atomic<uint32_t> atomicNonce(0);
|
std::atomic<uint32_t> atomicNonce(0);
|
||||||
AtomicHash result;
|
AtomicHash result;
|
||||||
std::vector<randomx_vm*> vms;
|
std::vector<randomx_vm*> vms;
|
||||||
@ -249,33 +130,34 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
if (miningMode) {
|
if (miningMode) {
|
||||||
flags = (randomx_flags)(flags | RANDOMX_FLAG_FULL_MEM);
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_FULL_MEM);
|
||||||
std::cout << "RandomX - full memory mode (2 GiB)" << std::endl;
|
std::cout << " - full memory mode (2 GiB)" << std::endl;
|
||||||
} else {
|
}
|
||||||
std::cout << "RandomX - light memory mode (256 MiB)" << std::endl;
|
else {
|
||||||
|
std::cout << " - light memory mode (256 MiB)" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jit) {
|
if (jit) {
|
||||||
flags = (randomx_flags)(flags | RANDOMX_FLAG_JIT);
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_JIT);
|
||||||
std::cout << "RandomX - JIT compiled mode" << std::endl;
|
std::cout << " - JIT compiled mode" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << "RandomX - interpreted mode" << std::endl;
|
std::cout << " - interpreted mode" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (softAes) {
|
if (softAes) {
|
||||||
std::cout << "RandomX - software AES mode" << std::endl;
|
std::cout << " - software AES mode" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
flags = (randomx_flags)(flags | RANDOMX_FLAG_HARD_AES);
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_HARD_AES);
|
||||||
std::cout << "RandomX - hardware AES mode" << std::endl;
|
std::cout << " - hardware AES mode" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (largePages) {
|
if (largePages) {
|
||||||
flags = (randomx_flags)(flags | RANDOMX_FLAG_LARGE_PAGES);
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_LARGE_PAGES);
|
||||||
std::cout << "RandomX - large pages mode" << std::endl;
|
std::cout << " - large pages mode" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << "RandomX - small pages mode" << std::endl;
|
std::cout << " - small pages mode" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Initializing";
|
std::cout << "Initializing";
|
||||||
@ -286,14 +168,17 @@ int main(int argc, char** argv) {
|
|||||||
try {
|
try {
|
||||||
Stopwatch sw(true);
|
Stopwatch sw(true);
|
||||||
cache = randomx_alloc_cache(flags);
|
cache = randomx_alloc_cache(flags);
|
||||||
|
if (cache == nullptr) {
|
||||||
|
std::cout << "ERROR: Cache allocation failed" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
randomx_init_cache(cache, seed, sizeof(seed));
|
randomx_init_cache(cache, seed, sizeof(seed));
|
||||||
/*if (randomx::trace) {
|
|
||||||
std::cout << "Cache: " << std::endl;
|
|
||||||
outputHex(std::cout, (char*)dataset.cache.memory, sizeof(__m128i));
|
|
||||||
std::cout << std::endl;
|
|
||||||
}*/
|
|
||||||
if (miningMode) {
|
if (miningMode) {
|
||||||
dataset = randomx_alloc_dataset(flags);
|
dataset = randomx_alloc_dataset(flags);
|
||||||
|
if (dataset == nullptr) {
|
||||||
|
std::cout << "ERROR: Dataset allocation failed" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if (initThreadCount > 1) {
|
if (initThreadCount > 1) {
|
||||||
auto perThread = RANDOMX_DATASET_BLOCKS / initThreadCount;
|
auto perThread = RANDOMX_DATASET_BLOCKS / initThreadCount;
|
||||||
auto remainder = RANDOMX_DATASET_BLOCKS % initThreadCount;
|
auto remainder = RANDOMX_DATASET_BLOCKS % initThreadCount;
|
||||||
@ -310,7 +195,6 @@ int main(int argc, char** argv) {
|
|||||||
else {
|
else {
|
||||||
randomx_init_dataset(dataset, cache, 0, RANDOMX_DATASET_BLOCKS);
|
randomx_init_dataset(dataset, cache, 0, RANDOMX_DATASET_BLOCKS);
|
||||||
}
|
}
|
||||||
//dump((const char*)dataset.dataset.memory, RANDOMX_DATASET_SIZE, "dataset.dat");
|
|
||||||
randomx_release_cache(cache);
|
randomx_release_cache(cache);
|
||||||
threads.clear();
|
threads.clear();
|
||||||
}
|
}
|
||||||
@ -324,32 +208,32 @@ int main(int argc, char** argv) {
|
|||||||
randomx_vm_set_cache(vm, cache);
|
randomx_vm_set_cache(vm, cache);
|
||||||
vms.push_back(vm);
|
vms.push_back(vm);
|
||||||
}
|
}
|
||||||
std::cout << "Running benchmark (" << programCount << " nonces) ..." << std::endl;
|
std::cout << "Running benchmark (" << noncesCount << " nonces) ..." << std::endl;
|
||||||
sw.restart();
|
sw.restart();
|
||||||
if (threadCount > 1) {
|
if (threadCount > 1) {
|
||||||
for (unsigned i = 0; i < vms.size(); ++i) {
|
for (unsigned i = 0; i < vms.size(); ++i) {
|
||||||
if (softAes)
|
if (softAes)
|
||||||
threads.push_back(std::thread(&mine, vms[i], std::ref(atomicNonce), std::ref(result), programCount, i));
|
threads.push_back(std::thread(&mine, vms[i], std::ref(atomicNonce), std::ref(result), noncesCount, i));
|
||||||
else
|
else
|
||||||
threads.push_back(std::thread(&mine, vms[i], std::ref(atomicNonce), std::ref(result), programCount, i));
|
threads.push_back(std::thread(&mine, vms[i], std::ref(atomicNonce), std::ref(result), noncesCount, i));
|
||||||
}
|
}
|
||||||
for (unsigned i = 0; i < threads.size(); ++i) {
|
for (unsigned i = 0; i < threads.size(); ++i) {
|
||||||
threads[i].join();
|
threads[i].join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mine(vms[0], std::ref(atomicNonce), std::ref(result), programCount, 0);
|
mine(vms[0], std::ref(atomicNonce), std::ref(result), noncesCount, 0);
|
||||||
}
|
}
|
||||||
double elapsed = sw.getElapsed();
|
double elapsed = sw.getElapsed();
|
||||||
std::cout << "Calculated result: ";
|
std::cout << "Calculated result: ";
|
||||||
result.print(std::cout);
|
result.print(std::cout);
|
||||||
if(!legacy && programCount == 1000)
|
if (noncesCount == 1000)
|
||||||
std::cout << "Reference result: 630ad3bc7f44fe8386462d7b671fa2a1167d3e062bfb9a2967f64832760cfedb" << std::endl;
|
std::cout << "Reference result: dc34604eed2fbba0e8fae26b2270b90d8aad9466ba39950fd8904248442e850a" << std::endl;
|
||||||
if (!miningMode) {
|
if (!miningMode) {
|
||||||
std::cout << "Performance: " << 1000 * elapsed / programCount << " ms per hash" << std::endl;
|
std::cout << "Performance: " << 1000 * elapsed / noncesCount << " ms per hash" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << "Performance: " << programCount / elapsed << " hashes per second" << std::endl;
|
std::cout << "Performance: " << noncesCount / elapsed << " hashes per second" << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception& e) {
|
catch (std::exception& e) {
|
119
src/tests/code-generator.cpp
Normal file
119
src/tests/code-generator.cpp
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
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<http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "utility.hpp"
|
||||||
|
#include "../common.hpp"
|
||||||
|
#include "../assembly_generator_x86.hpp"
|
||||||
|
#include "../superscalar.hpp"
|
||||||
|
#include "../aes_hash.hpp"
|
||||||
|
#include "../blake2/blake2.h"
|
||||||
|
#include "../program.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 };
|
||||||
|
|
||||||
|
const uint8_t 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
|
||||||
|
};
|
||||||
|
|
||||||
|
template<bool softAes>
|
||||||
|
void generateAsm(uint32_t nonce) {
|
||||||
|
alignas(16) uint64_t hash[8];
|
||||||
|
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
||||||
|
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
||||||
|
store32(blockTemplate + 39, nonce);
|
||||||
|
blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
|
||||||
|
uint8_t scratchpad[randomx::ScratchpadSize];
|
||||||
|
fillAes1Rx4<softAes>((void*)hash, randomx::ScratchpadSize, scratchpad);
|
||||||
|
randomx::AssemblyGeneratorX86 asmX86;
|
||||||
|
randomx::Program p;
|
||||||
|
fillAes1Rx4<softAes>(hash, sizeof(p), &p);
|
||||||
|
asmX86.generateProgram(p);
|
||||||
|
asmX86.printCode(std::cout);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<bool softAes>
|
||||||
|
void generateNative(uint32_t nonce) {
|
||||||
|
alignas(16) uint64_t hash[8];
|
||||||
|
uint8_t blockTemplate[sizeof(blockTemplate_)];
|
||||||
|
memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate));
|
||||||
|
store32(blockTemplate + 39, nonce);
|
||||||
|
blake2b(hash, sizeof(hash), blockTemplate, sizeof(blockTemplate), nullptr, 0);
|
||||||
|
uint8_t scratchpad[randomx::ScratchpadSize];
|
||||||
|
fillAes1Rx4<softAes>((void*)hash, randomx::ScratchpadSize, scratchpad);
|
||||||
|
alignas(16) randomx::Program prog;
|
||||||
|
fillAes1Rx4<softAes>((void*)hash, sizeof(prog), &prog);
|
||||||
|
for (int i = 0; i < RANDOMX_PROGRAM_SIZE; ++i) {
|
||||||
|
prog(i).dst %= 8;
|
||||||
|
prog(i).src %= 8;
|
||||||
|
}
|
||||||
|
std::cout << prog << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printUsage(const char* executable) {
|
||||||
|
std::cout << "Usage: " << executable << " [OPTIONS]" << std::endl;
|
||||||
|
std::cout << "Supported options:" << std::endl;
|
||||||
|
std::cout << " --softAes use software AES (default: x86 AES-NI)" << std::endl;
|
||||||
|
std::cout << " --nonce N seed nonce (default: 1000)" << std::endl;
|
||||||
|
std::cout << " --genAsm generate x86-64 asm code for nonce N" << std::endl;
|
||||||
|
std::cout << " --genNative generate RandomX code for nonce N" << std::endl;
|
||||||
|
std::cout << " --genSuperscalar generate superscalar program for nonce N" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
bool softAes, genAsm, genNative, genSuperscalar;
|
||||||
|
int nonce;
|
||||||
|
|
||||||
|
readOption("--softAes", argc, argv, softAes);
|
||||||
|
readOption("--genAsm", argc, argv, genAsm);
|
||||||
|
readIntOption("--nonce", argc, argv, nonce, 1000);
|
||||||
|
readOption("--genNative", argc, argv, genNative);
|
||||||
|
readOption("--genSuperscalar", argc, argv, genSuperscalar);
|
||||||
|
|
||||||
|
if (genSuperscalar) {
|
||||||
|
randomx::SuperscalarProgram p;
|
||||||
|
randomx::Blake2Generator gen(seed, nonce);
|
||||||
|
randomx::generateSuperscalar(p, gen);
|
||||||
|
randomx::AssemblyGeneratorX86 asmX86;
|
||||||
|
asmX86.generateAsm(p);
|
||||||
|
asmX86.printCode(std::cout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (genAsm) {
|
||||||
|
if (softAes)
|
||||||
|
generateAsm<true>(nonce);
|
||||||
|
else
|
||||||
|
generateAsm<false>(nonce);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (genNative) {
|
||||||
|
if (softAes)
|
||||||
|
generateNative<true>(nonce);
|
||||||
|
else
|
||||||
|
generateNative<false>(nonce);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printUsage(argv[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
58
src/tests/utility.hpp
Normal file
58
src/tests/utility.hpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
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<http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
inline void dump(const char* buffer, uint64_t count, const char* name) {
|
||||||
|
std::ofstream fout(name, std::ios::out | std::ios::binary);
|
||||||
|
fout.write(buffer, count);
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void readOption(const char* option, int argc, char** argv, bool& out) {
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
if (strcmp(argv[i], option) == 0) {
|
||||||
|
out = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void readIntOption(const char* option, int argc, char** argv, int& out, int defaultValue) {
|
||||||
|
for (int i = 0; i < argc - 1; ++i) {
|
||||||
|
if (strcmp(argv[i], option) == 0 && (out = atoi(argv[i + 1])) > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void readInt(int argc, char** argv, int& out, int defaultValue) {
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
if (*argv[i] != '-' && (out = atoi(argv[i])) > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out = defaultValue;
|
||||||
|
}
|
@ -61,6 +61,6 @@ namespace randomx {
|
|||||||
|
|
||||||
using CompiledVmDefault = CompiledVm<AlignedAllocator<CacheLineSize>, true>;
|
using CompiledVmDefault = CompiledVm<AlignedAllocator<CacheLineSize>, true>;
|
||||||
using CompiledVmHardAes = CompiledVm<AlignedAllocator<CacheLineSize>, false>;
|
using CompiledVmHardAes = CompiledVm<AlignedAllocator<CacheLineSize>, false>;
|
||||||
using CompiledVmLargePage = CompiledVm<LargePageAllocator, false>;
|
using CompiledVmLargePage = CompiledVm<LargePageAllocator, true>;
|
||||||
using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, true>;
|
using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, false>;
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,6 @@ namespace randomx {
|
|||||||
|
|
||||||
using CompiledLightVmDefault = CompiledLightVm<AlignedAllocator<CacheLineSize>, true>;
|
using CompiledLightVmDefault = CompiledLightVm<AlignedAllocator<CacheLineSize>, true>;
|
||||||
using CompiledLightVmHardAes = CompiledLightVm<AlignedAllocator<CacheLineSize>, false>;
|
using CompiledLightVmHardAes = CompiledLightVm<AlignedAllocator<CacheLineSize>, false>;
|
||||||
using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, false>;
|
using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, true>;
|
||||||
using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, true>;
|
using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, false>;
|
||||||
}
|
}
|
@ -85,6 +85,6 @@ namespace randomx {
|
|||||||
|
|
||||||
using InterpretedVmDefault = InterpretedVm<AlignedAllocator<CacheLineSize>, true>;
|
using InterpretedVmDefault = InterpretedVm<AlignedAllocator<CacheLineSize>, true>;
|
||||||
using InterpretedVmHardAes = InterpretedVm<AlignedAllocator<CacheLineSize>, false>;
|
using InterpretedVmHardAes = InterpretedVm<AlignedAllocator<CacheLineSize>, false>;
|
||||||
using InterpretedVmLargePage = InterpretedVm<LargePageAllocator, false>;
|
using InterpretedVmLargePage = InterpretedVm<LargePageAllocator, true>;
|
||||||
using InterpretedVmLargePageHardAes = InterpretedVm<LargePageAllocator, true>;
|
using InterpretedVmLargePageHardAes = InterpretedVm<LargePageAllocator, false>;
|
||||||
}
|
}
|
@ -47,6 +47,6 @@ namespace randomx {
|
|||||||
|
|
||||||
using InterpretedLightVmDefault = InterpretedLightVm<AlignedAllocator<CacheLineSize>, true>;
|
using InterpretedLightVmDefault = InterpretedLightVm<AlignedAllocator<CacheLineSize>, true>;
|
||||||
using InterpretedLightVmHardAes = InterpretedLightVm<AlignedAllocator<CacheLineSize>, false>;
|
using InterpretedLightVmHardAes = InterpretedLightVm<AlignedAllocator<CacheLineSize>, false>;
|
||||||
using InterpretedLightVmLargePage = InterpretedLightVm<LargePageAllocator, false>;
|
using InterpretedLightVmLargePage = InterpretedLightVm<LargePageAllocator, true>;
|
||||||
using InterpretedLightVmLargePageHardAes = InterpretedLightVm<LargePageAllocator, true>;
|
using InterpretedLightVmLargePageHardAes = InterpretedLightVm<LargePageAllocator, false>;
|
||||||
}
|
}
|
||||||
|
131
vcxproj/api-example1.vcxproj
Normal file
131
vcxproj/api-example1.vcxproj
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>15.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{83EA3E54-5D91-4E01-8EF6-C1E718334F83}</ProjectGuid>
|
||||||
|
<RootNamespace>apiexample1</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="randomx.vcxproj">
|
||||||
|
<Project>{3346a4ad-c438-4324-8b77-47a16452954b}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\api-example1.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\src\randomx.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
27
vcxproj/api-example1.vcxproj.filters
Normal file
27
vcxproj/api-example1.vcxproj.filters
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\api-example1.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\src\randomx.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
128
vcxproj/api-example2.vcxproj
Normal file
128
vcxproj/api-example2.vcxproj
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>15.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{44947B9C-E6B1-4C06-BD01-F8EF43B59223}</ProjectGuid>
|
||||||
|
<RootNamespace>apiexample2</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="randomx.vcxproj">
|
||||||
|
<Project>{3346a4ad-c438-4324-8b77-47a16452954b}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\api-example2.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
22
vcxproj/api-example2.vcxproj.filters
Normal file
22
vcxproj/api-example2.vcxproj.filters
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\api-example2.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
131
vcxproj/benchmark.vcxproj
Normal file
131
vcxproj/benchmark.vcxproj
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>15.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{1E8A2E2F-9F9F-43AA-BB19-9107FEC64A70}</ProjectGuid>
|
||||||
|
<RootNamespace>benchmark</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\benchmark.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="randomx.vcxproj">
|
||||||
|
<Project>{3346a4ad-c438-4324-8b77-47a16452954b}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\src\tests\utility.hpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
27
vcxproj/benchmark.vcxproj.filters
Normal file
27
vcxproj/benchmark.vcxproj.filters
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\benchmark.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\src\tests\utility.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
129
vcxproj/code-generator.vcxproj
Normal file
129
vcxproj/code-generator.vcxproj
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>15.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{3E490DEC-1874-43AA-92DA-1AC57C217EAC}</ProjectGuid>
|
||||||
|
<RootNamespace>codegenerator</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<StackReserveSize>4194304</StackReserveSize>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\code-generator.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="randomx.vcxproj">
|
||||||
|
<Project>{3346a4ad-c438-4324-8b77-47a16452954b}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
22
vcxproj/code-generator.vcxproj.filters
Normal file
22
vcxproj/code-generator.vcxproj.filters
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\src\tests\code-generator.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@ -45,7 +45,7 @@
|
|||||||
<CharacterSet>MultiByte</CharacterSet>
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v141</PlatformToolset>
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
@ -141,14 +141,13 @@
|
|||||||
<ClCompile Include="..\src\jit_compiler_x86.cpp" />
|
<ClCompile Include="..\src\jit_compiler_x86.cpp" />
|
||||||
<ClCompile Include="..\src\randomx.cpp" />
|
<ClCompile Include="..\src\randomx.cpp" />
|
||||||
<ClCompile Include="..\src\superscalar.cpp" />
|
<ClCompile Include="..\src\superscalar.cpp" />
|
||||||
<ClCompile Include="..\src\main.cpp" />
|
|
||||||
<ClCompile Include="..\src\reciprocal.c" />
|
<ClCompile Include="..\src\reciprocal.c" />
|
||||||
<ClCompile Include="..\src\soft_aes.cpp" />
|
<ClCompile Include="..\src\soft_aes.cpp" />
|
||||||
<ClCompile Include="..\src\virtual_machine.cpp" />
|
<ClCompile Include="..\src\virtual_machine.cpp" />
|
||||||
<ClCompile Include="..\src\virtual_memory.cpp" />
|
<ClCompile Include="..\src\virtual_memory.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<MASM Include="..\src\jit_compiler_x86_staticc.asm" />
|
<MASM Include="..\src\jit_compiler_x86_static.asm" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\allocator.hpp" />
|
<ClInclude Include="..\src\allocator.hpp" />
|
||||||
@ -156,7 +155,6 @@
|
|||||||
<ClInclude Include="..\src\argon2_core.h" />
|
<ClInclude Include="..\src\argon2_core.h" />
|
||||||
<ClInclude Include="..\src\assembly_generator_x86.hpp" />
|
<ClInclude Include="..\src\assembly_generator_x86.hpp" />
|
||||||
<ClInclude Include="..\src\blake2_generator.hpp" />
|
<ClInclude Include="..\src\blake2_generator.hpp" />
|
||||||
<ClInclude Include="..\src\catch.hpp" />
|
|
||||||
<ClInclude Include="..\src\common.hpp" />
|
<ClInclude Include="..\src\common.hpp" />
|
||||||
<ClInclude Include="..\src\vm_compiled_light.hpp" />
|
<ClInclude Include="..\src\vm_compiled_light.hpp" />
|
||||||
<ClInclude Include="..\src\vm_compiled.hpp" />
|
<ClInclude Include="..\src\vm_compiled.hpp" />
|
||||||
@ -175,7 +173,6 @@
|
|||||||
<ClInclude Include="..\src\program.hpp" />
|
<ClInclude Include="..\src\program.hpp" />
|
||||||
<ClInclude Include="..\src\reciprocal.h" />
|
<ClInclude Include="..\src\reciprocal.h" />
|
||||||
<ClInclude Include="..\src\soft_aes.h" />
|
<ClInclude Include="..\src\soft_aes.h" />
|
||||||
<ClInclude Include="..\src\stopwatch.hpp" />
|
|
||||||
<ClInclude Include="..\src\superscalar_program.hpp" />
|
<ClInclude Include="..\src\superscalar_program.hpp" />
|
||||||
<ClInclude Include="..\src\virtual_machine.hpp" />
|
<ClInclude Include="..\src\virtual_machine.hpp" />
|
||||||
<ClInclude Include="..\src\virtual_memory.hpp" />
|
<ClInclude Include="..\src\virtual_memory.hpp" />
|
||||||
|
@ -27,9 +27,6 @@
|
|||||||
<ClCompile Include="..\src\dataset.cpp">
|
<ClCompile Include="..\src\dataset.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\main.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\blake2\blake2b.c">
|
<ClCompile Include="..\src\blake2\blake2b.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -82,11 +79,6 @@
|
|||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<MASM Include="..\src\jit_compiler_x86_staticc.asm">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</MASM>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\argon2.h">
|
<ClInclude Include="..\src\argon2.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
@ -94,9 +86,6 @@
|
|||||||
<ClInclude Include="..\src\argon2_core.h">
|
<ClInclude Include="..\src\argon2_core.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\catch.hpp">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\common.hpp">
|
<ClInclude Include="..\src\common.hpp">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -160,9 +149,6 @@
|
|||||||
<ClInclude Include="..\src\soft_aes.h">
|
<ClInclude Include="..\src\soft_aes.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\stopwatch.hpp">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\virtual_machine.hpp">
|
<ClInclude Include="..\src\virtual_machine.hpp">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -173,4 +159,9 @@
|
|||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<MASM Include="..\src\jit_compiler_x86_static.asm">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</MASM>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue
Block a user