]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/mips/sha1block.s
vncv: do NOT map Kaltgr to meta, introduce Mod4 (Super) as an extra key to use instead
[plan9front.git] / sys / src / libsec / mips / sha1block.s
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