Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
 
140
mainloop:
141
	MOVW $warray+WARRAY(SP),WREG
142
 
143
	MOVW $0x5a827999,VREG
144
loop1:
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
166
loop2:
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
177
loop3:
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
188
loop4:
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