| // Copyright 2012 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. | 
 |  | 
 | #include "textflag.h" | 
 |  | 
 | // func encryptBlockAsm(nr int, xk *uint32, dst, src *byte) | 
 | TEXT ·encryptBlockAsm(SB),NOSPLIT,$0 | 
 | 	MOVQ nr+0(FP), CX | 
 | 	MOVQ xk+8(FP), AX | 
 | 	MOVQ dst+16(FP), DX | 
 | 	MOVQ src+24(FP), BX | 
 | 	MOVUPS 0(AX), X1 | 
 | 	MOVUPS 0(BX), X0 | 
 | 	ADDQ $16, AX | 
 | 	PXOR X1, X0 | 
 | 	SUBQ $12, CX | 
 | 	JE Lenc196 | 
 | 	JB Lenc128 | 
 | Lenc256: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	ADDQ $32, AX | 
 | Lenc196: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	ADDQ $32, AX | 
 | Lenc128: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 32(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 48(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 64(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 80(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 96(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 112(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 128(AX), X1 | 
 | 	AESENC X1, X0 | 
 | 	MOVUPS 144(AX), X1 | 
 | 	AESENCLAST X1, X0 | 
 | 	MOVUPS X0, 0(DX) | 
 | 	RET | 
 |  | 
 | // func decryptBlockAsm(nr int, xk *uint32, dst, src *byte) | 
 | TEXT ·decryptBlockAsm(SB),NOSPLIT,$0 | 
 | 	MOVQ nr+0(FP), CX | 
 | 	MOVQ xk+8(FP), AX | 
 | 	MOVQ dst+16(FP), DX | 
 | 	MOVQ src+24(FP), BX | 
 | 	MOVUPS 0(AX), X1 | 
 | 	MOVUPS 0(BX), X0 | 
 | 	ADDQ $16, AX | 
 | 	PXOR X1, X0 | 
 | 	SUBQ $12, CX | 
 | 	JE Ldec196 | 
 | 	JB Ldec128 | 
 | Ldec256: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	ADDQ $32, AX | 
 | Ldec196: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	ADDQ $32, AX | 
 | Ldec128: | 
 | 	MOVUPS 0(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 16(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 32(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 48(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 64(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 80(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 96(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 112(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 128(AX), X1 | 
 | 	AESDEC X1, X0 | 
 | 	MOVUPS 144(AX), X1 | 
 | 	AESDECLAST X1, X0 | 
 | 	MOVUPS X0, 0(DX) | 
 | 	RET | 
 |  | 
 | // func expandKeyAsm(nr int, key *byte, enc, dec *uint32) { | 
 | // Note that round keys are stored in uint128 format, not uint32 | 
 | TEXT ·expandKeyAsm(SB),NOSPLIT,$0 | 
 | 	MOVQ nr+0(FP), CX | 
 | 	MOVQ key+8(FP), AX | 
 | 	MOVQ enc+16(FP), BX | 
 | 	MOVQ dec+24(FP), DX | 
 | 	MOVUPS (AX), X0 | 
 | 	// enc | 
 | 	MOVUPS X0, (BX) | 
 | 	ADDQ $16, BX | 
 | 	PXOR X4, X4 // _expand_key_* expect X4 to be zero | 
 | 	CMPL CX, $12 | 
 | 	JE Lexp_enc196 | 
 | 	JB Lexp_enc128 | 
 | Lexp_enc256: | 
 | 	MOVUPS 16(AX), X2 | 
 | 	MOVUPS X2, (BX) | 
 | 	ADDQ $16, BX | 
 | 	AESKEYGENASSIST $0x01, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x01, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x02, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x02, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x04, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x04, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x08, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x08, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x10, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x10, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x20, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	AESKEYGENASSIST $0x20, X0, X1 | 
 | 	CALL _expand_key_256b<>(SB) | 
 | 	AESKEYGENASSIST $0x40, X2, X1 | 
 | 	CALL _expand_key_256a<>(SB) | 
 | 	JMP Lexp_dec | 
 | Lexp_enc196: | 
 | 	MOVQ 16(AX), X2 | 
 | 	AESKEYGENASSIST $0x01, X2, X1 | 
 | 	CALL _expand_key_192a<>(SB) | 
 | 	AESKEYGENASSIST $0x02, X2, X1 | 
 | 	CALL _expand_key_192b<>(SB) | 
 | 	AESKEYGENASSIST $0x04, X2, X1 | 
 | 	CALL _expand_key_192a<>(SB) | 
 | 	AESKEYGENASSIST $0x08, X2, X1 | 
 | 	CALL _expand_key_192b<>(SB) | 
 | 	AESKEYGENASSIST $0x10, X2, X1 | 
 | 	CALL _expand_key_192a<>(SB) | 
 | 	AESKEYGENASSIST $0x20, X2, X1 | 
 | 	CALL _expand_key_192b<>(SB) | 
 | 	AESKEYGENASSIST $0x40, X2, X1 | 
 | 	CALL _expand_key_192a<>(SB) | 
 | 	AESKEYGENASSIST $0x80, X2, X1 | 
 | 	CALL _expand_key_192b<>(SB) | 
 | 	JMP Lexp_dec | 
 | Lexp_enc128: | 
 | 	AESKEYGENASSIST $0x01, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x02, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x04, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x08, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x10, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x20, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x40, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x80, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x1b, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | 	AESKEYGENASSIST $0x36, X0, X1 | 
 | 	CALL _expand_key_128<>(SB) | 
 | Lexp_dec: | 
 | 	// dec | 
 | 	SUBQ $16, BX | 
 | 	MOVUPS (BX), X1 | 
 | 	MOVUPS X1, (DX) | 
 | 	DECQ CX | 
 | Lexp_dec_loop: | 
 | 	MOVUPS -16(BX), X1 | 
 | 	AESIMC X1, X0 | 
 | 	MOVUPS X0, 16(DX) | 
 | 	SUBQ $16, BX | 
 | 	ADDQ $16, DX | 
 | 	DECQ CX | 
 | 	JNZ Lexp_dec_loop | 
 | 	MOVUPS -16(BX), X0 | 
 | 	MOVUPS X0, 16(DX) | 
 | 	RET | 
 |  | 
 | TEXT _expand_key_128<>(SB),NOSPLIT,$0 | 
 | 	PSHUFD $0xff, X1, X1 | 
 | 	SHUFPS $0x10, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	SHUFPS $0x8c, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	PXOR X1, X0 | 
 | 	MOVUPS X0, (BX) | 
 | 	ADDQ $16, BX | 
 | 	RET | 
 |  | 
 | TEXT _expand_key_192a<>(SB),NOSPLIT,$0 | 
 | 	PSHUFD $0x55, X1, X1 | 
 | 	SHUFPS $0x10, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	SHUFPS $0x8c, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	PXOR X1, X0 | 
 |  | 
 | 	MOVAPS X2, X5 | 
 | 	MOVAPS X2, X6 | 
 | 	PSLLDQ $0x4, X5 | 
 | 	PSHUFD $0xff, X0, X3 | 
 | 	PXOR X3, X2 | 
 | 	PXOR X5, X2 | 
 |  | 
 | 	MOVAPS X0, X1 | 
 | 	SHUFPS $0x44, X0, X6 | 
 | 	MOVUPS X6, (BX) | 
 | 	SHUFPS $0x4e, X2, X1 | 
 | 	MOVUPS X1, 16(BX) | 
 | 	ADDQ $32, BX | 
 | 	RET | 
 |  | 
 | TEXT _expand_key_192b<>(SB),NOSPLIT,$0 | 
 | 	PSHUFD $0x55, X1, X1 | 
 | 	SHUFPS $0x10, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	SHUFPS $0x8c, X0, X4 | 
 | 	PXOR X4, X0 | 
 | 	PXOR X1, X0 | 
 |  | 
 | 	MOVAPS X2, X5 | 
 | 	PSLLDQ $0x4, X5 | 
 | 	PSHUFD $0xff, X0, X3 | 
 | 	PXOR X3, X2 | 
 | 	PXOR X5, X2 | 
 |  | 
 | 	MOVUPS X0, (BX) | 
 | 	ADDQ $16, BX | 
 | 	RET | 
 |  | 
 | TEXT _expand_key_256a<>(SB),NOSPLIT,$0 | 
 | 	JMP _expand_key_128<>(SB) | 
 |  | 
 | TEXT _expand_key_256b<>(SB),NOSPLIT,$0 | 
 | 	PSHUFD $0xaa, X1, X1 | 
 | 	SHUFPS $0x10, X2, X4 | 
 | 	PXOR X4, X2 | 
 | 	SHUFPS $0x8c, X2, X4 | 
 | 	PXOR X4, X2 | 
 | 	PXOR X1, X2 | 
 |  | 
 | 	MOVUPS X2, (BX) | 
 | 	ADDQ $16, BX | 
 | 	RET |