format ms64 coff | |||||
section '.text' code readable executable | |||||
use64 | |||||
public _AVX | |||||
_AVX: | |||||
vbroadcastsd ymm0, xmm0 ; load @num into all slots | |||||
vsqrtpd ymm0, ymm0 | |||||
vmovdqu [rdx], ymm0 ; store result in @res | |||||
ret | |||||
public _RDRAND | |||||
_RDRAND: | |||||
rdrand eax | |||||
ret |
#pragma once | |||||
extern "C" { | |||||
/** | |||||
* Gets the square root of num four times and writes it to @res | |||||
* | |||||
* @param num: the number of which the square root shall be taken | |||||
* @param res: where the 4 results shall be written | |||||
*/ | |||||
void _AVX(float num, void* res); | |||||
/** | |||||
* Just a wrapper around RDRAND | |||||
*/ | |||||
uint32_t _RDRAND(void); | |||||
} |
</Link> | </Link> | ||||
</ItemDefinitionGroup> | </ItemDefinitionGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ClInclude Include="advanced_instructions.h" /> | |||||
<ClInclude Include="catch.hpp" /> | <ClInclude Include="catch.hpp" /> | ||||
<ClInclude Include="simple_tests.h" /> | <ClInclude Include="simple_tests.h" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ClCompile Include="main.cpp" /> | <ClCompile Include="main.cpp" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<None Include="advanced_instructions.asm" /> | |||||
<None Include="README.md" /> | <None Include="README.md" /> | ||||
<None Include="simple_tests.asm" /> | <None Include="simple_tests.asm" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Object Include="advanced_instructions.obj" /> | |||||
<Object Include="simple_tests.obj" /> | <Object Include="simple_tests.obj" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
<ClInclude Include="simple_tests.h"> | <ClInclude Include="simple_tests.h"> | ||||
<Filter>Header Files</Filter> | <Filter>Header Files</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="advanced_instructions.h"> | |||||
<Filter>Header Files</Filter> | |||||
</ClInclude> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ClCompile Include="main.cpp"> | <ClCompile Include="main.cpp"> | ||||
<Filter>Source Files</Filter> | <Filter>Source Files</Filter> | ||||
</None> | </None> | ||||
<None Include="README.md" /> | <None Include="README.md" /> | ||||
<None Include="advanced_instructions.asm"> | |||||
<Filter>Source Files</Filter> | |||||
</None> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Object Include="simple_tests.obj" /> | <Object Include="simple_tests.obj" /> | ||||
<Object Include="advanced_instructions.obj" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | </Project> |
#define CATCH_CONFIG_MAIN | #define CATCH_CONFIG_MAIN | ||||
#include "catch.hpp" | #include "catch.hpp" | ||||
#include "simple_tests.h" | #include "simple_tests.h" | ||||
#include "advanced_instructions.h" | |||||
TEST_CASE("Functions work as expected, unhooked") { | |||||
TEST_CASE("Simple functions work as expected, unhooked") { | |||||
REQUIRE(_small() == 0); | REQUIRE(_small() == 0); | ||||
REQUIRE(_branch(1) == 0); | REQUIRE(_branch(1) == 0); | ||||
for (int i = 0; i < 1000; i++) { | for (int i = 0; i < 1000; i++) { | ||||
REQUIRE(_rip_relative() == rand()); | REQUIRE(_rip_relative() == rand()); | ||||
} | } | ||||
} | |||||
TEST_CASE("Advanced instruction functions work as expected, unhokked") { | |||||
double result[4]; | |||||
_AVX(9., static_cast<void*>(result)); | |||||
REQUIRE((result[0] - result[1]) < DBL_EPSILON); | |||||
REQUIRE((result[1] - result[2]) < DBL_EPSILON); | |||||
REQUIRE((result[2] - result[3]) < DBL_EPSILON); | |||||
REQUIRE((result[0] - 3.) < DBL_EPSILON); | |||||
} | } |