summaryrefslogtreecommitdiff
path: root/TestPrograms/test_x86_via_sha.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'TestPrograms/test_x86_via_sha.cxx')
-rw-r--r--TestPrograms/test_x86_via_sha.cxx39
1 files changed, 39 insertions, 0 deletions
diff --git a/TestPrograms/test_x86_via_sha.cxx b/TestPrograms/test_x86_via_sha.cxx
new file mode 100644
index 00000000..84809adc
--- /dev/null
+++ b/TestPrograms/test_x86_via_sha.cxx
@@ -0,0 +1,39 @@
+// TODO: cut-in xsha1
+#include <cstdlib>
+int main(int argc, char* argv[])
+{
+ unsigned int msr=0;
+ unsigned int divisor=2;
+ unsigned int buffer;
+
+ __asm__ __volatile__
+ (
+#if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
+ "mov %1, %%rdi ;\n"
+ "movl %2, %%edx ;\n"
+#else
+ "mov %1, %%edi ;\n"
+ "movl %2, %%edx ;\n"
+#endif
+
+ // xstore-rng
+ ".byte 0x0f, 0xa7, 0xc0 ;\n"
+
+#if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
+ "andq %%rax, 0x1f ;\n"
+ "movl %%eax, %0 ;\n"
+#else
+ "andl %%eax, 0x1f ;\n"
+ "movl %%eax, %0 ;\n"
+#endif
+
+ : "=g" (msr) : "g" (buffer), "g" (divisor)
+#if (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
+ : "rax", "rdx", "rdi", "cc"
+#else
+ : "eax", "edx", "edi", "cc"
+#endif
+ );
+
+ return 0;
+}