linux/arch/sparc/crypto/camellia_asm.S
<<
>>
Prefs
   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
  22SIGMA:  .xword  0xA09E667F3BCC908B
  23        .xword  0xB67AE8584CAA73B2
  24        .xword  0xC6EF372FE94F82BE
  25        .xword  0x54FF53A5F1D36F1C
  26        .xword  0x10E527FADE682D1D
  27        .xword  0xB05688C2B3E6C1FD
  28
  29        .text
  30
  31        .align  32
  32ENTRY(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
  551:
  56        std     %f2, [%o1 + 0x28]       ! k[10, 11]
  57        fxor    %f28, %f0, %f0
  58        fxor    %f30, %f2, %f2
  59
  6010:
  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
 1331:
 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
 2022:
 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
 2091:
 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
 237ENDPROC(camellia_sparc64_key_expand)
 238
 239        .align  32
 240ENTRY(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
 2691:
 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
 308ENDPROC(camellia_sparc64_crypt)
 309
 310        .align  32
 311ENTRY(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
 341ENDPROC(camellia_sparc64_load_keys)
 342
 343        .align  32
 344ENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds)
 345        /* %o0=input, %o1=output, %o2=len, %o3=key */
 3461:      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
 363ENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds)
 364
 365        .align  32
 366ENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds)
 367        /* %o0=input, %o1=output, %o2=len, %o3=key */
 3681:      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
 407ENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds)
 408
 409        .align  32
 410ENTRY(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
 4141:      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]
 434ENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds)
 435
 436        .align  32
 437ENTRY(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
 4411:      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]
 483ENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds)
 484
 485        .align  32
 486ENTRY(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
 4901:      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]
 512ENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds)
 513
 514        .align  32
 515ENTRY(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
 5191:      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]
 563ENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds)
 564