...

Text file src/crypto/sha1/sha1block_386.s

Documentation: crypto/sha1

     1// Copyright 2013 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5//go:build !purego
     6
     7#include "textflag.h"
     8
     9// SHA-1 block routine. See sha1block.go for Go equivalent.
    10//
    11// There are 80 rounds of 4 types:
    12//   - rounds 0-15 are type 1 and load data (ROUND1 macro).
    13//   - rounds 16-19 are type 1 and do not load data (ROUND1x macro).
    14//   - rounds 20-39 are type 2 and do not load data (ROUND2 macro).
    15//   - rounds 40-59 are type 3 and do not load data (ROUND3 macro).
    16//   - rounds 60-79 are type 4 and do not load data (ROUND4 macro).
    17//
    18// Each round loads or shuffles the data, then computes a per-round
    19// function of b, c, d, and then mixes the result into and rotates the
    20// five registers a, b, c, d, e holding the intermediate results.
    21//
    22// The register rotation is implemented by rotating the arguments to
    23// the round macros instead of by explicit move instructions.
    24
    25// Like sha1block_amd64.s, but we keep the data and limit pointers on the stack.
    26// To free up the word pointer (R10 on amd64, DI here), we add it to e during
    27// LOAD/SHUFFLE instead of during MIX.
    28//
    29// The stack holds the intermediate word array - 16 uint32s - at 0(SP) up to 64(SP).
    30// The saved a, b, c, d, e (R11 through R15 on amd64) are at 64(SP) up to 84(SP).
    31// The saved limit pointer (DI on amd64) is at 84(SP).
    32// The saved data pointer (SI on amd64) is at 88(SP).
    33
    34#define LOAD(index, e) \
    35	MOVL	88(SP), SI; \
    36	MOVL	(index*4)(SI), DI; \
    37	BSWAPL	DI; \
    38	MOVL	DI, (index*4)(SP); \
    39	ADDL	DI, e
    40
    41#define SHUFFLE(index, e) \
    42	MOVL	(((index)&0xf)*4)(SP), DI; \
    43	XORL	(((index-3)&0xf)*4)(SP), DI; \
    44	XORL	(((index-8)&0xf)*4)(SP), DI; \
    45	XORL	(((index-14)&0xf)*4)(SP), DI; \
    46	ROLL	$1, DI; \
    47	MOVL	DI, (((index)&0xf)*4)(SP); \
    48	ADDL	DI, e
    49
    50#define FUNC1(a, b, c, d, e) \
    51	MOVL	d, DI; \
    52	XORL	c, DI; \
    53	ANDL	b, DI; \
    54	XORL	d, DI
    55
    56#define FUNC2(a, b, c, d, e) \
    57	MOVL	b, DI; \
    58	XORL	c, DI; \
    59	XORL	d, DI
    60
    61#define FUNC3(a, b, c, d, e) \
    62	MOVL	b, SI; \
    63	ORL	c, SI; \
    64	ANDL	d, SI; \
    65	MOVL	b, DI; \
    66	ANDL	c, DI; \
    67	ORL	SI, DI
    68
    69#define FUNC4 FUNC2
    70
    71#define MIX(a, b, c, d, e, const) \
    72	ROLL	$30, b; \
    73	ADDL	DI, e; \
    74	MOVL	a, SI; \
    75	ROLL	$5, SI; \
    76	LEAL	const(e)(SI*1), e
    77
    78#define ROUND1(a, b, c, d, e, index) \
    79	LOAD(index, e); \
    80	FUNC1(a, b, c, d, e); \
    81	MIX(a, b, c, d, e, 0x5A827999)
    82
    83#define ROUND1x(a, b, c, d, e, index) \
    84	SHUFFLE(index, e); \
    85	FUNC1(a, b, c, d, e); \
    86	MIX(a, b, c, d, e, 0x5A827999)
    87
    88#define ROUND2(a, b, c, d, e, index) \
    89	SHUFFLE(index, e); \
    90	FUNC2(a, b, c, d, e); \
    91	MIX(a, b, c, d, e, 0x6ED9EBA1)
    92
    93#define ROUND3(a, b, c, d, e, index) \
    94	SHUFFLE(index, e); \
    95	FUNC3(a, b, c, d, e); \
    96	MIX(a, b, c, d, e, 0x8F1BBCDC)
    97
    98#define ROUND4(a, b, c, d, e, index) \
    99	SHUFFLE(index, e); \
   100	FUNC4(a, b, c, d, e); \
   101	MIX(a, b, c, d, e, 0xCA62C1D6)
   102
   103// func block(dig *digest, p []byte)
   104TEXT ·block(SB),NOSPLIT,$92-16
   105	MOVL	dig+0(FP),	BP
   106	MOVL	p+4(FP),	SI
   107	MOVL	p_len+8(FP),	DX
   108	SHRL	$6,		DX
   109	SHLL	$6,		DX
   110
   111	LEAL	(SI)(DX*1),	DI
   112	MOVL	(0*4)(BP),	AX
   113	MOVL	(1*4)(BP),	BX
   114	MOVL	(2*4)(BP),	CX
   115	MOVL	(3*4)(BP),	DX
   116	MOVL	(4*4)(BP),	BP
   117
   118	CMPL	SI,		DI
   119	JEQ	end
   120
   121	MOVL	DI,	84(SP)
   122
   123loop:
   124	MOVL	SI,	88(SP)
   125
   126	MOVL	AX,	64(SP)
   127	MOVL	BX,	68(SP)
   128	MOVL	CX,	72(SP)
   129	MOVL	DX,	76(SP)
   130	MOVL	BP,	80(SP)
   131
   132	ROUND1(AX, BX, CX, DX, BP, 0)
   133	ROUND1(BP, AX, BX, CX, DX, 1)
   134	ROUND1(DX, BP, AX, BX, CX, 2)
   135	ROUND1(CX, DX, BP, AX, BX, 3)
   136	ROUND1(BX, CX, DX, BP, AX, 4)
   137	ROUND1(AX, BX, CX, DX, BP, 5)
   138	ROUND1(BP, AX, BX, CX, DX, 6)
   139	ROUND1(DX, BP, AX, BX, CX, 7)
   140	ROUND1(CX, DX, BP, AX, BX, 8)
   141	ROUND1(BX, CX, DX, BP, AX, 9)
   142	ROUND1(AX, BX, CX, DX, BP, 10)
   143	ROUND1(BP, AX, BX, CX, DX, 11)
   144	ROUND1(DX, BP, AX, BX, CX, 12)
   145	ROUND1(CX, DX, BP, AX, BX, 13)
   146	ROUND1(BX, CX, DX, BP, AX, 14)
   147	ROUND1(AX, BX, CX, DX, BP, 15)
   148
   149	ROUND1x(BP, AX, BX, CX, DX, 16)
   150	ROUND1x(DX, BP, AX, BX, CX, 17)
   151	ROUND1x(CX, DX, BP, AX, BX, 18)
   152	ROUND1x(BX, CX, DX, BP, AX, 19)
   153
   154	ROUND2(AX, BX, CX, DX, BP, 20)
   155	ROUND2(BP, AX, BX, CX, DX, 21)
   156	ROUND2(DX, BP, AX, BX, CX, 22)
   157	ROUND2(CX, DX, BP, AX, BX, 23)
   158	ROUND2(BX, CX, DX, BP, AX, 24)
   159	ROUND2(AX, BX, CX, DX, BP, 25)
   160	ROUND2(BP, AX, BX, CX, DX, 26)
   161	ROUND2(DX, BP, AX, BX, CX, 27)
   162	ROUND2(CX, DX, BP, AX, BX, 28)
   163	ROUND2(BX, CX, DX, BP, AX, 29)
   164	ROUND2(AX, BX, CX, DX, BP, 30)
   165	ROUND2(BP, AX, BX, CX, DX, 31)
   166	ROUND2(DX, BP, AX, BX, CX, 32)
   167	ROUND2(CX, DX, BP, AX, BX, 33)
   168	ROUND2(BX, CX, DX, BP, AX, 34)
   169	ROUND2(AX, BX, CX, DX, BP, 35)
   170	ROUND2(BP, AX, BX, CX, DX, 36)
   171	ROUND2(DX, BP, AX, BX, CX, 37)
   172	ROUND2(CX, DX, BP, AX, BX, 38)
   173	ROUND2(BX, CX, DX, BP, AX, 39)
   174
   175	ROUND3(AX, BX, CX, DX, BP, 40)
   176	ROUND3(BP, AX, BX, CX, DX, 41)
   177	ROUND3(DX, BP, AX, BX, CX, 42)
   178	ROUND3(CX, DX, BP, AX, BX, 43)
   179	ROUND3(BX, CX, DX, BP, AX, 44)
   180	ROUND3(AX, BX, CX, DX, BP, 45)
   181	ROUND3(BP, AX, BX, CX, DX, 46)
   182	ROUND3(DX, BP, AX, BX, CX, 47)
   183	ROUND3(CX, DX, BP, AX, BX, 48)
   184	ROUND3(BX, CX, DX, BP, AX, 49)
   185	ROUND3(AX, BX, CX, DX, BP, 50)
   186	ROUND3(BP, AX, BX, CX, DX, 51)
   187	ROUND3(DX, BP, AX, BX, CX, 52)
   188	ROUND3(CX, DX, BP, AX, BX, 53)
   189	ROUND3(BX, CX, DX, BP, AX, 54)
   190	ROUND3(AX, BX, CX, DX, BP, 55)
   191	ROUND3(BP, AX, BX, CX, DX, 56)
   192	ROUND3(DX, BP, AX, BX, CX, 57)
   193	ROUND3(CX, DX, BP, AX, BX, 58)
   194	ROUND3(BX, CX, DX, BP, AX, 59)
   195
   196	ROUND4(AX, BX, CX, DX, BP, 60)
   197	ROUND4(BP, AX, BX, CX, DX, 61)
   198	ROUND4(DX, BP, AX, BX, CX, 62)
   199	ROUND4(CX, DX, BP, AX, BX, 63)
   200	ROUND4(BX, CX, DX, BP, AX, 64)
   201	ROUND4(AX, BX, CX, DX, BP, 65)
   202	ROUND4(BP, AX, BX, CX, DX, 66)
   203	ROUND4(DX, BP, AX, BX, CX, 67)
   204	ROUND4(CX, DX, BP, AX, BX, 68)
   205	ROUND4(BX, CX, DX, BP, AX, 69)
   206	ROUND4(AX, BX, CX, DX, BP, 70)
   207	ROUND4(BP, AX, BX, CX, DX, 71)
   208	ROUND4(DX, BP, AX, BX, CX, 72)
   209	ROUND4(CX, DX, BP, AX, BX, 73)
   210	ROUND4(BX, CX, DX, BP, AX, 74)
   211	ROUND4(AX, BX, CX, DX, BP, 75)
   212	ROUND4(BP, AX, BX, CX, DX, 76)
   213	ROUND4(DX, BP, AX, BX, CX, 77)
   214	ROUND4(CX, DX, BP, AX, BX, 78)
   215	ROUND4(BX, CX, DX, BP, AX, 79)
   216
   217	ADDL	64(SP), AX
   218	ADDL	68(SP), BX
   219	ADDL	72(SP), CX
   220	ADDL	76(SP), DX
   221	ADDL	80(SP), BP
   222
   223	MOVL	88(SP), SI
   224	ADDL	$64, SI
   225	CMPL	SI, 84(SP)
   226	JB	loop
   227
   228end:
   229	MOVL	dig+0(FP), DI
   230	MOVL	AX, (0*4)(DI)
   231	MOVL	BX, (1*4)(DI)
   232	MOVL	CX, (2*4)(DI)
   233	MOVL	DX, (3*4)(DI)
   234	MOVL	BP, (4*4)(DI)
   235	RET

View as plain text