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