X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/70bc6059902c30dcbd1cddbdb628e4bcbd9cc6f5..2face0de9e4353cedc0cb49b80744de3a2895540:/symm/chacha-x86ish-sse2.S diff --git a/symm/chacha-x86ish-sse2.S b/symm/chacha-x86ish-sse2.S index b58cdcea..0989fd4b 100644 --- a/symm/chacha-x86ish-sse2.S +++ b/symm/chacha-x86ish-sse2.S @@ -31,14 +31,6 @@ #include "asm-common.h" ///-------------------------------------------------------------------------- -/// Local utilities. - -// Magic constants for shuffling. -#define ROTL 0x93 -#define ROT2 0x4e -#define ROTR 0x39 - -///-------------------------------------------------------------------------- /// Main code. .arch pentium4 @@ -68,8 +60,8 @@ FUNC(chacha_core_x86ish_sse2) # define SAVE2 xmm7 # define SAVE3 [esp] - push ebp - mov ebp, esp + pushreg ebp + setfp ebp sub esp, 16 mov IN, [ebp + 12] mov OUT, [ebp + 16] @@ -109,11 +101,11 @@ FUNC(chacha_core_x86ish_sse2) # define SAVE2 [rsp + 16] # define SAVE3 [rsp + 32] - sub rsp, 48 + 8 - .seh_stackalloc 48 + 8 - .seh_endprologue + stalloc 48 + 8 #endif + endprologue + // First job is to slurp the matrix into XMM registers. Be careful: // the input matrix isn't likely to be properly aligned. // @@ -164,9 +156,9 @@ FUNC(chacha_core_x86ish_sse2) // c += d; b ^= c; b <<<= 7 paddd xmm2, xmm3 - pshufd xmm3, xmm3, ROTL + pshufd xmm3, xmm3, SHUF(2, 1, 0, 3) pxor xmm1, xmm2 - pshufd xmm2, xmm2, ROT2 + pshufd xmm2, xmm2, SHUF(1, 0, 3, 2) movdqa xmm4, xmm1 pslld xmm1, 7 psrld xmm4, 25 @@ -184,7 +176,7 @@ FUNC(chacha_core_x86ish_sse2) // // The shuffles have quite high latency, so they've mostly been // pushed upwards. The remaining one can't be moved, though. - pshufd xmm1, xmm1, ROTR + pshufd xmm1, xmm1, SHUF(0, 3, 2, 1) // Apply the diagonal quarterround to each of the columns // simultaneously. @@ -215,9 +207,9 @@ FUNC(chacha_core_x86ish_sse2) // c += d; b ^= c; b <<<= 7 paddd xmm2, xmm3 - pshufd xmm3, xmm3, ROTR + pshufd xmm3, xmm3, SHUF(0, 3, 2, 1) pxor xmm1, xmm2 - pshufd xmm2, xmm2, ROT2 + pshufd xmm2, xmm2, SHUF(1, 0, 3, 2) movdqa xmm4, xmm1 pslld xmm1, 7 psrld xmm4, 25 @@ -226,7 +218,7 @@ FUNC(chacha_core_x86ish_sse2) // Finally, finish off undoing the transpose, and we're done for this // doubleround. Again, most of this was done above so we don't have // to wait for the shuffles. - pshufd xmm1, xmm1, ROTL + pshufd xmm1, xmm1, SHUF(2, 1, 0, 3) // Decrement the loop counter and see if we should go round again. sub NR, 2 @@ -247,11 +239,11 @@ FUNC(chacha_core_x86ish_sse2) // Tidy things up. #if CPUFAM_X86 - mov esp, ebp - pop ebp + dropfp + popreg ebp #endif #if CPUFAM_AMD64 && ABI_WIN - add rsp, 48 + 8 + stfree 48 + 8 #endif // And with that, we're done.