| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build 386 && gc && !purego |
| // +build 386,gc,!purego |
| |
| #include "textflag.h" |
| |
| DATA iv0<>+0x00(SB)/4, $0x6a09e667 |
| DATA iv0<>+0x04(SB)/4, $0xbb67ae85 |
| DATA iv0<>+0x08(SB)/4, $0x3c6ef372 |
| DATA iv0<>+0x0c(SB)/4, $0xa54ff53a |
| GLOBL iv0<>(SB), (NOPTR+RODATA), $16 |
| |
| DATA iv1<>+0x00(SB)/4, $0x510e527f |
| DATA iv1<>+0x04(SB)/4, $0x9b05688c |
| DATA iv1<>+0x08(SB)/4, $0x1f83d9ab |
| DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 |
| GLOBL iv1<>(SB), (NOPTR+RODATA), $16 |
| |
| DATA rol16<>+0x00(SB)/8, $0x0504070601000302 |
| DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A |
| GLOBL rol16<>(SB), (NOPTR+RODATA), $16 |
| |
| DATA rol8<>+0x00(SB)/8, $0x0407060500030201 |
| DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 |
| GLOBL rol8<>(SB), (NOPTR+RODATA), $16 |
| |
| DATA counter<>+0x00(SB)/8, $0x40 |
| DATA counter<>+0x08(SB)/8, $0x0 |
| GLOBL counter<>(SB), (NOPTR+RODATA), $16 |
| |
| #define ROTL_SSE2(n, t, v) \ |
| MOVO v, t; \ |
| PSLLL $n, t; \ |
| PSRLL $(32-n), v; \ |
| PXOR t, v |
| |
| #define ROTL_SSSE3(c, v) \ |
| PSHUFB c, v |
| |
| #define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ |
| PADDL m0, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSE2(16, t, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(20, t, v1); \ |
| PADDL m1, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSE2(24, t, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(25, t, v1); \ |
| PSHUFL $0x39, v1, v1; \ |
| PSHUFL $0x4E, v2, v2; \ |
| PSHUFL $0x93, v3, v3; \ |
| PADDL m2, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSE2(16, t, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(20, t, v1); \ |
| PADDL m3, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSE2(24, t, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(25, t, v1); \ |
| PSHUFL $0x39, v3, v3; \ |
| PSHUFL $0x4E, v2, v2; \ |
| PSHUFL $0x93, v1, v1 |
| |
| #define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ |
| PADDL m0, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSSE3(c16, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(20, t, v1); \ |
| PADDL m1, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSSE3(c8, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(25, t, v1); \ |
| PSHUFL $0x39, v1, v1; \ |
| PSHUFL $0x4E, v2, v2; \ |
| PSHUFL $0x93, v3, v3; \ |
| PADDL m2, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSSE3(c16, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(20, t, v1); \ |
| PADDL m3, v0; \ |
| PADDL v1, v0; \ |
| PXOR v0, v3; \ |
| ROTL_SSSE3(c8, v3); \ |
| PADDL v3, v2; \ |
| PXOR v2, v1; \ |
| ROTL_SSE2(25, t, v1); \ |
| PSHUFL $0x39, v3, v3; \ |
| PSHUFL $0x4E, v2, v2; \ |
| PSHUFL $0x93, v1, v1 |
| |
| #define PRECOMPUTE(dst, off, src, t) \ |
| MOVL 0*4(src), t; \ |
| MOVL t, 0*4+off+0(dst); \ |
| MOVL t, 9*4+off+64(dst); \ |
| MOVL t, 5*4+off+128(dst); \ |
| MOVL t, 14*4+off+192(dst); \ |
| MOVL t, 4*4+off+256(dst); \ |
| MOVL t, 2*4+off+320(dst); \ |
| MOVL t, 8*4+off+384(dst); \ |
| MOVL t, 12*4+off+448(dst); \ |
| MOVL t, 3*4+off+512(dst); \ |
| MOVL t, 15*4+off+576(dst); \ |
| MOVL 1*4(src), t; \ |
| MOVL t, 4*4+off+0(dst); \ |
| MOVL t, 8*4+off+64(dst); \ |
| MOVL t, 14*4+off+128(dst); \ |
| MOVL t, 5*4+off+192(dst); \ |
| MOVL t, 12*4+off+256(dst); \ |
| MOVL t, 11*4+off+320(dst); \ |
| MOVL t, 1*4+off+384(dst); \ |
| MOVL t, 6*4+off+448(dst); \ |
| MOVL t, 10*4+off+512(dst); \ |
| MOVL t, 3*4+off+576(dst); \ |
| MOVL 2*4(src), t; \ |
| MOVL t, 1*4+off+0(dst); \ |
| MOVL t, 13*4+off+64(dst); \ |
| MOVL t, 6*4+off+128(dst); \ |
| MOVL t, 8*4+off+192(dst); \ |
| MOVL t, 2*4+off+256(dst); \ |
| MOVL t, 0*4+off+320(dst); \ |
| MOVL t, 14*4+off+384(dst); \ |
| MOVL t, 11*4+off+448(dst); \ |
| MOVL t, 12*4+off+512(dst); \ |
| MOVL t, 4*4+off+576(dst); \ |
| MOVL 3*4(src), t; \ |
| MOVL t, 5*4+off+0(dst); \ |
| MOVL t, 15*4+off+64(dst); \ |
| MOVL t, 9*4+off+128(dst); \ |
| MOVL t, 1*4+off+192(dst); \ |
| MOVL t, 11*4+off+256(dst); \ |
| MOVL t, 7*4+off+320(dst); \ |
| MOVL t, 13*4+off+384(dst); \ |
| MOVL t, 3*4+off+448(dst); \ |
| MOVL t, 6*4+off+512(dst); \ |
| MOVL t, 10*4+off+576(dst); \ |
| MOVL 4*4(src), t; \ |
| MOVL t, 2*4+off+0(dst); \ |
| MOVL t, 1*4+off+64(dst); \ |
| MOVL t, 15*4+off+128(dst); \ |
| MOVL t, 10*4+off+192(dst); \ |
| MOVL t, 6*4+off+256(dst); \ |
| MOVL t, 8*4+off+320(dst); \ |
| MOVL t, 3*4+off+384(dst); \ |
| MOVL t, 13*4+off+448(dst); \ |
| MOVL t, 14*4+off+512(dst); \ |
| MOVL t, 5*4+off+576(dst); \ |
| MOVL 5*4(src), t; \ |
| MOVL t, 6*4+off+0(dst); \ |
| MOVL t, 11*4+off+64(dst); \ |
| MOVL t, 2*4+off+128(dst); \ |
| MOVL t, 9*4+off+192(dst); \ |
| MOVL t, 1*4+off+256(dst); \ |
| MOVL t, 13*4+off+320(dst); \ |
| MOVL t, 4*4+off+384(dst); \ |
| MOVL t, 8*4+off+448(dst); \ |
| MOVL t, 15*4+off+512(dst); \ |
| MOVL t, 7*4+off+576(dst); \ |
| MOVL 6*4(src), t; \ |
| MOVL t, 3*4+off+0(dst); \ |
| MOVL t, 7*4+off+64(dst); \ |
| MOVL t, 13*4+off+128(dst); \ |
| MOVL t, 12*4+off+192(dst); \ |
| MOVL t, 10*4+off+256(dst); \ |
| MOVL t, 1*4+off+320(dst); \ |
| MOVL t, 9*4+off+384(dst); \ |
| MOVL t, 14*4+off+448(dst); \ |
| MOVL t, 0*4+off+512(dst); \ |
| MOVL t, 6*4+off+576(dst); \ |
| MOVL 7*4(src), t; \ |
| MOVL t, 7*4+off+0(dst); \ |
| MOVL t, 14*4+off+64(dst); \ |
| MOVL t, 10*4+off+128(dst); \ |
| MOVL t, 0*4+off+192(dst); \ |
| MOVL t, 5*4+off+256(dst); \ |
| MOVL t, 9*4+off+320(dst); \ |
| MOVL t, 12*4+off+384(dst); \ |
| MOVL t, 1*4+off+448(dst); \ |
| MOVL t, 13*4+off+512(dst); \ |
| MOVL t, 2*4+off+576(dst); \ |
| MOVL 8*4(src), t; \ |
| MOVL t, 8*4+off+0(dst); \ |
| MOVL t, 5*4+off+64(dst); \ |
| MOVL t, 4*4+off+128(dst); \ |
| MOVL t, 15*4+off+192(dst); \ |
| MOVL t, 14*4+off+256(dst); \ |
| MOVL t, 3*4+off+320(dst); \ |
| MOVL t, 11*4+off+384(dst); \ |
| MOVL t, 10*4+off+448(dst); \ |
| MOVL t, 7*4+off+512(dst); \ |
| MOVL t, 1*4+off+576(dst); \ |
| MOVL 9*4(src), t; \ |
| MOVL t, 12*4+off+0(dst); \ |
| MOVL t, 2*4+off+64(dst); \ |
| MOVL t, 11*4+off+128(dst); \ |
| MOVL t, 4*4+off+192(dst); \ |
| MOVL t, 0*4+off+256(dst); \ |
| MOVL t, 15*4+off+320(dst); \ |
| MOVL t, 10*4+off+384(dst); \ |
| MOVL t, 7*4+off+448(dst); \ |
| MOVL t, 5*4+off+512(dst); \ |
| MOVL t, 9*4+off+576(dst); \ |
| MOVL 10*4(src), t; \ |
| MOVL t, 9*4+off+0(dst); \ |
| MOVL t, 4*4+off+64(dst); \ |
| MOVL t, 8*4+off+128(dst); \ |
| MOVL t, 13*4+off+192(dst); \ |
| MOVL t, 3*4+off+256(dst); \ |
| MOVL t, 5*4+off+320(dst); \ |
| MOVL t, 7*4+off+384(dst); \ |
| MOVL t, 15*4+off+448(dst); \ |
| MOVL t, 11*4+off+512(dst); \ |
| MOVL t, 0*4+off+576(dst); \ |
| MOVL 11*4(src), t; \ |
| MOVL t, 13*4+off+0(dst); \ |
| MOVL t, 10*4+off+64(dst); \ |
| MOVL t, 0*4+off+128(dst); \ |
| MOVL t, 3*4+off+192(dst); \ |
| MOVL t, 9*4+off+256(dst); \ |
| MOVL t, 6*4+off+320(dst); \ |
| MOVL t, 15*4+off+384(dst); \ |
| MOVL t, 4*4+off+448(dst); \ |
| MOVL t, 2*4+off+512(dst); \ |
| MOVL t, 12*4+off+576(dst); \ |
| MOVL 12*4(src), t; \ |
| MOVL t, 10*4+off+0(dst); \ |
| MOVL t, 12*4+off+64(dst); \ |
| MOVL t, 1*4+off+128(dst); \ |
| MOVL t, 6*4+off+192(dst); \ |
| MOVL t, 13*4+off+256(dst); \ |
| MOVL t, 4*4+off+320(dst); \ |
| MOVL t, 0*4+off+384(dst); \ |
| MOVL t, 2*4+off+448(dst); \ |
| MOVL t, 8*4+off+512(dst); \ |
| MOVL t, 14*4+off+576(dst); \ |
| MOVL 13*4(src), t; \ |
| MOVL t, 14*4+off+0(dst); \ |
| MOVL t, 3*4+off+64(dst); \ |
| MOVL t, 7*4+off+128(dst); \ |
| MOVL t, 2*4+off+192(dst); \ |
| MOVL t, 15*4+off+256(dst); \ |
| MOVL t, 12*4+off+320(dst); \ |
| MOVL t, 6*4+off+384(dst); \ |
| MOVL t, 0*4+off+448(dst); \ |
| MOVL t, 9*4+off+512(dst); \ |
| MOVL t, 11*4+off+576(dst); \ |
| MOVL 14*4(src), t; \ |
| MOVL t, 11*4+off+0(dst); \ |
| MOVL t, 0*4+off+64(dst); \ |
| MOVL t, 12*4+off+128(dst); \ |
| MOVL t, 7*4+off+192(dst); \ |
| MOVL t, 8*4+off+256(dst); \ |
| MOVL t, 14*4+off+320(dst); \ |
| MOVL t, 2*4+off+384(dst); \ |
| MOVL t, 5*4+off+448(dst); \ |
| MOVL t, 1*4+off+512(dst); \ |
| MOVL t, 13*4+off+576(dst); \ |
| MOVL 15*4(src), t; \ |
| MOVL t, 15*4+off+0(dst); \ |
| MOVL t, 6*4+off+64(dst); \ |
| MOVL t, 3*4+off+128(dst); \ |
| MOVL t, 11*4+off+192(dst); \ |
| MOVL t, 7*4+off+256(dst); \ |
| MOVL t, 10*4+off+320(dst); \ |
| MOVL t, 5*4+off+384(dst); \ |
| MOVL t, 9*4+off+448(dst); \ |
| MOVL t, 4*4+off+512(dst); \ |
| MOVL t, 8*4+off+576(dst) |
| |
| // func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) |
| TEXT ·hashBlocksSSE2(SB), 0, $672-24 // frame = 656 + 16 byte alignment |
| MOVL h+0(FP), AX |
| MOVL c+4(FP), BX |
| MOVL flag+8(FP), CX |
| MOVL blocks_base+12(FP), SI |
| MOVL blocks_len+16(FP), DX |
| |
| MOVL SP, DI |
| ADDL $15, DI |
| ANDL $~15, DI |
| |
| MOVL CX, 8(DI) |
| MOVL 0(BX), CX |
| MOVL CX, 0(DI) |
| MOVL 4(BX), CX |
| MOVL CX, 4(DI) |
| XORL CX, CX |
| MOVL CX, 12(DI) |
| |
| MOVOU 0(AX), X0 |
| MOVOU 16(AX), X1 |
| MOVOU counter<>(SB), X2 |
| |
| loop: |
| MOVO X0, X4 |
| MOVO X1, X5 |
| MOVOU iv0<>(SB), X6 |
| MOVOU iv1<>(SB), X7 |
| |
| MOVO 0(DI), X3 |
| PADDQ X2, X3 |
| PXOR X3, X7 |
| MOVO X3, 0(DI) |
| |
| PRECOMPUTE(DI, 16, SI, CX) |
| ROUND_SSE2(X4, X5, X6, X7, 16(DI), 32(DI), 48(DI), 64(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+64(DI), 32+64(DI), 48+64(DI), 64+64(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+128(DI), 32+128(DI), 48+128(DI), 64+128(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+192(DI), 32+192(DI), 48+192(DI), 64+192(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+256(DI), 32+256(DI), 48+256(DI), 64+256(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+320(DI), 32+320(DI), 48+320(DI), 64+320(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+384(DI), 32+384(DI), 48+384(DI), 64+384(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+448(DI), 32+448(DI), 48+448(DI), 64+448(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+512(DI), 32+512(DI), 48+512(DI), 64+512(DI), X3) |
| ROUND_SSE2(X4, X5, X6, X7, 16+576(DI), 32+576(DI), 48+576(DI), 64+576(DI), X3) |
| |
| PXOR X4, X0 |
| PXOR X5, X1 |
| PXOR X6, X0 |
| PXOR X7, X1 |
| |
| LEAL 64(SI), SI |
| SUBL $64, DX |
| JNE loop |
| |
| MOVL 0(DI), CX |
| MOVL CX, 0(BX) |
| MOVL 4(DI), CX |
| MOVL CX, 4(BX) |
| |
| MOVOU X0, 0(AX) |
| MOVOU X1, 16(AX) |
| |
| RET |
| |
| // func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) |
| TEXT ·hashBlocksSSSE3(SB), 0, $704-24 // frame = 688 + 16 byte alignment |
| MOVL h+0(FP), AX |
| MOVL c+4(FP), BX |
| MOVL flag+8(FP), CX |
| MOVL blocks_base+12(FP), SI |
| MOVL blocks_len+16(FP), DX |
| |
| MOVL SP, DI |
| ADDL $15, DI |
| ANDL $~15, DI |
| |
| MOVL CX, 8(DI) |
| MOVL 0(BX), CX |
| MOVL CX, 0(DI) |
| MOVL 4(BX), CX |
| MOVL CX, 4(DI) |
| XORL CX, CX |
| MOVL CX, 12(DI) |
| |
| MOVOU 0(AX), X0 |
| MOVOU 16(AX), X1 |
| MOVOU counter<>(SB), X2 |
| |
| loop: |
| MOVO X0, 656(DI) |
| MOVO X1, 672(DI) |
| MOVO X0, X4 |
| MOVO X1, X5 |
| MOVOU iv0<>(SB), X6 |
| MOVOU iv1<>(SB), X7 |
| |
| MOVO 0(DI), X3 |
| PADDQ X2, X3 |
| PXOR X3, X7 |
| MOVO X3, 0(DI) |
| |
| MOVOU rol16<>(SB), X0 |
| MOVOU rol8<>(SB), X1 |
| |
| PRECOMPUTE(DI, 16, SI, CX) |
| ROUND_SSSE3(X4, X5, X6, X7, 16(DI), 32(DI), 48(DI), 64(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+64(DI), 32+64(DI), 48+64(DI), 64+64(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+128(DI), 32+128(DI), 48+128(DI), 64+128(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+192(DI), 32+192(DI), 48+192(DI), 64+192(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+256(DI), 32+256(DI), 48+256(DI), 64+256(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+320(DI), 32+320(DI), 48+320(DI), 64+320(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+384(DI), 32+384(DI), 48+384(DI), 64+384(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+448(DI), 32+448(DI), 48+448(DI), 64+448(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+512(DI), 32+512(DI), 48+512(DI), 64+512(DI), X3, X0, X1) |
| ROUND_SSSE3(X4, X5, X6, X7, 16+576(DI), 32+576(DI), 48+576(DI), 64+576(DI), X3, X0, X1) |
| |
| MOVO 656(DI), X0 |
| MOVO 672(DI), X1 |
| PXOR X4, X0 |
| PXOR X5, X1 |
| PXOR X6, X0 |
| PXOR X7, X1 |
| |
| LEAL 64(SI), SI |
| SUBL $64, DX |
| JNE loop |
| |
| MOVL 0(DI), CX |
| MOVL CX, 0(BX) |
| MOVL 4(DI), CX |
| MOVL CX, 4(BX) |
| |
| MOVOU X0, 0(AX) |
| MOVOU X1, 16(AX) |
| |
| RET |