mirror of
				https://git.wownero.com/wownero/RandomWOW.git
				synced 2024-08-15 00:23:14 +00:00 
			
		
		
		
	randomx project changed to a static library
separate benchmark project API usage examples
This commit is contained in:
		
							parent
							
								
									d7eefce583
								
							
						
					
					
						commit
						41557ce010
					
				
					 29 changed files with 979 additions and 15048 deletions
				
			
		
							
								
								
									
										44
									
								
								randomx.sln
									
										
									
									
									
								
							
							
						
						
									
										44
									
								
								randomx.sln
									
										
									
									
									
								
							|  | @ -13,6 +13,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-init", "vcxproj | |||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "superscalar-stats", "vcxproj\superscalar-stats.vcxproj", "{0173D560-8C12-46B3-B467-0C6E7573AA0B}" | ||||
| 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 | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		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|x86.ActiveCfg = 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 | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
|  | @ -61,6 +101,10 @@ Global | |||
| 		{CF34A7EF-7DC9-4077-94A5-76F5425EA938} = {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} | ||||
| 		{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 | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		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); | ||||
| 
 | ||||
| 	reciprocalCache.clear(); | ||||
| 	randomx::Blake2Generator gen(seed, seedSize, 1000); //TODO
 | ||||
| 	randomx::Blake2Generator gen(seed, seedSize); | ||||
| 	for (int i = 0; i < RANDOMX_CACHE_ACCESSES; ++i) { | ||||
| 		randomx::generateSuperscalar(programs[i], gen); | ||||
| 		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 { | ||||
| 
 | ||||
| 	template<class Allocator> | ||||
| 	bool Dataset<Allocator>::allocate() { | ||||
| 	void Dataset<Allocator>::allocate() { | ||||
| 		memory = (uint8_t*)Allocator::allocMemory(RANDOMX_DATASET_SIZE); | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	template<class Allocator> | ||||
|  | @ -134,9 +133,8 @@ namespace randomx { | |||
| 	} | ||||
| 
 | ||||
| 	template<class Allocator> | ||||
| 	bool Cache<Allocator>::allocate() { | ||||
| 	void Cache<Allocator>::allocate() { | ||||
| 		memory = (uint8_t*)Allocator::allocMemory(RANDOMX_ARGON_MEMORY * ARGON2_BLOCK_SIZE); | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	template<class Allocator> | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ along with RandomX.  If not, see<http://www.gnu.org/licenses/>. | |||
| /* Global scope for C binding */ | ||||
| struct randomx_dataset { | ||||
| 	virtual ~randomx_dataset() = 0; | ||||
| 	virtual bool allocate() = 0; | ||||
| 	virtual void allocate() = 0; | ||||
| 	uint8_t* memory = nullptr; | ||||
| }; | ||||
| 
 | ||||
|  | @ -46,7 +46,7 @@ namespace randomx { | |||
| 	template<class Allocator> | ||||
| 	struct Dataset : public randomx_dataset { | ||||
| 		~Dataset() override; | ||||
| 		bool allocate() override; | ||||
| 		void allocate() override; | ||||
| 	}; | ||||
| 
 | ||||
| 	using DatasetDefault = Dataset<AlignedAllocator<CacheLineSize>>; | ||||
|  | @ -55,7 +55,7 @@ namespace randomx { | |||
| 	template<class Allocator> | ||||
| 	struct Cache : public randomx_cache { | ||||
| 		~Cache() override; | ||||
| 		bool allocate() override; | ||||
| 		void allocate() 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; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!cache->allocate()) { | ||||
| 		try { | ||||
| 			cache->allocate(); | ||||
| 		} | ||||
| 		catch (std::exception &ex) { | ||||
| 			delete cache; | ||||
| 			cache = nullptr; | ||||
| 		} | ||||
|  | @ -75,7 +78,11 @@ extern "C" { | |||
| 		else { | ||||
| 			dataset = new randomx::DatasetDefault(); | ||||
| 		} | ||||
| 		if (!dataset->allocate()) { | ||||
| 
 | ||||
| 		try { | ||||
| 			dataset->allocate(); | ||||
| 		} | ||||
| 		catch (std::exception &ex) { | ||||
| 			delete dataset; | ||||
| 			dataset = nullptr; | ||||
| 		} | ||||
|  | @ -183,7 +190,7 @@ extern "C" { | |||
| 		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]; | ||||
| 		blake2b(hash, sizeof(hash), input, inputSize, nullptr, 0); | ||||
| 		machine->initScratchpad(&hash); | ||||
|  | @ -194,7 +201,7 @@ extern "C" { | |||
| 			blake2b(hash, sizeof(hash), machine->getRegisterFile(), sizeof(randomx::RegisterFile), nullptr, 0); | ||||
| 		} | ||||
| 		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 | ||||
| #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> | ||||
| 
 | ||||
| #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_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) | ||||
| } | ||||
|  |  | |||
							
								
								
									
										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. | ||||
| 
 | ||||
|  | @ -16,25 +16,19 @@ 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/>.
 | ||||
| */ | ||||
| //#define TRACE
 | ||||
| 
 | ||||
| //#include "AssemblyGeneratorX86.hpp"
 | ||||
| #include "stopwatch.hpp" | ||||
| //#include "blake2/blake2.h"
 | ||||
| #include "blake2/endian.h" | ||||
| #include <fstream> | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <exception> | ||||
| #include <cstring> | ||||
| //#include "Program.hpp"
 | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <thread> | ||||
| #include <atomic> | ||||
| //#include "hashAes1Rx4.hpp"
 | ||||
| //#include "JitCompilerX86.hpp"
 | ||||
| #include "randomx.h" | ||||
| #include "stopwatch.hpp" | ||||
| #include "utility.hpp" | ||||
| #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 }; | ||||
| 
 | ||||
|  | @ -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 | ||||
| }; | ||||
| 
 | ||||
| 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"; | ||||
| void outputHex(std::ostream& os, const char* data, int length) { | ||||
| 	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 { | ||||
| public: | ||||
| 	AtomicHash() { | ||||
|  | @ -114,131 +74,52 @@ void printUsage(const char* executable) { | |||
| 	std::cout << "Usage: " << executable << " [OPTIONS]" << std::endl; | ||||
| 	std::cout << "Supported options:" << 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 << "  --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 << "  --softAes     use software AES (default: x86 AES-NI)" << 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 << "  --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) { | ||||
| 	uint64_t hash[RANDOMX_HASH_SIZE / 4]; | ||||
| 	uint64_t hash[RANDOMX_HASH_SIZE / sizeof(uint64_t)]; | ||||
| 	uint8_t blockTemplate[sizeof(blockTemplate_)]; | ||||
| 	memcpy(blockTemplate, blockTemplate_, sizeof(blockTemplate)); | ||||
| 	void* noncePtr = blockTemplate + 39; | ||||
| 	auto nonce = atomicNonce.fetch_add(1); | ||||
| 
 | ||||
| 	while (nonce < noncesCount) { | ||||
| 		//std::cout << "Thread " << thread << " nonce " << nonce << std::endl;
 | ||||
| 		store32(noncePtr, nonce); | ||||
| 		 | ||||
| 		randomx_calculate_hash(vm, blockTemplate, sizeof(blockTemplate), &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); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int main(int argc, char** argv) { | ||||
| 	bool softAes, genAsm, miningMode, verificationMode, help, largePages, async, genNative, jit, genSuperscalar, legacy; | ||||
| 	int programCount, threadCount, initThreadCount, epoch; | ||||
| 	bool softAes, miningMode, verificationMode, help, largePages, jit; | ||||
| 	int noncesCount, threadCount, initThreadCount; | ||||
| 
 | ||||
| 	readOption("--softAes", argc, argv, softAes); | ||||
| 	readOption("--genAsm", argc, argv, genAsm); | ||||
| 	readOption("--mine", argc, argv, miningMode); | ||||
| 	readOption("--verify", argc, argv, verificationMode); | ||||
| 	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("--epoch", argc, argv, epoch, 0); | ||||
| 	readOption("--largePages", argc, argv, largePages); | ||||
| 	readOption("--jit", argc, argv, jit); | ||||
| 	readOption("--genNative", argc, argv, genNative); | ||||
| 	readOption("--help", argc, argv, help); | ||||
| 	readOption("--genSuperscalar", argc, argv, genSuperscalar); | ||||
| 	readOption("--legacy", argc, argv, legacy); | ||||
| 
 | ||||
| 	/*if (genSuperscalar) {
 | ||||
| 		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; | ||||
| 	} | ||||
| 	std::cout << "RandomX benchmark" << std::endl; | ||||
| 
 | ||||
| 	if (help || (!miningMode && !verificationMode)) { | ||||
| 		printUsage(argv[0]); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (softAes) | ||||
| 		std::cout << "Using software AES." << std::endl; | ||||
| 
 | ||||
| 	std::atomic<uint32_t> atomicNonce(0); | ||||
| 	AtomicHash result; | ||||
| 	std::vector<randomx_vm*> vms; | ||||
|  | @ -249,51 +130,55 @@ int main(int argc, char** argv) { | |||
| 
 | ||||
| 	if (miningMode) { | ||||
| 		flags = (randomx_flags)(flags | RANDOMX_FLAG_FULL_MEM); | ||||
| 		std::cout << "RandomX - full memory mode (2 GiB)" << std::endl; | ||||
| 	} else { | ||||
| 		std::cout << "RandomX - light memory mode (256 MiB)" << std::endl; | ||||
| 		std::cout << " - full memory mode (2 GiB)" << std::endl; | ||||
| 	} | ||||
| 	else { | ||||
| 		std::cout << " - light memory mode (256 MiB)" << std::endl; | ||||
| 	} | ||||
| 
 | ||||
| 	if (jit) { | ||||
| 		flags = (randomx_flags)(flags | RANDOMX_FLAG_JIT); | ||||
| 		std::cout << "RandomX - JIT compiled mode" << std::endl; | ||||
| 		std::cout << " - JIT compiled mode" << std::endl; | ||||
| 	} | ||||
| 	else { | ||||
| 		std::cout << "RandomX - interpreted mode" << std::endl; | ||||
| 		std::cout << " - interpreted mode" << std::endl; | ||||
| 	} | ||||
| 
 | ||||
| 	if (softAes) { | ||||
| 		std::cout << "RandomX - software AES mode" << std::endl; | ||||
| 		std::cout << " - software AES mode" << std::endl; | ||||
| 	} | ||||
| 	else { | ||||
| 		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) { | ||||
| 		flags = (randomx_flags)(flags | RANDOMX_FLAG_LARGE_PAGES); | ||||
| 		std::cout << "RandomX - large pages mode" << std::endl; | ||||
| 		std::cout << " - large pages mode" << std::endl; | ||||
| 	} | ||||
| 	else { | ||||
| 		std::cout << "RandomX - small pages mode" << std::endl; | ||||
| 		std::cout << " - small pages mode" << std::endl; | ||||
| 	} | ||||
| 
 | ||||
| 	std::cout << "Initializing"; | ||||
| 	if(miningMode) | ||||
| 	if (miningMode) | ||||
| 		std::cout << " (" << initThreadCount << " thread" << (initThreadCount > 1 ? "s)" : ")"); | ||||
| 	std::cout << " ..." << std::endl; | ||||
| 
 | ||||
| 	try { | ||||
| 		Stopwatch sw(true); | ||||
| 		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)); | ||||
| 		/*if (randomx::trace) {
 | ||||
| 			std::cout << "Cache: " << std::endl; | ||||
| 			outputHex(std::cout, (char*)dataset.cache.memory, sizeof(__m128i)); | ||||
| 			std::cout << std::endl; | ||||
| 		}*/ | ||||
| 		if (miningMode) { | ||||
| 			dataset = randomx_alloc_dataset(flags); | ||||
| 			if (dataset == nullptr) { | ||||
| 				std::cout << "ERROR: Dataset allocation failed" << std::endl; | ||||
| 				return 1; | ||||
| 			} | ||||
| 			if (initThreadCount > 1) { | ||||
| 				auto perThread = RANDOMX_DATASET_BLOCKS / initThreadCount; | ||||
| 				auto remainder = RANDOMX_DATASET_BLOCKS % initThreadCount; | ||||
|  | @ -310,7 +195,6 @@ int main(int argc, char** argv) { | |||
| 			else { | ||||
| 				randomx_init_dataset(dataset, cache, 0, RANDOMX_DATASET_BLOCKS); | ||||
| 			} | ||||
| 			//dump((const char*)dataset.dataset.memory, RANDOMX_DATASET_SIZE, "dataset.dat");
 | ||||
| 			randomx_release_cache(cache); | ||||
| 			threads.clear(); | ||||
| 		} | ||||
|  | @ -324,32 +208,32 @@ int main(int argc, char** argv) { | |||
| 				randomx_vm_set_cache(vm, cache); | ||||
| 			vms.push_back(vm); | ||||
| 		} | ||||
| 		std::cout << "Running benchmark (" << programCount << " nonces) ..." << std::endl; | ||||
| 		std::cout << "Running benchmark (" << noncesCount << " nonces) ..." << std::endl; | ||||
| 		sw.restart(); | ||||
| 		if (threadCount > 1) { | ||||
| 			for (unsigned i = 0; i < vms.size(); ++i) { | ||||
| 				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 | ||||
| 					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) { | ||||
| 				threads[i].join(); | ||||
| 			} | ||||
| 		} | ||||
| 		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(); | ||||
| 		std::cout << "Calculated result: "; | ||||
| 		result.print(std::cout); | ||||
| 		if(!legacy && programCount == 1000) | ||||
| 		std::cout << "Reference result:  630ad3bc7f44fe8386462d7b671fa2a1167d3e062bfb9a2967f64832760cfedb" << std::endl; | ||||
| 		if (noncesCount == 1000) | ||||
| 			std::cout << "Reference result:  dc34604eed2fbba0e8fae26b2270b90d8aad9466ba39950fd8904248442e850a" << std::endl; | ||||
| 		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 { | ||||
| 			std::cout << "Performance: " << programCount / elapsed << " hashes per second" << std::endl; | ||||
| 			std::cout << "Performance: " << noncesCount / elapsed << " hashes per second" << std::endl; | ||||
| 		} | ||||
| 	} | ||||
| 	catch (std::exception& e) { | ||||
|  | @ -357,4 +241,4 @@ int main(int argc, char** argv) { | |||
| 		return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| } | ||||
							
								
								
									
										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 CompiledVmHardAes = CompiledVm<AlignedAllocator<CacheLineSize>, false>; | ||||
| 	using CompiledVmLargePage = CompiledVm<LargePageAllocator, false>; | ||||
| 	using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, true>; | ||||
| 	using CompiledVmLargePage = CompiledVm<LargePageAllocator, true>; | ||||
| 	using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, false>; | ||||
| } | ||||
|  |  | |||
|  | @ -48,6 +48,6 @@ namespace randomx { | |||
| 
 | ||||
| 	using CompiledLightVmDefault = CompiledLightVm<AlignedAllocator<CacheLineSize>, true>; | ||||
| 	using CompiledLightVmHardAes = CompiledLightVm<AlignedAllocator<CacheLineSize>, false>; | ||||
| 	using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, false>; | ||||
| 	using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, true>; | ||||
| 	using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, true>; | ||||
| 	using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, false>; | ||||
| } | ||||
|  | @ -85,6 +85,6 @@ namespace randomx { | |||
| 
 | ||||
| 	using InterpretedVmDefault = InterpretedVm<AlignedAllocator<CacheLineSize>, true>; | ||||
| 	using InterpretedVmHardAes = InterpretedVm<AlignedAllocator<CacheLineSize>, false>; | ||||
| 	using InterpretedVmLargePage = InterpretedVm<LargePageAllocator, false>; | ||||
| 	using InterpretedVmLargePageHardAes = InterpretedVm<LargePageAllocator, true>; | ||||
| 	using InterpretedVmLargePage = InterpretedVm<LargePageAllocator, true>; | ||||
| 	using InterpretedVmLargePageHardAes = InterpretedVm<LargePageAllocator, false>; | ||||
| } | ||||
|  | @ -47,6 +47,6 @@ namespace randomx { | |||
| 
 | ||||
| 	using InterpretedLightVmDefault = InterpretedLightVm<AlignedAllocator<CacheLineSize>, true>; | ||||
| 	using InterpretedLightVmHardAes = InterpretedLightVm<AlignedAllocator<CacheLineSize>, false>; | ||||
| 	using InterpretedLightVmLargePage = InterpretedLightVm<LargePageAllocator, false>; | ||||
| 	using InterpretedLightVmLargePageHardAes = InterpretedLightVm<LargePageAllocator, true>; | ||||
| 	using InterpretedLightVmLargePage = 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> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <ConfigurationType>StaticLibrary</ConfigurationType> | ||||
|     <UseDebugLibraries>false</UseDebugLibraries> | ||||
|     <PlatformToolset>v141</PlatformToolset> | ||||
|     <WholeProgramOptimization>true</WholeProgramOptimization> | ||||
|  | @ -141,14 +141,13 @@ | |||
|     <ClCompile Include="..\src\jit_compiler_x86.cpp" /> | ||||
|     <ClCompile Include="..\src\randomx.cpp" /> | ||||
|     <ClCompile Include="..\src\superscalar.cpp" /> | ||||
|     <ClCompile Include="..\src\main.cpp" /> | ||||
|     <ClCompile Include="..\src\reciprocal.c" /> | ||||
|     <ClCompile Include="..\src\soft_aes.cpp" /> | ||||
|     <ClCompile Include="..\src\virtual_machine.cpp" /> | ||||
|     <ClCompile Include="..\src\virtual_memory.cpp" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <MASM Include="..\src\jit_compiler_x86_staticc.asm" /> | ||||
|     <MASM Include="..\src\jit_compiler_x86_static.asm" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\src\allocator.hpp" /> | ||||
|  | @ -156,7 +155,6 @@ | |||
|     <ClInclude Include="..\src\argon2_core.h" /> | ||||
|     <ClInclude Include="..\src\assembly_generator_x86.hpp" /> | ||||
|     <ClInclude Include="..\src\blake2_generator.hpp" /> | ||||
|     <ClInclude Include="..\src\catch.hpp" /> | ||||
|     <ClInclude Include="..\src\common.hpp" /> | ||||
|     <ClInclude Include="..\src\vm_compiled_light.hpp" /> | ||||
|     <ClInclude Include="..\src\vm_compiled.hpp" /> | ||||
|  | @ -175,7 +173,6 @@ | |||
|     <ClInclude Include="..\src\program.hpp" /> | ||||
|     <ClInclude Include="..\src\reciprocal.h" /> | ||||
|     <ClInclude Include="..\src\soft_aes.h" /> | ||||
|     <ClInclude Include="..\src\stopwatch.hpp" /> | ||||
|     <ClInclude Include="..\src\superscalar_program.hpp" /> | ||||
|     <ClInclude Include="..\src\virtual_machine.hpp" /> | ||||
|     <ClInclude Include="..\src\virtual_memory.hpp" /> | ||||
|  |  | |||
|  | @ -27,9 +27,6 @@ | |||
|     <ClCompile Include="..\src\dataset.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\main.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\blake2\blake2b.c"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|  | @ -82,11 +79,6 @@ | |||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <MASM Include="..\src\jit_compiler_x86_staticc.asm"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </MASM> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\src\argon2.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|  | @ -94,9 +86,6 @@ | |||
|     <ClInclude Include="..\src\argon2_core.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\catch.hpp"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\common.hpp"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|  | @ -160,9 +149,6 @@ | |||
|     <ClInclude Include="..\src\soft_aes.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\stopwatch.hpp"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\virtual_machine.hpp"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|  | @ -173,4 +159,9 @@ | |||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <MASM Include="..\src\jit_compiler_x86_static.asm"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </MASM> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue