0001
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
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
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
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
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
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
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
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
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
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
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
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)