xref: /plan9/sys/src/libsec/mips/sha1block.s (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1	TEXT	_sha1block+0(SB),$328
2
3/*
4 * wp[off] = x;
5 * x += A <<< 5;
6 * E += 0xca62c1d6 + x;
7 * x = FN(B,C,D);
8 * E += x;
9 * B >>> 2
10 */
11#define BODYX(off,FN,V,A,B,C,D,E)\
12	FN(B,C,D)\
13	ADDU TMP1,E;\
14	ADDU V,E;\
15	MOVW TMP2,off(WREG);\
16	ADDU TMP2,E;\
17	SLL $5,A,TMP3;\
18	SRL $27,A,TMP4;\
19	OR TMP3,TMP4;\
20	ADDU TMP4,E;\
21	SLL $30,B,TMP4;\
22	SRL $2,B;\
23	OR TMP4,B
24
25/*
26 * x = data[i]
27 * BODYX
28 */
29#define BODY1(off,FN,V,A,B,C,D,E)\
30	MOVBU off(DATAREG),TMP2;\
31	MOVBU (off+1)(DATAREG),TMP3;\
32	MOVBU (off+2)(DATAREG),TMP1;\
33	MOVBU (off+3)(DATAREG),TMP4;\
34	SLL $24,TMP2;\
35	SLL $16,TMP3;\
36	OR TMP3,TMP2;\
37	SLL $8,TMP1;\
38	OR TMP1,TMP2;\
39	OR TMP4,TMP2;\
40	BODYX(off,FN,V,A,B,C,D,E)
41
42/*
43 * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
44 * BODYX
45 */
46#define BODY(off,FN,V,A,B,C,D,E)\
47	MOVW (off-64)(WREG),TMP1;\
48	MOVW (off-56)(WREG),TMP2;\
49	MOVW (off-32)(WREG),TMP3;\
50	MOVW (off-12)(WREG),TMP4;\
51	XOR TMP1,TMP2;\
52	XOR TMP3,TMP2;\
53	XOR TMP4,TMP2;\
54	SLL $1,TMP2,TMP1;\
55	SRL $31,TMP2;\
56	OR TMP1,TMP2;\
57	BODYX(off,FN,V,A,B,C,D,E)
58
59/*
60 * fn1 = (((C^D)&B)^D);
61 */
62#define FN1(B,C,D)\
63	XOR C,D,TMP1;\
64	AND B,TMP1;\
65	XOR D,TMP1;
66
67/*
68 * fn24 = B ^ C ^ D
69 */
70#define FN24(B,C,D)\
71	XOR B,C,TMP1;\
72	XOR D,TMP1;
73
74/*
75 * fn3 = ((B ^ C) & (D ^ B)) ^ B
76 */
77#define FN3(B,C,D)\
78	XOR B,C,TMP1;\
79	XOR B,D,TMP4;\
80	AND TMP4,TMP1;\
81	XOR B,TMP1;
82
83/*
84 * stack offsets
85 * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN)
86 */
87#define	DATA	0
88#define	LEN	4
89#define	STATE	8
90
91/*
92 * stack offsets for locals
93 * ulong w[80];
94 * uchar *edata;
95 * ulong *w15, *w40, *w60, *w80;
96 * register local
97 * ulong *wp = BP
98 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
99 * ulong tmp = edi
100 */
101#define WARRAY	(-4-(80*4))
102
103#define	AREG		R5
104#define BREG		R6
105#define CREG		R7
106#define DREG		R8
107#define EREG		R9
108#define DATAREG		R1
109#define STREG		R11
110#define WREG		R12
111#define W15REG		R13
112#define W60REG		R14
113#define W40REG		R15
114#define W80REG		R16
115#define EDREG		R17
116#define VREG		R18
117
118#define TMP1		R10
119#define TMP2		R2
120#define TMP3		R3
121#define TMP4		R4
122#define TMP5		R19
123
124	MOVW len+LEN(FP),TMP1
125	MOVW state+STATE(FP),STREG
126	ADDU DATAREG,TMP1,EDREG
127
128	MOVW 0(STREG),AREG
129	MOVW 4(STREG),BREG
130	MOVW 8(STREG),CREG
131	MOVW 12(STREG),DREG
132	MOVW 16(STREG),EREG
133
134	MOVW $warray+WARRAY(SP),WREG
135	ADDU $(15*4),WREG,W15REG
136	ADDU $(40*4),WREG,W40REG
137	ADDU $(60*4),WREG,W60REG
138	ADDU $(80*4),WREG,W80REG
139
140mainloop:
141	MOVW $warray+WARRAY(SP),WREG
142
143	MOVW $0x5a827999,VREG
144loop1:
145	BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
146	BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
147	BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
148	BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
149	BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
150
151	ADDU $20,DATAREG
152	ADDU $20,WREG
153	BNE WREG,W15REG,loop1
154
155	BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG)
156	ADDU $4,DATAREG
157
158	BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG)
159	BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG)
160	BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG)
161	BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG)
162
163	ADDU $20,WREG
164
165	MOVW $0x6ed9eba1,VREG
166loop2:
167	BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
168	BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
169	BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
170	BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
171	BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
172
173	ADDU $20,WREG
174	BNE WREG,W40REG,loop2
175
176	MOVW $0x8f1bbcdc,VREG
177loop3:
178	BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG)
179	BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG)
180	BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG)
181	BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG)
182	BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG)
183
184	ADDU $20,WREG
185	BNE WREG,W60REG,loop3
186
187	MOVW $0xca62c1d6,VREG
188loop4:
189	BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG)
190	BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG)
191	BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG)
192	BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG)
193	BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG)
194
195	ADDU $20,WREG
196	BNE WREG,W80REG,loop4
197
198	MOVW 0(STREG),TMP1
199	MOVW 4(STREG),TMP2
200	MOVW 8(STREG),TMP3
201	MOVW 12(STREG),TMP4
202	MOVW 16(STREG),TMP5
203
204	ADDU TMP1,AREG
205	ADDU TMP2,BREG
206	ADDU TMP3,CREG
207	ADDU TMP4,DREG
208	ADDU TMP5,EREG
209
210	MOVW AREG,0(STREG)
211	MOVW BREG,4(STREG)
212	MOVW CREG,8(STREG)
213	MOVW DREG,12(STREG)
214	MOVW EREG,16(STREG)
215
216	BNE DATAREG,EDREG,mainloop
217
218	RET
219
220	END
221