Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #include <linux/linkage.h>
0003 #include <asm/visasm.h>
0004 
0005 #include "opcodes.h"
0006 
0007 #define CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
0008     CAMELLIA_F(KEY_BASE +  0, I1, I0, I1) \
0009     CAMELLIA_F(KEY_BASE +  2, I0, I1, I0) \
0010     CAMELLIA_F(KEY_BASE +  4, I1, I0, I1) \
0011     CAMELLIA_F(KEY_BASE +  6, I0, I1, I0) \
0012     CAMELLIA_F(KEY_BASE +  8, I1, I0, I1) \
0013     CAMELLIA_F(KEY_BASE + 10, I0, I1, I0)
0014 
0015 #define CAMELLIA_6ROUNDS_FL_FLI(KEY_BASE, I0, I1) \
0016     CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
0017     CAMELLIA_FL(KEY_BASE + 12, I0, I0) \
0018     CAMELLIA_FLI(KEY_BASE + 14, I1, I1)
0019 
0020     .data
0021 
0022     .align  8
0023 SIGMA:  .xword  0xA09E667F3BCC908B
0024     .xword  0xB67AE8584CAA73B2
0025     .xword  0xC6EF372FE94F82BE
0026     .xword  0x54FF53A5F1D36F1C
0027     .xword  0x10E527FADE682D1D
0028     .xword  0xB05688C2B3E6C1FD
0029 
0030     .text
0031 
0032     .align  32
0033 ENTRY(camellia_sparc64_key_expand)
0034     /* %o0=in_key, %o1=encrypt_key, %o2=key_len, %o3=decrypt_key */
0035     VISEntry
0036     ld  [%o0 + 0x00], %f0   ! i0, k[0]
0037     ld  [%o0 + 0x04], %f1   ! i1, k[1]
0038     ld  [%o0 + 0x08], %f2   ! i2, k[2]
0039     ld  [%o0 + 0x0c], %f3   ! i3, k[3]
0040     std %f0, [%o1 + 0x00]   ! k[0, 1]
0041     fsrc2   %f0, %f28
0042     std %f2, [%o1 + 0x08]   ! k[2, 3]
0043     cmp %o2, 16
0044     be  10f
0045      fsrc2  %f2, %f30
0046 
0047     ld  [%o0 + 0x10], %f0
0048     ld  [%o0 + 0x14], %f1
0049     std %f0, [%o1 + 0x20]   ! k[8, 9]
0050     cmp %o2, 24
0051     fone    %f10
0052     be,a    1f
0053      fxor   %f10, %f0, %f2
0054     ld  [%o0 + 0x18], %f2
0055     ld  [%o0 + 0x1c], %f3
0056 1:
0057     std %f2, [%o1 + 0x28]   ! k[10, 11]
0058     fxor    %f28, %f0, %f0
0059     fxor    %f30, %f2, %f2
0060 
0061 10:
0062     sethi   %hi(SIGMA), %g3
0063     or  %g3, %lo(SIGMA), %g3
0064     ldd [%g3 + 0x00], %f16
0065     ldd [%g3 + 0x08], %f18
0066     ldd [%g3 + 0x10], %f20
0067     ldd [%g3 + 0x18], %f22
0068     ldd [%g3 + 0x20], %f24
0069     ldd [%g3 + 0x28], %f26
0070     CAMELLIA_F(16, 2, 0, 2)
0071     CAMELLIA_F(18, 0, 2, 0)
0072     fxor    %f28, %f0, %f0
0073     fxor    %f30, %f2, %f2
0074     CAMELLIA_F(20, 2, 0, 2)
0075     CAMELLIA_F(22, 0, 2, 0)
0076 
0077 #define ROTL128(S01, S23, TMP1, TMP2, N)    \
0078     srlx    S01, (64 - N), TMP1;        \
0079     sllx    S01, N, S01;            \
0080     srlx    S23, (64 - N), TMP2;        \
0081     sllx    S23, N, S23;            \
0082     or  S01, TMP2, S01;         \
0083     or  S23, TMP1, S23
0084 
0085     cmp %o2, 16
0086     bne 1f
0087      nop
0088     /* 128-bit key */
0089     std %f0, [%o1 + 0x10]   ! k[ 4,  5]
0090     std %f2, [%o1 + 0x18]   ! k[ 6,  7]
0091     MOVDTOX_F0_O4
0092     MOVDTOX_F2_O5
0093     ROTL128(%o4, %o5, %g2, %g3, 15)
0094     stx %o4, [%o1 + 0x30]   ! k[12, 13]
0095     stx %o5, [%o1 + 0x38]   ! k[14, 15]
0096     ROTL128(%o4, %o5, %g2, %g3, 15)
0097     stx %o4, [%o1 + 0x40]   ! k[16, 17]
0098     stx %o5, [%o1 + 0x48]   ! k[18, 19]
0099     ROTL128(%o4, %o5, %g2, %g3, 15)
0100     stx %o4, [%o1 + 0x60]   ! k[24, 25]
0101     ROTL128(%o4, %o5, %g2, %g3, 15)
0102     stx %o4, [%o1 + 0x70]   ! k[28, 29]
0103     stx %o5, [%o1 + 0x78]   ! k[30, 31]
0104     ROTL128(%o4, %o5, %g2, %g3, 34)
0105     stx %o4, [%o1 + 0xa0]   ! k[40, 41]
0106     stx %o5, [%o1 + 0xa8]   ! k[42, 43]
0107     ROTL128(%o4, %o5, %g2, %g3, 17)
0108     stx %o4, [%o1 + 0xc0]   ! k[48, 49]
0109     stx %o5, [%o1 + 0xc8]   ! k[50, 51]
0110 
0111     ldx [%o1 + 0x00], %o4   ! k[ 0,  1]
0112     ldx [%o1 + 0x08], %o5   ! k[ 2,  3]
0113     ROTL128(%o4, %o5, %g2, %g3, 15)
0114     stx %o4, [%o1 + 0x20]   ! k[ 8,  9]
0115     stx %o5, [%o1 + 0x28]   ! k[10, 11]
0116     ROTL128(%o4, %o5, %g2, %g3, 30)
0117     stx %o4, [%o1 + 0x50]   ! k[20, 21]
0118     stx %o5, [%o1 + 0x58]   ! k[22, 23]
0119     ROTL128(%o4, %o5, %g2, %g3, 15)
0120     stx %o5, [%o1 + 0x68]   ! k[26, 27]
0121     ROTL128(%o4, %o5, %g2, %g3, 17)
0122     stx %o4, [%o1 + 0x80]   ! k[32, 33]
0123     stx %o5, [%o1 + 0x88]   ! k[34, 35]
0124     ROTL128(%o4, %o5, %g2, %g3, 17)
0125     stx %o4, [%o1 + 0x90]   ! k[36, 37]
0126     stx %o5, [%o1 + 0x98]   ! k[38, 39]
0127     ROTL128(%o4, %o5, %g2, %g3, 17)
0128     stx %o4, [%o1 + 0xb0]   ! k[44, 45]
0129     stx %o5, [%o1 + 0xb8]   ! k[46, 47]
0130 
0131     ba,pt   %xcc, 2f
0132      mov    (3 * 16 * 4), %o0
0133 
0134 1:
0135     /* 192-bit or 256-bit key */
0136     std %f0, [%o1 + 0x30]   ! k[12, 13]
0137     std %f2, [%o1 + 0x38]   ! k[14, 15]
0138     ldd [%o1 + 0x20], %f4   ! k[ 8,  9]
0139     ldd [%o1 + 0x28], %f6   ! k[10, 11]
0140     fxor    %f0, %f4, %f0
0141     fxor    %f2, %f6, %f2
0142     CAMELLIA_F(24, 2, 0, 2)
0143     CAMELLIA_F(26, 0, 2, 0)
0144     std %f0, [%o1 + 0x10]   ! k[ 4,  5]
0145     std %f2, [%o1 + 0x18]   ! k[ 6,  7]
0146     MOVDTOX_F0_O4
0147     MOVDTOX_F2_O5
0148     ROTL128(%o4, %o5, %g2, %g3, 30)
0149     stx %o4, [%o1 + 0x50]   ! k[20, 21]
0150     stx %o5, [%o1 + 0x58]   ! k[22, 23]
0151     ROTL128(%o4, %o5, %g2, %g3, 30)
0152     stx %o4, [%o1 + 0xa0]   ! k[40, 41]
0153     stx %o5, [%o1 + 0xa8]   ! k[42, 43]
0154     ROTL128(%o4, %o5, %g2, %g3, 51)
0155     stx %o4, [%o1 + 0x100]  ! k[64, 65]
0156     stx %o5, [%o1 + 0x108]  ! k[66, 67]
0157     ldx [%o1 + 0x20], %o4   ! k[ 8,  9]
0158     ldx [%o1 + 0x28], %o5   ! k[10, 11]
0159     ROTL128(%o4, %o5, %g2, %g3, 15)
0160     stx %o4, [%o1 + 0x20]   ! k[ 8,  9]
0161     stx %o5, [%o1 + 0x28]   ! k[10, 11]
0162     ROTL128(%o4, %o5, %g2, %g3, 15)
0163     stx %o4, [%o1 + 0x40]   ! k[16, 17]
0164     stx %o5, [%o1 + 0x48]   ! k[18, 19]
0165     ROTL128(%o4, %o5, %g2, %g3, 30)
0166     stx %o4, [%o1 + 0x90]   ! k[36, 37]
0167     stx %o5, [%o1 + 0x98]   ! k[38, 39]
0168     ROTL128(%o4, %o5, %g2, %g3, 34)
0169     stx %o4, [%o1 + 0xd0]   ! k[52, 53]
0170     stx %o5, [%o1 + 0xd8]   ! k[54, 55]
0171     ldx [%o1 + 0x30], %o4   ! k[12, 13]
0172     ldx [%o1 + 0x38], %o5   ! k[14, 15]
0173     ROTL128(%o4, %o5, %g2, %g3, 15)
0174     stx %o4, [%o1 + 0x30]   ! k[12, 13]
0175     stx %o5, [%o1 + 0x38]   ! k[14, 15]
0176     ROTL128(%o4, %o5, %g2, %g3, 30)
0177     stx %o4, [%o1 + 0x70]   ! k[28, 29]
0178     stx %o5, [%o1 + 0x78]   ! k[30, 31]
0179     srlx    %o4, 32, %g2
0180     srlx    %o5, 32, %g3
0181     stw %o4, [%o1 + 0xc0]   ! k[48]
0182     stw %g3, [%o1 + 0xc4]   ! k[49]
0183     stw %o5, [%o1 + 0xc8]   ! k[50]
0184     stw %g2, [%o1 + 0xcc]   ! k[51]
0185     ROTL128(%o4, %o5, %g2, %g3, 49)
0186     stx %o4, [%o1 + 0xe0]   ! k[56, 57]
0187     stx %o5, [%o1 + 0xe8]   ! k[58, 59]
0188     ldx [%o1 + 0x00], %o4   ! k[ 0,  1]
0189     ldx [%o1 + 0x08], %o5   ! k[ 2,  3]
0190     ROTL128(%o4, %o5, %g2, %g3, 45)
0191     stx %o4, [%o1 + 0x60]   ! k[24, 25]
0192     stx %o5, [%o1 + 0x68]   ! k[26, 27]
0193     ROTL128(%o4, %o5, %g2, %g3, 15)
0194     stx %o4, [%o1 + 0x80]   ! k[32, 33]
0195     stx %o5, [%o1 + 0x88]   ! k[34, 35]
0196     ROTL128(%o4, %o5, %g2, %g3, 17)
0197     stx %o4, [%o1 + 0xb0]   ! k[44, 45]
0198     stx %o5, [%o1 + 0xb8]   ! k[46, 47]
0199     ROTL128(%o4, %o5, %g2, %g3, 34)
0200     stx %o4, [%o1 + 0xf0]   ! k[60, 61]
0201     stx %o5, [%o1 + 0xf8]   ! k[62, 63]
0202     mov (4 * 16 * 4), %o0
0203 2:
0204     add %o1, %o0, %o1
0205     ldd [%o1 + 0x00], %f0
0206     ldd [%o1 + 0x08], %f2
0207     std %f0, [%o3 + 0x00]
0208     std %f2, [%o3 + 0x08]
0209     add %o3, 0x10, %o3
0210 1:
0211     sub %o1, (16 * 4), %o1
0212     ldd [%o1 + 0x38], %f0
0213     ldd [%o1 + 0x30], %f2
0214     ldd [%o1 + 0x28], %f4
0215     ldd [%o1 + 0x20], %f6
0216     ldd [%o1 + 0x18], %f8
0217     ldd [%o1 + 0x10], %f10
0218     std %f0, [%o3 + 0x00]
0219     std %f2, [%o3 + 0x08]
0220     std %f4, [%o3 + 0x10]
0221     std %f6, [%o3 + 0x18]
0222     std %f8, [%o3 + 0x20]
0223     std %f10, [%o3 + 0x28]
0224 
0225     ldd [%o1 + 0x08], %f0
0226     ldd [%o1 + 0x00], %f2
0227     std %f0, [%o3 + 0x30]
0228     std %f2, [%o3 + 0x38]
0229     subcc   %o0, (16 * 4), %o0
0230     bne,pt  %icc, 1b
0231      add    %o3, (16 * 4), %o3
0232 
0233     std %f2, [%o3 - 0x10]
0234     std %f0, [%o3 - 0x08]
0235 
0236     retl
0237      VISExit
0238 ENDPROC(camellia_sparc64_key_expand)
0239 
0240     .align  32
0241 ENTRY(camellia_sparc64_crypt)
0242     /* %o0=key, %o1=input, %o2=output, %o3=key_len */
0243     VISEntry
0244 
0245     ld  [%o1 + 0x00], %f0
0246     ld  [%o1 + 0x04], %f1
0247     ld  [%o1 + 0x08], %f2
0248     ld  [%o1 + 0x0c], %f3
0249 
0250     ldd [%o0 + 0x00], %f4
0251     ldd [%o0 + 0x08], %f6
0252 
0253     cmp %o3, 16
0254     fxor    %f4, %f0, %f0
0255     be  1f
0256      fxor   %f6, %f2, %f2
0257 
0258     ldd [%o0 + 0x10], %f8
0259     ldd [%o0 + 0x18], %f10
0260     ldd [%o0 + 0x20], %f12
0261     ldd [%o0 + 0x28], %f14
0262     ldd [%o0 + 0x30], %f16
0263     ldd [%o0 + 0x38], %f18
0264     ldd [%o0 + 0x40], %f20
0265     ldd [%o0 + 0x48], %f22
0266     add %o0, 0x40, %o0
0267 
0268     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0269 
0270 1:
0271     ldd [%o0 + 0x10], %f8
0272     ldd [%o0 + 0x18], %f10
0273     ldd [%o0 + 0x20], %f12
0274     ldd [%o0 + 0x28], %f14
0275     ldd [%o0 + 0x30], %f16
0276     ldd [%o0 + 0x38], %f18
0277     ldd [%o0 + 0x40], %f20
0278     ldd [%o0 + 0x48], %f22
0279     ldd [%o0 + 0x50], %f24
0280     ldd [%o0 + 0x58], %f26
0281     ldd [%o0 + 0x60], %f28
0282     ldd [%o0 + 0x68], %f30
0283     ldd [%o0 + 0x70], %f32
0284     ldd [%o0 + 0x78], %f34
0285     ldd [%o0 + 0x80], %f36
0286     ldd [%o0 + 0x88], %f38
0287     ldd [%o0 + 0x90], %f40
0288     ldd [%o0 + 0x98], %f42
0289     ldd [%o0 + 0xa0], %f44
0290     ldd [%o0 + 0xa8], %f46
0291     ldd [%o0 + 0xb0], %f48
0292     ldd [%o0 + 0xb8], %f50
0293     ldd [%o0 + 0xc0], %f52
0294     ldd [%o0 + 0xc8], %f54
0295 
0296     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0297     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0298     CAMELLIA_6ROUNDS(40, 0, 2)
0299     fxor    %f52, %f2, %f2
0300     fxor    %f54, %f0, %f0
0301 
0302     st  %f2, [%o2 + 0x00]
0303     st  %f3, [%o2 + 0x04]
0304     st  %f0, [%o2 + 0x08]
0305     st  %f1, [%o2 + 0x0c]
0306 
0307     retl
0308      VISExit
0309 ENDPROC(camellia_sparc64_crypt)
0310 
0311     .align  32
0312 ENTRY(camellia_sparc64_load_keys)
0313     /* %o0=key, %o1=key_len */
0314     VISEntry
0315     ldd [%o0 + 0x00], %f4
0316     ldd [%o0 + 0x08], %f6
0317     ldd [%o0 + 0x10], %f8
0318     ldd [%o0 + 0x18], %f10
0319     ldd [%o0 + 0x20], %f12
0320     ldd [%o0 + 0x28], %f14
0321     ldd [%o0 + 0x30], %f16
0322     ldd [%o0 + 0x38], %f18
0323     ldd [%o0 + 0x40], %f20
0324     ldd [%o0 + 0x48], %f22
0325     ldd [%o0 + 0x50], %f24
0326     ldd [%o0 + 0x58], %f26
0327     ldd [%o0 + 0x60], %f28
0328     ldd [%o0 + 0x68], %f30
0329     ldd [%o0 + 0x70], %f32
0330     ldd [%o0 + 0x78], %f34
0331     ldd [%o0 + 0x80], %f36
0332     ldd [%o0 + 0x88], %f38
0333     ldd [%o0 + 0x90], %f40
0334     ldd [%o0 + 0x98], %f42
0335     ldd [%o0 + 0xa0], %f44
0336     ldd [%o0 + 0xa8], %f46
0337     ldd [%o0 + 0xb0], %f48
0338     ldd [%o0 + 0xb8], %f50
0339     ldd [%o0 + 0xc0], %f52
0340     retl
0341      ldd    [%o0 + 0xc8], %f54
0342 ENDPROC(camellia_sparc64_load_keys)
0343 
0344     .align  32
0345 ENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds)
0346     /* %o0=input, %o1=output, %o2=len, %o3=key */
0347 1:  ldd [%o0 + 0x00], %f0
0348     ldd [%o0 + 0x08], %f2
0349     add %o0, 0x10, %o0
0350     fxor    %f4, %f0, %f0
0351     fxor    %f6, %f2, %f2
0352     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0353     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0354     CAMELLIA_6ROUNDS(40, 0, 2)
0355     fxor    %f52, %f2, %f2
0356     fxor    %f54, %f0, %f0
0357     std %f2, [%o1 + 0x00]
0358     std %f0, [%o1 + 0x08]
0359     subcc   %o2, 0x10, %o2
0360     bne,pt  %icc, 1b
0361      add    %o1, 0x10, %o1
0362     retl
0363      nop
0364 ENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds)
0365 
0366     .align  32
0367 ENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds)
0368     /* %o0=input, %o1=output, %o2=len, %o3=key */
0369 1:  ldd [%o0 + 0x00], %f0
0370     ldd [%o0 + 0x08], %f2
0371     add %o0, 0x10, %o0
0372     fxor    %f4, %f0, %f0
0373     fxor    %f6, %f2, %f2
0374     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0375     ldd [%o3 + 0xd0], %f8
0376     ldd [%o3 + 0xd8], %f10
0377     ldd [%o3 + 0xe0], %f12
0378     ldd [%o3 + 0xe8], %f14
0379     ldd [%o3 + 0xf0], %f16
0380     ldd [%o3 + 0xf8], %f18
0381     ldd [%o3 + 0x100], %f20
0382     ldd [%o3 + 0x108], %f22
0383     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0384     CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
0385     CAMELLIA_F(8, 2, 0, 2)
0386     CAMELLIA_F(10, 0, 2, 0)
0387     ldd [%o3 + 0x10], %f8
0388     ldd [%o3 + 0x18], %f10
0389     CAMELLIA_F(12, 2, 0, 2)
0390     CAMELLIA_F(14, 0, 2, 0)
0391     ldd [%o3 + 0x20], %f12
0392     ldd [%o3 + 0x28], %f14
0393     CAMELLIA_F(16, 2, 0, 2)
0394     CAMELLIA_F(18, 0, 2, 0)
0395     ldd [%o3 + 0x30], %f16
0396     ldd [%o3 + 0x38], %f18
0397     fxor    %f20, %f2, %f2
0398     fxor    %f22, %f0, %f0
0399     ldd [%o3 + 0x40], %f20
0400     ldd [%o3 + 0x48], %f22
0401     std %f2, [%o1 + 0x00]
0402     std %f0, [%o1 + 0x08]
0403     subcc   %o2, 0x10, %o2
0404     bne,pt  %icc, 1b
0405      add    %o1, 0x10, %o1
0406     retl
0407      nop
0408 ENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds)
0409 
0410     .align  32
0411 ENTRY(camellia_sparc64_cbc_encrypt_3_grand_rounds)
0412     /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
0413     ldd [%o4 + 0x00], %f60
0414     ldd [%o4 + 0x08], %f62
0415 1:  ldd [%o0 + 0x00], %f0
0416     ldd [%o0 + 0x08], %f2
0417     add %o0, 0x10, %o0
0418     fxor    %f60, %f0, %f0
0419     fxor    %f62, %f2, %f2
0420     fxor    %f4, %f0, %f0
0421     fxor    %f6, %f2, %f2
0422     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0423     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0424     CAMELLIA_6ROUNDS(40, 0, 2)
0425     fxor    %f52, %f2, %f60
0426     fxor    %f54, %f0, %f62
0427     std %f60, [%o1 + 0x00]
0428     std %f62, [%o1 + 0x08]
0429     subcc   %o2, 0x10, %o2
0430     bne,pt  %icc, 1b
0431      add    %o1, 0x10, %o1
0432     std %f60, [%o4 + 0x00]
0433     retl
0434      std    %f62, [%o4 + 0x08]
0435 ENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds)
0436 
0437     .align  32
0438 ENTRY(camellia_sparc64_cbc_encrypt_4_grand_rounds)
0439     /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
0440     ldd [%o4 + 0x00], %f60
0441     ldd [%o4 + 0x08], %f62
0442 1:  ldd [%o0 + 0x00], %f0
0443     ldd [%o0 + 0x08], %f2
0444     add %o0, 0x10, %o0
0445     fxor    %f60, %f0, %f0
0446     fxor    %f62, %f2, %f2
0447     fxor    %f4, %f0, %f0
0448     fxor    %f6, %f2, %f2
0449     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0450     ldd [%o3 + 0xd0], %f8
0451     ldd [%o3 + 0xd8], %f10
0452     ldd [%o3 + 0xe0], %f12
0453     ldd [%o3 + 0xe8], %f14
0454     ldd [%o3 + 0xf0], %f16
0455     ldd [%o3 + 0xf8], %f18
0456     ldd [%o3 + 0x100], %f20
0457     ldd [%o3 + 0x108], %f22
0458     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0459     CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
0460     CAMELLIA_F(8, 2, 0, 2)
0461     CAMELLIA_F(10, 0, 2, 0)
0462     ldd [%o3 + 0x10], %f8
0463     ldd [%o3 + 0x18], %f10
0464     CAMELLIA_F(12, 2, 0, 2)
0465     CAMELLIA_F(14, 0, 2, 0)
0466     ldd [%o3 + 0x20], %f12
0467     ldd [%o3 + 0x28], %f14
0468     CAMELLIA_F(16, 2, 0, 2)
0469     CAMELLIA_F(18, 0, 2, 0)
0470     ldd [%o3 + 0x30], %f16
0471     ldd [%o3 + 0x38], %f18
0472     fxor    %f20, %f2, %f60
0473     fxor    %f22, %f0, %f62
0474     ldd [%o3 + 0x40], %f20
0475     ldd [%o3 + 0x48], %f22
0476     std %f60, [%o1 + 0x00]
0477     std %f62, [%o1 + 0x08]
0478     subcc   %o2, 0x10, %o2
0479     bne,pt  %icc, 1b
0480      add    %o1, 0x10, %o1
0481     std %f60, [%o4 + 0x00]
0482     retl
0483      std    %f62, [%o4 + 0x08]
0484 ENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds)
0485 
0486     .align  32
0487 ENTRY(camellia_sparc64_cbc_decrypt_3_grand_rounds)
0488     /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
0489     ldd [%o4 + 0x00], %f60
0490     ldd [%o4 + 0x08], %f62
0491 1:  ldd [%o0 + 0x00], %f56
0492     ldd [%o0 + 0x08], %f58
0493     add %o0, 0x10, %o0
0494     fxor    %f4, %f56, %f0
0495     fxor    %f6, %f58, %f2
0496     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0497     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0498     CAMELLIA_6ROUNDS(40, 0, 2)
0499     fxor    %f52, %f2, %f2
0500     fxor    %f54, %f0, %f0
0501     fxor    %f60, %f2, %f2
0502     fxor    %f62, %f0, %f0
0503     fsrc2   %f56, %f60
0504     fsrc2   %f58, %f62
0505     std %f2, [%o1 + 0x00]
0506     std %f0, [%o1 + 0x08]
0507     subcc   %o2, 0x10, %o2
0508     bne,pt  %icc, 1b
0509      add    %o1, 0x10, %o1
0510     std %f60, [%o4 + 0x00]
0511     retl
0512      std    %f62, [%o4 + 0x08]
0513 ENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds)
0514 
0515     .align  32
0516 ENTRY(camellia_sparc64_cbc_decrypt_4_grand_rounds)
0517     /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
0518     ldd [%o4 + 0x00], %f60
0519     ldd [%o4 + 0x08], %f62
0520 1:  ldd [%o0 + 0x00], %f56
0521     ldd [%o0 + 0x08], %f58
0522     add %o0, 0x10, %o0
0523     fxor    %f4, %f56, %f0
0524     fxor    %f6, %f58, %f2
0525     CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
0526     ldd [%o3 + 0xd0], %f8
0527     ldd [%o3 + 0xd8], %f10
0528     ldd [%o3 + 0xe0], %f12
0529     ldd [%o3 + 0xe8], %f14
0530     ldd [%o3 + 0xf0], %f16
0531     ldd [%o3 + 0xf8], %f18
0532     ldd [%o3 + 0x100], %f20
0533     ldd [%o3 + 0x108], %f22
0534     CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
0535     CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
0536     CAMELLIA_F(8, 2, 0, 2)
0537     CAMELLIA_F(10, 0, 2, 0)
0538     ldd [%o3 + 0x10], %f8
0539     ldd [%o3 + 0x18], %f10
0540     CAMELLIA_F(12, 2, 0, 2)
0541     CAMELLIA_F(14, 0, 2, 0)
0542     ldd [%o3 + 0x20], %f12
0543     ldd [%o3 + 0x28], %f14
0544     CAMELLIA_F(16, 2, 0, 2)
0545     CAMELLIA_F(18, 0, 2, 0)
0546     ldd [%o3 + 0x30], %f16
0547     ldd [%o3 + 0x38], %f18
0548     fxor    %f20, %f2, %f2
0549     fxor    %f22, %f0, %f0
0550     ldd [%o3 + 0x40], %f20
0551     ldd [%o3 + 0x48], %f22
0552     fxor    %f60, %f2, %f2
0553     fxor    %f62, %f0, %f0
0554     fsrc2   %f56, %f60
0555     fsrc2   %f58, %f62
0556     std %f2, [%o1 + 0x00]
0557     std %f0, [%o1 + 0x08]
0558     subcc   %o2, 0x10, %o2
0559     bne,pt  %icc, 1b
0560      add    %o1, 0x10, %o1
0561     std %f60, [%o4 + 0x00]
0562     retl
0563      std    %f62, [%o4 + 0x08]
0564 ENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds)