base/dispatch.c, base/dispatch-x86ish.S: Add opcode to `rdrand_works_p'.
[catacomb] / base / dispatch-x86ish.S
index 94f44ee..b3b6d1c 100644 (file)
@@ -158,22 +158,27 @@ ENDFUNC
 /// Checking `rdrand'.
 
 FUNC(dispatch_x86ish_rdrand)
-       // Enter with one argument: a pointer X_OUT to a 32-bit word.  Try to
-       // generate a random word using `rdrand'.  If successful, set *X_OUT
-       // to the generated word, and return zero; otherwise, return -1.
+       // Enter with two arguments: a code OP requesting `rdrand' (0), and a
+       // pointer X_OUT to a 32-bit word.  Try to generate a random word
+       // using the requested instruction.  If successful, set *X_OUT to the
+       // generated word, and return zero; otherwise, return -1.
 
 #if CPUFAM_X86
+#  define OP eax
 #  define X_OUT edx
 #  define COUNT ecx
-       mov     X_OUT, [SP + 4]
+       mov     OP, [SP + 4]
+       mov     X_OUT, [SP + 8]
 #endif
 #if CPUFAM_AMD64 && ABI_SYSV
-#  define X_OUT rdi
+#  define OP edi
+#  define X_OUT rsi
 #  define COUNT ecx
 #endif
 #if CPUFAM_AMD64 && ABI_WIN
-#  define X_OUT rcx
-#  define COUNT edx
+#  define OP rcx
+#  define X_OUT rdx
+#  define COUNT r8d
 #endif
   endprologue
 
@@ -182,9 +187,10 @@ FUNC(dispatch_x86ish_rdrand)
        jc      9f
        dec     COUNT
        jnz     0b
+       jmp     8f
 
        // Failed to come up with a random value.
-       mov     eax, -1
+8:     mov     eax, -1
        ret
 
        // Success.