X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/dc2adc883524babe0ebec62d8f85372ef18bfd7a..1519ef6617fd7351bd40026b9eeb47c7f7f42234:/rand/rand-x86ish.S diff --git a/rand/rand-x86ish.S b/rand/rand-x86ish.S index 70907feb..399ccb1d 100644 --- a/rand/rand-x86ish.S +++ b/rand/rand-x86ish.S @@ -54,7 +54,8 @@ FUNC(rand_quick_x86ish_rdrand) #if CPUFAM_X86 mov edx, [SP + 4] - stalloc 28 + push ebx + stalloc 24 #endif #if CPUFAM_AMD64 && ABI_SYSV stalloc 8 @@ -74,10 +75,40 @@ FUNC(rand_quick_x86ish_rdrand) // Failed. mov eax, -1 jmp 9f +ENDFUNC + +FUNC(rand_quick_x86ish_rdseed) + // Enter with a pointer to the random context in the first argument. + // Return zero on success, or -1 on error. + +#if CPUFAM_X86 + mov edx, [SP + 4] + push ebx + stalloc 24 +#endif +#if CPUFAM_AMD64 && ABI_SYSV + stalloc 8 +#endif +#if CPUFAM_AMD64 && ABI_WIN + stalloc 40 +#endif + endprologue + + // Try to fetch a random number. + mov COUNT, 16 +0: rdseed AX + jc 1f + dec COUNT + jnz 0b + + // Failed. + mov eax, -1 + jmp 9f // Success. 1: #if CPUFAM_X86 + ldgot ebx mov [SP + 16], AX lea ecx, [SP + 16] mov dword ptr [SP + 12], 32 @@ -103,7 +134,8 @@ FUNC(rand_quick_x86ish_rdrand) // Done. 9: #if CPUFAM_X86 - stfree 28 + stfree 24 + pop ebx #endif #if CPUFAM_AMD64 && ABI_SYSV stfree 8