Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / sparc / crypto / camellia_asm.S
1 #include <linux/linkage.h>
2 #include <asm/visasm.h>
3
4 #include "opcodes.h"
5
6 #define CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
7         CAMELLIA_F(KEY_BASE +  0, I1, I0, I1) \
8         CAMELLIA_F(KEY_BASE +  2, I0, I1, I0) \
9         CAMELLIA_F(KEY_BASE +  4, I1, I0, I1) \
10         CAMELLIA_F(KEY_BASE +  6, I0, I1, I0) \
11         CAMELLIA_F(KEY_BASE +  8, I1, I0, I1) \
12         CAMELLIA_F(KEY_BASE + 10, I0, I1, I0)
13
14 #define CAMELLIA_6ROUNDS_FL_FLI(KEY_BASE, I0, I1) \
15         CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
16         CAMELLIA_FL(KEY_BASE + 12, I0, I0) \
17         CAMELLIA_FLI(KEY_BASE + 14, I1, I1)
18
19         .data
20
21         .align  8
22 SIGMA:  .xword  0xA09E667F3BCC908B
23         .xword  0xB67AE8584CAA73B2
24         .xword  0xC6EF372FE94F82BE
25         .xword  0x54FF53A5F1D36F1C
26         .xword  0x10E527FADE682D1D
27         .xword  0xB05688C2B3E6C1FD
28
29         .text
30
31         .align  32
32 ENTRY(camellia_sparc64_key_expand)
33         /* %o0=in_key, %o1=encrypt_key, %o2=key_len, %o3=decrypt_key */
34         VISEntry
35         ld      [%o0 + 0x00], %f0       ! i0, k[0]
36         ld      [%o0 + 0x04], %f1       ! i1, k[1]
37         ld      [%o0 + 0x08], %f2       ! i2, k[2]
38         ld      [%o0 + 0x0c], %f3       ! i3, k[3]
39         std     %f0, [%o1 + 0x00]       ! k[0, 1]
40         fsrc2   %f0, %f28
41         std     %f2, [%o1 + 0x08]       ! k[2, 3]
42         cmp     %o2, 16
43         be      10f
44          fsrc2  %f2, %f30
45
46         ld      [%o0 + 0x10], %f0
47         ld      [%o0 + 0x14], %f1
48         std     %f0, [%o1 + 0x20]       ! k[8, 9]
49         cmp     %o2, 24
50         fone    %f10
51         be,a    1f
52          fxor   %f10, %f0, %f2
53         ld      [%o0 + 0x18], %f2
54         ld      [%o0 + 0x1c], %f3
55 1:
56         std     %f2, [%o1 + 0x28]       ! k[10, 11]
57         fxor    %f28, %f0, %f0
58         fxor    %f30, %f2, %f2
59
60 10:
61         sethi   %hi(SIGMA), %g3
62         or      %g3, %lo(SIGMA), %g3
63         ldd     [%g3 + 0x00], %f16
64         ldd     [%g3 + 0x08], %f18
65         ldd     [%g3 + 0x10], %f20
66         ldd     [%g3 + 0x18], %f22
67         ldd     [%g3 + 0x20], %f24
68         ldd     [%g3 + 0x28], %f26
69         CAMELLIA_F(16, 2, 0, 2)
70         CAMELLIA_F(18, 0, 2, 0)
71         fxor    %f28, %f0, %f0
72         fxor    %f30, %f2, %f2
73         CAMELLIA_F(20, 2, 0, 2)
74         CAMELLIA_F(22, 0, 2, 0)
75
76 #define ROTL128(S01, S23, TMP1, TMP2, N)        \
77         srlx    S01, (64 - N), TMP1;            \
78         sllx    S01, N, S01;                    \
79         srlx    S23, (64 - N), TMP2;            \
80         sllx    S23, N, S23;                    \
81         or      S01, TMP2, S01;                 \
82         or      S23, TMP1, S23
83
84         cmp     %o2, 16
85         bne     1f
86          nop
87         /* 128-bit key */
88         std     %f0, [%o1 + 0x10]       ! k[ 4,  5]
89         std     %f2, [%o1 + 0x18]       ! k[ 6,  7]
90         MOVDTOX_F0_O4
91         MOVDTOX_F2_O5
92         ROTL128(%o4, %o5, %g2, %g3, 15)
93         stx     %o4, [%o1 + 0x30]       ! k[12, 13]
94         stx     %o5, [%o1 + 0x38]       ! k[14, 15]
95         ROTL128(%o4, %o5, %g2, %g3, 15)
96         stx     %o4, [%o1 + 0x40]       ! k[16, 17]
97         stx     %o5, [%o1 + 0x48]       ! k[18, 19]
98         ROTL128(%o4, %o5, %g2, %g3, 15)
99         stx     %o4, [%o1 + 0x60]       ! k[24, 25]
100         ROTL128(%o4, %o5, %g2, %g3, 15)
101         stx     %o4, [%o1 + 0x70]       ! k[28, 29]
102         stx     %o5, [%o1 + 0x78]       ! k[30, 31]
103         ROTL128(%o4, %o5, %g2, %g3, 34)
104         stx     %o4, [%o1 + 0xa0]       ! k[40, 41]
105         stx     %o5, [%o1 + 0xa8]       ! k[42, 43]
106         ROTL128(%o4, %o5, %g2, %g3, 17)
107         stx     %o4, [%o1 + 0xc0]       ! k[48, 49]
108         stx     %o5, [%o1 + 0xc8]       ! k[50, 51]
109
110         ldx     [%o1 + 0x00], %o4       ! k[ 0,  1]
111         ldx     [%o1 + 0x08], %o5       ! k[ 2,  3]
112         ROTL128(%o4, %o5, %g2, %g3, 15)
113         stx     %o4, [%o1 + 0x20]       ! k[ 8,  9]
114         stx     %o5, [%o1 + 0x28]       ! k[10, 11]
115         ROTL128(%o4, %o5, %g2, %g3, 30)
116         stx     %o4, [%o1 + 0x50]       ! k[20, 21]
117         stx     %o5, [%o1 + 0x58]       ! k[22, 23]
118         ROTL128(%o4, %o5, %g2, %g3, 15)
119         stx     %o5, [%o1 + 0x68]       ! k[26, 27]
120         ROTL128(%o4, %o5, %g2, %g3, 17)
121         stx     %o4, [%o1 + 0x80]       ! k[32, 33]
122         stx     %o5, [%o1 + 0x88]       ! k[34, 35]
123         ROTL128(%o4, %o5, %g2, %g3, 17)
124         stx     %o4, [%o1 + 0x90]       ! k[36, 37]
125         stx     %o5, [%o1 + 0x98]       ! k[38, 39]
126         ROTL128(%o4, %o5, %g2, %g3, 17)
127         stx     %o4, [%o1 + 0xb0]       ! k[44, 45]
128         stx     %o5, [%o1 + 0xb8]       ! k[46, 47]
129
130         ba,pt   %xcc, 2f
131          mov    (3 * 16 * 4), %o0
132
133 1:
134         /* 192-bit or 256-bit key */
135         std     %f0, [%o1 + 0x30]       ! k[12, 13]
136         std     %f2, [%o1 + 0x38]       ! k[14, 15]
137         ldd     [%o1 + 0x20], %f4       ! k[ 8,  9]
138         ldd     [%o1 + 0x28], %f6       ! k[10, 11]
139         fxor    %f0, %f4, %f0
140         fxor    %f2, %f6, %f2
141         CAMELLIA_F(24, 2, 0, 2)
142         CAMELLIA_F(26, 0, 2, 0)
143         std     %f0, [%o1 + 0x10]       ! k[ 4,  5]
144         std     %f2, [%o1 + 0x18]       ! k[ 6,  7]
145         MOVDTOX_F0_O4
146         MOVDTOX_F2_O5
147         ROTL128(%o4, %o5, %g2, %g3, 30)
148         stx     %o4, [%o1 + 0x50]       ! k[20, 21]
149         stx     %o5, [%o1 + 0x58]       ! k[22, 23]
150         ROTL128(%o4, %o5, %g2, %g3, 30)
151         stx     %o4, [%o1 + 0xa0]       ! k[40, 41]
152         stx     %o5, [%o1 + 0xa8]       ! k[42, 43]
153         ROTL128(%o4, %o5, %g2, %g3, 51)
154         stx     %o4, [%o1 + 0x100]      ! k[64, 65]
155         stx     %o5, [%o1 + 0x108]      ! k[66, 67]
156         ldx     [%o1 + 0x20], %o4       ! k[ 8,  9]
157         ldx     [%o1 + 0x28], %o5       ! k[10, 11]
158         ROTL128(%o4, %o5, %g2, %g3, 15)
159         stx     %o4, [%o1 + 0x20]       ! k[ 8,  9]
160         stx     %o5, [%o1 + 0x28]       ! k[10, 11]
161         ROTL128(%o4, %o5, %g2, %g3, 15)
162         stx     %o4, [%o1 + 0x40]       ! k[16, 17]
163         stx     %o5, [%o1 + 0x48]       ! k[18, 19]
164         ROTL128(%o4, %o5, %g2, %g3, 30)
165         stx     %o4, [%o1 + 0x90]       ! k[36, 37]
166         stx     %o5, [%o1 + 0x98]       ! k[38, 39]
167         ROTL128(%o4, %o5, %g2, %g3, 34)
168         stx     %o4, [%o1 + 0xd0]       ! k[52, 53]
169         stx     %o5, [%o1 + 0xd8]       ! k[54, 55]
170         ldx     [%o1 + 0x30], %o4       ! k[12, 13]
171         ldx     [%o1 + 0x38], %o5       ! k[14, 15]
172         ROTL128(%o4, %o5, %g2, %g3, 15)
173         stx     %o4, [%o1 + 0x30]       ! k[12, 13]
174         stx     %o5, [%o1 + 0x38]       ! k[14, 15]
175         ROTL128(%o4, %o5, %g2, %g3, 30)
176         stx     %o4, [%o1 + 0x70]       ! k[28, 29]
177         stx     %o5, [%o1 + 0x78]       ! k[30, 31]
178         srlx    %o4, 32, %g2
179         srlx    %o5, 32, %g3
180         stw     %o4, [%o1 + 0xc0]       ! k[48]
181         stw     %g3, [%o1 + 0xc4]       ! k[49]
182         stw     %o5, [%o1 + 0xc8]       ! k[50]
183         stw     %g2, [%o1 + 0xcc]       ! k[51]
184         ROTL128(%o4, %o5, %g2, %g3, 49)
185         stx     %o4, [%o1 + 0xe0]       ! k[56, 57]
186         stx     %o5, [%o1 + 0xe8]       ! k[58, 59]
187         ldx     [%o1 + 0x00], %o4       ! k[ 0,  1]
188         ldx     [%o1 + 0x08], %o5       ! k[ 2,  3]
189         ROTL128(%o4, %o5, %g2, %g3, 45)
190         stx     %o4, [%o1 + 0x60]       ! k[24, 25]
191         stx     %o5, [%o1 + 0x68]       ! k[26, 27]
192         ROTL128(%o4, %o5, %g2, %g3, 15)
193         stx     %o4, [%o1 + 0x80]       ! k[32, 33]
194         stx     %o5, [%o1 + 0x88]       ! k[34, 35]
195         ROTL128(%o4, %o5, %g2, %g3, 17)
196         stx     %o4, [%o1 + 0xb0]       ! k[44, 45]
197         stx     %o5, [%o1 + 0xb8]       ! k[46, 47]
198         ROTL128(%o4, %o5, %g2, %g3, 34)
199         stx     %o4, [%o1 + 0xf0]       ! k[60, 61]
200         stx     %o5, [%o1 + 0xf8]       ! k[62, 63]
201         mov     (4 * 16 * 4), %o0
202 2:
203         add     %o1, %o0, %o1
204         ldd     [%o1 + 0x00], %f0
205         ldd     [%o1 + 0x08], %f2
206         std     %f0, [%o3 + 0x00]
207         std     %f2, [%o3 + 0x08]
208         add     %o3, 0x10, %o3
209 1:
210         sub     %o1, (16 * 4), %o1
211         ldd     [%o1 + 0x38], %f0
212         ldd     [%o1 + 0x30], %f2
213         ldd     [%o1 + 0x28], %f4
214         ldd     [%o1 + 0x20], %f6
215         ldd     [%o1 + 0x18], %f8
216         ldd     [%o1 + 0x10], %f10
217         std     %f0, [%o3 + 0x00]
218         std     %f2, [%o3 + 0x08]
219         std     %f4, [%o3 + 0x10]
220         std     %f6, [%o3 + 0x18]
221         std     %f8, [%o3 + 0x20]
222         std     %f10, [%o3 + 0x28]
223
224         ldd     [%o1 + 0x08], %f0
225         ldd     [%o1 + 0x00], %f2
226         std     %f0, [%o3 + 0x30]
227         std     %f2, [%o3 + 0x38]
228         subcc   %o0, (16 * 4), %o0
229         bne,pt  %icc, 1b
230          add    %o3, (16 * 4), %o3
231
232         std     %f2, [%o3 - 0x10]
233         std     %f0, [%o3 - 0x08]
234
235         retl
236          VISExit
237 ENDPROC(camellia_sparc64_key_expand)
238
239         .align  32
240 ENTRY(camellia_sparc64_crypt)
241         /* %o0=key, %o1=input, %o2=output, %o3=key_len */
242         VISEntry
243
244         ld      [%o1 + 0x00], %f0
245         ld      [%o1 + 0x04], %f1
246         ld      [%o1 + 0x08], %f2
247         ld      [%o1 + 0x0c], %f3
248
249         ldd     [%o0 + 0x00], %f4
250         ldd     [%o0 + 0x08], %f6
251
252         cmp     %o3, 16
253         fxor    %f4, %f0, %f0
254         be      1f
255          fxor   %f6, %f2, %f2
256
257         ldd     [%o0 + 0x10], %f8
258         ldd     [%o0 + 0x18], %f10
259         ldd     [%o0 + 0x20], %f12
260         ldd     [%o0 + 0x28], %f14
261         ldd     [%o0 + 0x30], %f16
262         ldd     [%o0 + 0x38], %f18
263         ldd     [%o0 + 0x40], %f20
264         ldd     [%o0 + 0x48], %f22
265         add     %o0, 0x40, %o0
266
267         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
268
269 1:
270         ldd     [%o0 + 0x10], %f8
271         ldd     [%o0 + 0x18], %f10
272         ldd     [%o0 + 0x20], %f12
273         ldd     [%o0 + 0x28], %f14
274         ldd     [%o0 + 0x30], %f16
275         ldd     [%o0 + 0x38], %f18
276         ldd     [%o0 + 0x40], %f20
277         ldd     [%o0 + 0x48], %f22
278         ldd     [%o0 + 0x50], %f24
279         ldd     [%o0 + 0x58], %f26
280         ldd     [%o0 + 0x60], %f28
281         ldd     [%o0 + 0x68], %f30
282         ldd     [%o0 + 0x70], %f32
283         ldd     [%o0 + 0x78], %f34
284         ldd     [%o0 + 0x80], %f36
285         ldd     [%o0 + 0x88], %f38
286         ldd     [%o0 + 0x90], %f40
287         ldd     [%o0 + 0x98], %f42
288         ldd     [%o0 + 0xa0], %f44
289         ldd     [%o0 + 0xa8], %f46
290         ldd     [%o0 + 0xb0], %f48
291         ldd     [%o0 + 0xb8], %f50
292         ldd     [%o0 + 0xc0], %f52
293         ldd     [%o0 + 0xc8], %f54
294
295         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
296         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
297         CAMELLIA_6ROUNDS(40, 0, 2)
298         fxor    %f52, %f2, %f2
299         fxor    %f54, %f0, %f0
300
301         st      %f2, [%o2 + 0x00]
302         st      %f3, [%o2 + 0x04]
303         st      %f0, [%o2 + 0x08]
304         st      %f1, [%o2 + 0x0c]
305
306         retl
307          VISExit
308 ENDPROC(camellia_sparc64_crypt)
309
310         .align  32
311 ENTRY(camellia_sparc64_load_keys)
312         /* %o0=key, %o1=key_len */
313         VISEntry
314         ldd     [%o0 + 0x00], %f4
315         ldd     [%o0 + 0x08], %f6
316         ldd     [%o0 + 0x10], %f8
317         ldd     [%o0 + 0x18], %f10
318         ldd     [%o0 + 0x20], %f12
319         ldd     [%o0 + 0x28], %f14
320         ldd     [%o0 + 0x30], %f16
321         ldd     [%o0 + 0x38], %f18
322         ldd     [%o0 + 0x40], %f20
323         ldd     [%o0 + 0x48], %f22
324         ldd     [%o0 + 0x50], %f24
325         ldd     [%o0 + 0x58], %f26
326         ldd     [%o0 + 0x60], %f28
327         ldd     [%o0 + 0x68], %f30
328         ldd     [%o0 + 0x70], %f32
329         ldd     [%o0 + 0x78], %f34
330         ldd     [%o0 + 0x80], %f36
331         ldd     [%o0 + 0x88], %f38
332         ldd     [%o0 + 0x90], %f40
333         ldd     [%o0 + 0x98], %f42
334         ldd     [%o0 + 0xa0], %f44
335         ldd     [%o0 + 0xa8], %f46
336         ldd     [%o0 + 0xb0], %f48
337         ldd     [%o0 + 0xb8], %f50
338         ldd     [%o0 + 0xc0], %f52
339         retl
340          ldd    [%o0 + 0xc8], %f54
341 ENDPROC(camellia_sparc64_load_keys)
342
343         .align  32
344 ENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds)
345         /* %o0=input, %o1=output, %o2=len, %o3=key */
346 1:      ldd     [%o0 + 0x00], %f0
347         ldd     [%o0 + 0x08], %f2
348         add     %o0, 0x10, %o0
349         fxor    %f4, %f0, %f0
350         fxor    %f6, %f2, %f2
351         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
352         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
353         CAMELLIA_6ROUNDS(40, 0, 2)
354         fxor    %f52, %f2, %f2
355         fxor    %f54, %f0, %f0
356         std     %f2, [%o1 + 0x00]
357         std     %f0, [%o1 + 0x08]
358         subcc   %o2, 0x10, %o2
359         bne,pt  %icc, 1b
360          add    %o1, 0x10, %o1
361         retl
362          nop
363 ENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds)
364
365         .align  32
366 ENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds)
367         /* %o0=input, %o1=output, %o2=len, %o3=key */
368 1:      ldd     [%o0 + 0x00], %f0
369         ldd     [%o0 + 0x08], %f2
370         add     %o0, 0x10, %o0
371         fxor    %f4, %f0, %f0
372         fxor    %f6, %f2, %f2
373         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
374         ldd     [%o3 + 0xd0], %f8
375         ldd     [%o3 + 0xd8], %f10
376         ldd     [%o3 + 0xe0], %f12
377         ldd     [%o3 + 0xe8], %f14
378         ldd     [%o3 + 0xf0], %f16
379         ldd     [%o3 + 0xf8], %f18
380         ldd     [%o3 + 0x100], %f20
381         ldd     [%o3 + 0x108], %f22
382         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
383         CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
384         CAMELLIA_F(8, 2, 0, 2)
385         CAMELLIA_F(10, 0, 2, 0)
386         ldd     [%o3 + 0x10], %f8
387         ldd     [%o3 + 0x18], %f10
388         CAMELLIA_F(12, 2, 0, 2)
389         CAMELLIA_F(14, 0, 2, 0)
390         ldd     [%o3 + 0x20], %f12
391         ldd     [%o3 + 0x28], %f14
392         CAMELLIA_F(16, 2, 0, 2)
393         CAMELLIA_F(18, 0, 2, 0)
394         ldd     [%o3 + 0x30], %f16
395         ldd     [%o3 + 0x38], %f18
396         fxor    %f20, %f2, %f2
397         fxor    %f22, %f0, %f0
398         ldd     [%o3 + 0x40], %f20
399         ldd     [%o3 + 0x48], %f22
400         std     %f2, [%o1 + 0x00]
401         std     %f0, [%o1 + 0x08]
402         subcc   %o2, 0x10, %o2
403         bne,pt  %icc, 1b
404          add    %o1, 0x10, %o1
405         retl
406          nop
407 ENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds)
408
409         .align  32
410 ENTRY(camellia_sparc64_cbc_encrypt_3_grand_rounds)
411         /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
412         ldd     [%o4 + 0x00], %f60
413         ldd     [%o4 + 0x08], %f62
414 1:      ldd     [%o0 + 0x00], %f0
415         ldd     [%o0 + 0x08], %f2
416         add     %o0, 0x10, %o0
417         fxor    %f60, %f0, %f0
418         fxor    %f62, %f2, %f2
419         fxor    %f4, %f0, %f0
420         fxor    %f6, %f2, %f2
421         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
422         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
423         CAMELLIA_6ROUNDS(40, 0, 2)
424         fxor    %f52, %f2, %f60
425         fxor    %f54, %f0, %f62
426         std     %f60, [%o1 + 0x00]
427         std     %f62, [%o1 + 0x08]
428         subcc   %o2, 0x10, %o2
429         bne,pt  %icc, 1b
430          add    %o1, 0x10, %o1
431         std     %f60, [%o4 + 0x00]
432         retl
433          std    %f62, [%o4 + 0x08]
434 ENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds)
435
436         .align  32
437 ENTRY(camellia_sparc64_cbc_encrypt_4_grand_rounds)
438         /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
439         ldd     [%o4 + 0x00], %f60
440         ldd     [%o4 + 0x08], %f62
441 1:      ldd     [%o0 + 0x00], %f0
442         ldd     [%o0 + 0x08], %f2
443         add     %o0, 0x10, %o0
444         fxor    %f60, %f0, %f0
445         fxor    %f62, %f2, %f2
446         fxor    %f4, %f0, %f0
447         fxor    %f6, %f2, %f2
448         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
449         ldd     [%o3 + 0xd0], %f8
450         ldd     [%o3 + 0xd8], %f10
451         ldd     [%o3 + 0xe0], %f12
452         ldd     [%o3 + 0xe8], %f14
453         ldd     [%o3 + 0xf0], %f16
454         ldd     [%o3 + 0xf8], %f18
455         ldd     [%o3 + 0x100], %f20
456         ldd     [%o3 + 0x108], %f22
457         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
458         CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
459         CAMELLIA_F(8, 2, 0, 2)
460         CAMELLIA_F(10, 0, 2, 0)
461         ldd     [%o3 + 0x10], %f8
462         ldd     [%o3 + 0x18], %f10
463         CAMELLIA_F(12, 2, 0, 2)
464         CAMELLIA_F(14, 0, 2, 0)
465         ldd     [%o3 + 0x20], %f12
466         ldd     [%o3 + 0x28], %f14
467         CAMELLIA_F(16, 2, 0, 2)
468         CAMELLIA_F(18, 0, 2, 0)
469         ldd     [%o3 + 0x30], %f16
470         ldd     [%o3 + 0x38], %f18
471         fxor    %f20, %f2, %f60
472         fxor    %f22, %f0, %f62
473         ldd     [%o3 + 0x40], %f20
474         ldd     [%o3 + 0x48], %f22
475         std     %f60, [%o1 + 0x00]
476         std     %f62, [%o1 + 0x08]
477         subcc   %o2, 0x10, %o2
478         bne,pt  %icc, 1b
479          add    %o1, 0x10, %o1
480         std     %f60, [%o4 + 0x00]
481         retl
482          std    %f62, [%o4 + 0x08]
483 ENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds)
484
485         .align  32
486 ENTRY(camellia_sparc64_cbc_decrypt_3_grand_rounds)
487         /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
488         ldd     [%o4 + 0x00], %f60
489         ldd     [%o4 + 0x08], %f62
490 1:      ldd     [%o0 + 0x00], %f56
491         ldd     [%o0 + 0x08], %f58
492         add     %o0, 0x10, %o0
493         fxor    %f4, %f56, %f0
494         fxor    %f6, %f58, %f2
495         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
496         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
497         CAMELLIA_6ROUNDS(40, 0, 2)
498         fxor    %f52, %f2, %f2
499         fxor    %f54, %f0, %f0
500         fxor    %f60, %f2, %f2
501         fxor    %f62, %f0, %f0
502         fsrc2   %f56, %f60
503         fsrc2   %f58, %f62
504         std     %f2, [%o1 + 0x00]
505         std     %f0, [%o1 + 0x08]
506         subcc   %o2, 0x10, %o2
507         bne,pt  %icc, 1b
508          add    %o1, 0x10, %o1
509         std     %f60, [%o4 + 0x00]
510         retl
511          std    %f62, [%o4 + 0x08]
512 ENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds)
513
514         .align  32
515 ENTRY(camellia_sparc64_cbc_decrypt_4_grand_rounds)
516         /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
517         ldd     [%o4 + 0x00], %f60
518         ldd     [%o4 + 0x08], %f62
519 1:      ldd     [%o0 + 0x00], %f56
520         ldd     [%o0 + 0x08], %f58
521         add     %o0, 0x10, %o0
522         fxor    %f4, %f56, %f0
523         fxor    %f6, %f58, %f2
524         CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
525         ldd     [%o3 + 0xd0], %f8
526         ldd     [%o3 + 0xd8], %f10
527         ldd     [%o3 + 0xe0], %f12
528         ldd     [%o3 + 0xe8], %f14
529         ldd     [%o3 + 0xf0], %f16
530         ldd     [%o3 + 0xf8], %f18
531         ldd     [%o3 + 0x100], %f20
532         ldd     [%o3 + 0x108], %f22
533         CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
534         CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
535         CAMELLIA_F(8, 2, 0, 2)
536         CAMELLIA_F(10, 0, 2, 0)
537         ldd     [%o3 + 0x10], %f8
538         ldd     [%o3 + 0x18], %f10
539         CAMELLIA_F(12, 2, 0, 2)
540         CAMELLIA_F(14, 0, 2, 0)
541         ldd     [%o3 + 0x20], %f12
542         ldd     [%o3 + 0x28], %f14
543         CAMELLIA_F(16, 2, 0, 2)
544         CAMELLIA_F(18, 0, 2, 0)
545         ldd     [%o3 + 0x30], %f16
546         ldd     [%o3 + 0x38], %f18
547         fxor    %f20, %f2, %f2
548         fxor    %f22, %f0, %f0
549         ldd     [%o3 + 0x40], %f20
550         ldd     [%o3 + 0x48], %f22
551         fxor    %f60, %f2, %f2
552         fxor    %f62, %f0, %f0
553         fsrc2   %f56, %f60
554         fsrc2   %f58, %f62
555         std     %f2, [%o1 + 0x00]
556         std     %f0, [%o1 + 0x08]
557         subcc   %o2, 0x10, %o2
558         bne,pt  %icc, 1b
559          add    %o1, 0x10, %o1
560         std     %f60, [%o4 + 0x00]
561         retl
562          std    %f62, [%o4 + 0x08]
563 ENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds)