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