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 ENCRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
0008     AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
0009     AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
0010     AES_EROUND01(KEY_BASE +  4, T0, T1, I0) \
0011     AES_EROUND23(KEY_BASE +  6, T0, T1, I1)
0012 
0013 #define ENCRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0014     AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
0015     AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
0016     AES_EROUND01(KEY_BASE +  0, I2, I3, T2) \
0017     AES_EROUND23(KEY_BASE +  2, I2, I3, T3) \
0018     AES_EROUND01(KEY_BASE +  4, T0, T1, I0) \
0019     AES_EROUND23(KEY_BASE +  6, T0, T1, I1) \
0020     AES_EROUND01(KEY_BASE +  4, T2, T3, I2) \
0021     AES_EROUND23(KEY_BASE +  6, T2, T3, I3)
0022 
0023 #define ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
0024     AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
0025     AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
0026     AES_EROUND01_L(KEY_BASE +  4, T0, T1, I0) \
0027     AES_EROUND23_L(KEY_BASE +  6, T0, T1, I1)
0028 
0029 #define ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0030     AES_EROUND01(KEY_BASE +  0, I0, I1, T0) \
0031     AES_EROUND23(KEY_BASE +  2, I0, I1, T1) \
0032     AES_EROUND01(KEY_BASE +  0, I2, I3, T2) \
0033     AES_EROUND23(KEY_BASE +  2, I2, I3, T3) \
0034     AES_EROUND01_L(KEY_BASE +  4, T0, T1, I0) \
0035     AES_EROUND23_L(KEY_BASE +  6, T0, T1, I1) \
0036     AES_EROUND01_L(KEY_BASE +  4, T2, T3, I2) \
0037     AES_EROUND23_L(KEY_BASE +  6, T2, T3, I3)
0038 
0039     /* 10 rounds */
0040 #define ENCRYPT_128(KEY_BASE, I0, I1, T0, T1) \
0041     ENCRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0042     ENCRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0043     ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0044     ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0045     ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
0046 
0047 #define ENCRYPT_128_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0048     ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
0049     ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
0050     ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
0051     ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
0052     ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3)
0053 
0054     /* 12 rounds */
0055 #define ENCRYPT_192(KEY_BASE, I0, I1, T0, T1) \
0056     ENCRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0057     ENCRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0058     ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0059     ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0060     ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
0061     ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
0062 
0063 #define ENCRYPT_192_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0064     ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
0065     ENCRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
0066     ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
0067     ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
0068     ENCRYPT_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3) \
0069     ENCRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 40, I0, I1, I2, I3, T0, T1, T2, T3)
0070 
0071     /* 14 rounds */
0072 #define ENCRYPT_256(KEY_BASE, I0, I1, T0, T1) \
0073     ENCRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0074     ENCRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0075     ENCRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0076     ENCRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0077     ENCRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
0078     ENCRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
0079     ENCRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
0080 
0081 #define ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, TMP_BASE) \
0082     ENCRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, \
0083                  TMP_BASE + 0, TMP_BASE + 2, TMP_BASE + 4, TMP_BASE + 6)
0084 
0085 #define ENCRYPT_256_2(KEY_BASE, I0, I1, I2, I3) \
0086     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, KEY_BASE + 48) \
0087     ldd [%o0 + 0xd0], %f56; \
0088     ldd [%o0 + 0xd8], %f58; \
0089     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, KEY_BASE +  0) \
0090     ldd [%o0 + 0xe0], %f60; \
0091     ldd [%o0 + 0xe8], %f62; \
0092     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, KEY_BASE +  0) \
0093     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, KEY_BASE +  0) \
0094     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, KEY_BASE +  0) \
0095     ENCRYPT_256_TWO_ROUNDS_2(KEY_BASE + 40, I0, I1, I2, I3, KEY_BASE +  0) \
0096     AES_EROUND01(KEY_BASE +  48, I0, I1, KEY_BASE + 0) \
0097     AES_EROUND23(KEY_BASE +  50, I0, I1, KEY_BASE + 2) \
0098     AES_EROUND01(KEY_BASE +  48, I2, I3, KEY_BASE + 4) \
0099     AES_EROUND23(KEY_BASE +  50, I2, I3, KEY_BASE + 6) \
0100     AES_EROUND01_L(KEY_BASE +  52, KEY_BASE + 0, KEY_BASE + 2, I0) \
0101     AES_EROUND23_L(KEY_BASE +  54, KEY_BASE + 0, KEY_BASE + 2, I1) \
0102     ldd [%o0 + 0x10], %f8; \
0103     ldd [%o0 + 0x18], %f10; \
0104     AES_EROUND01_L(KEY_BASE +  52, KEY_BASE + 4, KEY_BASE + 6, I2) \
0105     AES_EROUND23_L(KEY_BASE +  54, KEY_BASE + 4, KEY_BASE + 6, I3) \
0106     ldd [%o0 + 0x20], %f12; \
0107     ldd [%o0 + 0x28], %f14;
0108 
0109 #define DECRYPT_TWO_ROUNDS(KEY_BASE, I0, I1, T0, T1) \
0110     AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
0111     AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
0112     AES_DROUND23(KEY_BASE +  4, T0, T1, I1) \
0113     AES_DROUND01(KEY_BASE +  6, T0, T1, I0)
0114 
0115 #define DECRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0116     AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
0117     AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
0118     AES_DROUND23(KEY_BASE +  0, I2, I3, T3) \
0119     AES_DROUND01(KEY_BASE +  2, I2, I3, T2) \
0120     AES_DROUND23(KEY_BASE +  4, T0, T1, I1) \
0121     AES_DROUND01(KEY_BASE +  6, T0, T1, I0) \
0122     AES_DROUND23(KEY_BASE +  4, T2, T3, I3) \
0123     AES_DROUND01(KEY_BASE +  6, T2, T3, I2)
0124 
0125 #define DECRYPT_TWO_ROUNDS_LAST(KEY_BASE, I0, I1, T0, T1) \
0126     AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
0127     AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
0128     AES_DROUND23_L(KEY_BASE +  4, T0, T1, I1) \
0129     AES_DROUND01_L(KEY_BASE +  6, T0, T1, I0)
0130 
0131 #define DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0132     AES_DROUND23(KEY_BASE +  0, I0, I1, T1) \
0133     AES_DROUND01(KEY_BASE +  2, I0, I1, T0) \
0134     AES_DROUND23(KEY_BASE +  0, I2, I3, T3) \
0135     AES_DROUND01(KEY_BASE +  2, I2, I3, T2) \
0136     AES_DROUND23_L(KEY_BASE +  4, T0, T1, I1) \
0137     AES_DROUND01_L(KEY_BASE +  6, T0, T1, I0) \
0138     AES_DROUND23_L(KEY_BASE +  4, T2, T3, I3) \
0139     AES_DROUND01_L(KEY_BASE +  6, T2, T3, I2)
0140 
0141     /* 10 rounds */
0142 #define DECRYPT_128(KEY_BASE, I0, I1, T0, T1) \
0143     DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0144     DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0145     DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0146     DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0147     DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 32, I0, I1, T0, T1)
0148 
0149 #define DECRYPT_128_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0150     DECRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
0151     DECRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
0152     DECRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
0153     DECRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
0154     DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3)
0155 
0156     /* 12 rounds */
0157 #define DECRYPT_192(KEY_BASE, I0, I1, T0, T1) \
0158     DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0159     DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0160     DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0161     DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0162     DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
0163     DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 40, I0, I1, T0, T1)
0164 
0165 #define DECRYPT_192_2(KEY_BASE, I0, I1, I2, I3, T0, T1, T2, T3) \
0166     DECRYPT_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, T0, T1, T2, T3) \
0167     DECRYPT_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, T0, T1, T2, T3) \
0168     DECRYPT_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, T0, T1, T2, T3) \
0169     DECRYPT_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, T0, T1, T2, T3) \
0170     DECRYPT_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, T0, T1, T2, T3) \
0171     DECRYPT_TWO_ROUNDS_LAST_2(KEY_BASE + 40, I0, I1, I2, I3, T0, T1, T2, T3)
0172 
0173     /* 14 rounds */
0174 #define DECRYPT_256(KEY_BASE, I0, I1, T0, T1) \
0175     DECRYPT_TWO_ROUNDS(KEY_BASE +  0, I0, I1, T0, T1) \
0176     DECRYPT_TWO_ROUNDS(KEY_BASE +  8, I0, I1, T0, T1) \
0177     DECRYPT_TWO_ROUNDS(KEY_BASE + 16, I0, I1, T0, T1) \
0178     DECRYPT_TWO_ROUNDS(KEY_BASE + 24, I0, I1, T0, T1) \
0179     DECRYPT_TWO_ROUNDS(KEY_BASE + 32, I0, I1, T0, T1) \
0180     DECRYPT_TWO_ROUNDS(KEY_BASE + 40, I0, I1, T0, T1) \
0181     DECRYPT_TWO_ROUNDS_LAST(KEY_BASE + 48, I0, I1, T0, T1)
0182 
0183 #define DECRYPT_256_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, TMP_BASE) \
0184     DECRYPT_TWO_ROUNDS_2(KEY_BASE, I0, I1, I2, I3, \
0185                  TMP_BASE + 0, TMP_BASE + 2, TMP_BASE + 4, TMP_BASE + 6)
0186 
0187 #define DECRYPT_256_2(KEY_BASE, I0, I1, I2, I3) \
0188     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE +  0, I0, I1, I2, I3, KEY_BASE + 48) \
0189     ldd [%o0 + 0x18], %f56; \
0190     ldd [%o0 + 0x10], %f58; \
0191     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE +  8, I0, I1, I2, I3, KEY_BASE +  0) \
0192     ldd [%o0 + 0x08], %f60; \
0193     ldd [%o0 + 0x00], %f62; \
0194     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 16, I0, I1, I2, I3, KEY_BASE +  0) \
0195     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 24, I0, I1, I2, I3, KEY_BASE +  0) \
0196     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 32, I0, I1, I2, I3, KEY_BASE +  0) \
0197     DECRYPT_256_TWO_ROUNDS_2(KEY_BASE + 40, I0, I1, I2, I3, KEY_BASE +  0) \
0198     AES_DROUND23(KEY_BASE +  48, I0, I1, KEY_BASE + 2) \
0199     AES_DROUND01(KEY_BASE +  50, I0, I1, KEY_BASE + 0) \
0200     AES_DROUND23(KEY_BASE +  48, I2, I3, KEY_BASE + 6) \
0201     AES_DROUND01(KEY_BASE +  50, I2, I3, KEY_BASE + 4) \
0202     AES_DROUND23_L(KEY_BASE +  52, KEY_BASE + 0, KEY_BASE + 2, I1) \
0203     AES_DROUND01_L(KEY_BASE +  54, KEY_BASE + 0, KEY_BASE + 2, I0) \
0204     ldd [%o0 + 0xd8], %f8; \
0205     ldd [%o0 + 0xd0], %f10; \
0206     AES_DROUND23_L(KEY_BASE +  52, KEY_BASE + 4, KEY_BASE + 6, I3) \
0207     AES_DROUND01_L(KEY_BASE +  54, KEY_BASE + 4, KEY_BASE + 6, I2) \
0208     ldd [%o0 + 0xc8], %f12; \
0209     ldd [%o0 + 0xc0], %f14;
0210 
0211     .align  32
0212 ENTRY(aes_sparc64_key_expand)
0213     /* %o0=input_key, %o1=output_key, %o2=key_len */
0214     VISEntry
0215     ld  [%o0 + 0x00], %f0
0216     ld  [%o0 + 0x04], %f1
0217     ld  [%o0 + 0x08], %f2
0218     ld  [%o0 + 0x0c], %f3
0219 
0220     std %f0, [%o1 + 0x00]
0221     std %f2, [%o1 + 0x08]
0222     add %o1, 0x10, %o1
0223 
0224     cmp %o2, 24
0225     bl  2f
0226      nop
0227 
0228     be  1f
0229      nop
0230 
0231     /* 256-bit key expansion */
0232     ld  [%o0 + 0x10], %f4
0233     ld  [%o0 + 0x14], %f5
0234     ld  [%o0 + 0x18], %f6
0235     ld  [%o0 + 0x1c], %f7
0236 
0237     std %f4, [%o1 + 0x00]
0238     std %f6, [%o1 + 0x08]
0239     add %o1, 0x10, %o1
0240 
0241     AES_KEXPAND1(0, 6, 0x0, 8)
0242     AES_KEXPAND2(2, 8, 10)
0243     AES_KEXPAND0(4, 10, 12)
0244     AES_KEXPAND2(6, 12, 14)
0245     AES_KEXPAND1(8, 14, 0x1, 16)
0246     AES_KEXPAND2(10, 16, 18)
0247     AES_KEXPAND0(12, 18, 20)
0248     AES_KEXPAND2(14, 20, 22)
0249     AES_KEXPAND1(16, 22, 0x2, 24)
0250     AES_KEXPAND2(18, 24, 26)
0251     AES_KEXPAND0(20, 26, 28)
0252     AES_KEXPAND2(22, 28, 30)
0253     AES_KEXPAND1(24, 30, 0x3, 32)
0254     AES_KEXPAND2(26, 32, 34)
0255     AES_KEXPAND0(28, 34, 36)
0256     AES_KEXPAND2(30, 36, 38)
0257     AES_KEXPAND1(32, 38, 0x4, 40)
0258     AES_KEXPAND2(34, 40, 42)
0259     AES_KEXPAND0(36, 42, 44)
0260     AES_KEXPAND2(38, 44, 46)
0261     AES_KEXPAND1(40, 46, 0x5, 48)
0262     AES_KEXPAND2(42, 48, 50)
0263     AES_KEXPAND0(44, 50, 52)
0264     AES_KEXPAND2(46, 52, 54)
0265     AES_KEXPAND1(48, 54, 0x6, 56)
0266     AES_KEXPAND2(50, 56, 58)
0267 
0268     std %f8, [%o1 + 0x00]
0269     std %f10, [%o1 + 0x08]
0270     std %f12, [%o1 + 0x10]
0271     std %f14, [%o1 + 0x18]
0272     std %f16, [%o1 + 0x20]
0273     std %f18, [%o1 + 0x28]
0274     std %f20, [%o1 + 0x30]
0275     std %f22, [%o1 + 0x38]
0276     std %f24, [%o1 + 0x40]
0277     std %f26, [%o1 + 0x48]
0278     std %f28, [%o1 + 0x50]
0279     std %f30, [%o1 + 0x58]
0280     std %f32, [%o1 + 0x60]
0281     std %f34, [%o1 + 0x68]
0282     std %f36, [%o1 + 0x70]
0283     std %f38, [%o1 + 0x78]
0284     std %f40, [%o1 + 0x80]
0285     std %f42, [%o1 + 0x88]
0286     std %f44, [%o1 + 0x90]
0287     std %f46, [%o1 + 0x98]
0288     std %f48, [%o1 + 0xa0]
0289     std %f50, [%o1 + 0xa8]
0290     std %f52, [%o1 + 0xb0]
0291     std %f54, [%o1 + 0xb8]
0292     std %f56, [%o1 + 0xc0]
0293     ba,pt   %xcc, 80f
0294      std    %f58, [%o1 + 0xc8]
0295 
0296 1:  
0297     /* 192-bit key expansion */
0298     ld  [%o0 + 0x10], %f4
0299     ld  [%o0 + 0x14], %f5
0300 
0301     std %f4, [%o1 + 0x00]
0302     add %o1, 0x08, %o1
0303 
0304     AES_KEXPAND1(0, 4, 0x0, 6)
0305     AES_KEXPAND2(2, 6, 8)
0306     AES_KEXPAND2(4, 8, 10)
0307     AES_KEXPAND1(6, 10, 0x1, 12)
0308     AES_KEXPAND2(8, 12, 14)
0309     AES_KEXPAND2(10, 14, 16)
0310     AES_KEXPAND1(12, 16, 0x2, 18)
0311     AES_KEXPAND2(14, 18, 20)
0312     AES_KEXPAND2(16, 20, 22)
0313     AES_KEXPAND1(18, 22, 0x3, 24)
0314     AES_KEXPAND2(20, 24, 26)
0315     AES_KEXPAND2(22, 26, 28)
0316     AES_KEXPAND1(24, 28, 0x4, 30)
0317     AES_KEXPAND2(26, 30, 32)
0318     AES_KEXPAND2(28, 32, 34)
0319     AES_KEXPAND1(30, 34, 0x5, 36)
0320     AES_KEXPAND2(32, 36, 38)
0321     AES_KEXPAND2(34, 38, 40)
0322     AES_KEXPAND1(36, 40, 0x6, 42)
0323     AES_KEXPAND2(38, 42, 44)
0324     AES_KEXPAND2(40, 44, 46)
0325     AES_KEXPAND1(42, 46, 0x7, 48)
0326     AES_KEXPAND2(44, 48, 50)
0327 
0328     std %f6, [%o1 + 0x00]
0329     std %f8, [%o1 + 0x08]
0330     std %f10, [%o1 + 0x10]
0331     std %f12, [%o1 + 0x18]
0332     std %f14, [%o1 + 0x20]
0333     std %f16, [%o1 + 0x28]
0334     std %f18, [%o1 + 0x30]
0335     std %f20, [%o1 + 0x38]
0336     std %f22, [%o1 + 0x40]
0337     std %f24, [%o1 + 0x48]
0338     std %f26, [%o1 + 0x50]
0339     std %f28, [%o1 + 0x58]
0340     std %f30, [%o1 + 0x60]
0341     std %f32, [%o1 + 0x68]
0342     std %f34, [%o1 + 0x70]
0343     std %f36, [%o1 + 0x78]
0344     std %f38, [%o1 + 0x80]
0345     std %f40, [%o1 + 0x88]
0346     std %f42, [%o1 + 0x90]
0347     std %f44, [%o1 + 0x98]
0348     std %f46, [%o1 + 0xa0]
0349     std %f48, [%o1 + 0xa8]
0350     ba,pt   %xcc, 80f
0351      std    %f50, [%o1 + 0xb0]
0352 
0353 2:
0354     /* 128-bit key expansion */
0355     AES_KEXPAND1(0, 2, 0x0, 4)
0356     AES_KEXPAND2(2, 4, 6)
0357     AES_KEXPAND1(4, 6, 0x1, 8)
0358     AES_KEXPAND2(6, 8, 10)
0359     AES_KEXPAND1(8, 10, 0x2, 12)
0360     AES_KEXPAND2(10, 12, 14)
0361     AES_KEXPAND1(12, 14, 0x3, 16)
0362     AES_KEXPAND2(14, 16, 18)
0363     AES_KEXPAND1(16, 18, 0x4, 20)
0364     AES_KEXPAND2(18, 20, 22)
0365     AES_KEXPAND1(20, 22, 0x5, 24)
0366     AES_KEXPAND2(22, 24, 26)
0367     AES_KEXPAND1(24, 26, 0x6, 28)
0368     AES_KEXPAND2(26, 28, 30)
0369     AES_KEXPAND1(28, 30, 0x7, 32)
0370     AES_KEXPAND2(30, 32, 34)
0371     AES_KEXPAND1(32, 34, 0x8, 36)
0372     AES_KEXPAND2(34, 36, 38)
0373     AES_KEXPAND1(36, 38, 0x9, 40)
0374     AES_KEXPAND2(38, 40, 42)
0375 
0376     std %f4, [%o1 + 0x00]
0377     std %f6, [%o1 + 0x08]
0378     std %f8, [%o1 + 0x10]
0379     std %f10, [%o1 + 0x18]
0380     std %f12, [%o1 + 0x20]
0381     std %f14, [%o1 + 0x28]
0382     std %f16, [%o1 + 0x30]
0383     std %f18, [%o1 + 0x38]
0384     std %f20, [%o1 + 0x40]
0385     std %f22, [%o1 + 0x48]
0386     std %f24, [%o1 + 0x50]
0387     std %f26, [%o1 + 0x58]
0388     std %f28, [%o1 + 0x60]
0389     std %f30, [%o1 + 0x68]
0390     std %f32, [%o1 + 0x70]
0391     std %f34, [%o1 + 0x78]
0392     std %f36, [%o1 + 0x80]
0393     std %f38, [%o1 + 0x88]
0394     std %f40, [%o1 + 0x90]
0395     std %f42, [%o1 + 0x98]
0396 80:
0397     retl
0398      VISExit
0399 ENDPROC(aes_sparc64_key_expand)
0400 
0401     .align      32
0402 ENTRY(aes_sparc64_encrypt_128)
0403     /* %o0=key, %o1=input, %o2=output */
0404     VISEntry
0405     ld      [%o1 + 0x00], %f4
0406     ld      [%o1 + 0x04], %f5
0407     ld      [%o1 + 0x08], %f6
0408     ld      [%o1 + 0x0c], %f7
0409     ldd     [%o0 + 0x00], %f8
0410     ldd     [%o0 + 0x08], %f10
0411     ldd     [%o0 + 0x10], %f12
0412     ldd     [%o0 + 0x18], %f14
0413     ldd     [%o0 + 0x20], %f16
0414     ldd     [%o0 + 0x28], %f18
0415     ldd     [%o0 + 0x30], %f20
0416     ldd     [%o0 + 0x38], %f22
0417     ldd     [%o0 + 0x40], %f24
0418     ldd     [%o0 + 0x48], %f26
0419     ldd     [%o0 + 0x50], %f28
0420     ldd     [%o0 + 0x58], %f30
0421     ldd     [%o0 + 0x60], %f32
0422     ldd     [%o0 + 0x68], %f34
0423     ldd     [%o0 + 0x70], %f36
0424     ldd     [%o0 + 0x78], %f38
0425     ldd     [%o0 + 0x80], %f40
0426     ldd     [%o0 + 0x88], %f42
0427     ldd     [%o0 + 0x90], %f44
0428     ldd     [%o0 + 0x98], %f46
0429     ldd     [%o0 + 0xa0], %f48
0430     ldd     [%o0 + 0xa8], %f50
0431     fxor        %f8, %f4, %f4
0432     fxor        %f10, %f6, %f6
0433     ENCRYPT_128(12, 4, 6, 0, 2)
0434     st      %f4, [%o2 + 0x00]
0435     st      %f5, [%o2 + 0x04]
0436     st      %f6, [%o2 + 0x08]
0437     st      %f7, [%o2 + 0x0c]
0438     retl
0439      VISExit
0440 ENDPROC(aes_sparc64_encrypt_128)
0441 
0442     .align      32
0443 ENTRY(aes_sparc64_encrypt_192)
0444     /* %o0=key, %o1=input, %o2=output */
0445     VISEntry
0446     ld      [%o1 + 0x00], %f4
0447     ld      [%o1 + 0x04], %f5
0448     ld      [%o1 + 0x08], %f6
0449     ld      [%o1 + 0x0c], %f7
0450 
0451     ldd     [%o0 + 0x00], %f8
0452     ldd     [%o0 + 0x08], %f10
0453 
0454     fxor        %f8, %f4, %f4
0455     fxor        %f10, %f6, %f6
0456 
0457     ldd     [%o0 + 0x10], %f8
0458     ldd     [%o0 + 0x18], %f10
0459     ldd     [%o0 + 0x20], %f12
0460     ldd     [%o0 + 0x28], %f14
0461     add     %o0, 0x20, %o0
0462 
0463     ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
0464 
0465     ldd     [%o0 + 0x10], %f12
0466     ldd     [%o0 + 0x18], %f14
0467     ldd     [%o0 + 0x20], %f16
0468     ldd     [%o0 + 0x28], %f18
0469     ldd     [%o0 + 0x30], %f20
0470     ldd     [%o0 + 0x38], %f22
0471     ldd     [%o0 + 0x40], %f24
0472     ldd     [%o0 + 0x48], %f26
0473     ldd     [%o0 + 0x50], %f28
0474     ldd     [%o0 + 0x58], %f30
0475     ldd     [%o0 + 0x60], %f32
0476     ldd     [%o0 + 0x68], %f34
0477     ldd     [%o0 + 0x70], %f36
0478     ldd     [%o0 + 0x78], %f38
0479     ldd     [%o0 + 0x80], %f40
0480     ldd     [%o0 + 0x88], %f42
0481     ldd     [%o0 + 0x90], %f44
0482     ldd     [%o0 + 0x98], %f46
0483     ldd     [%o0 + 0xa0], %f48
0484     ldd     [%o0 + 0xa8], %f50
0485 
0486 
0487     ENCRYPT_128(12, 4, 6, 0, 2)
0488 
0489     st      %f4, [%o2 + 0x00]
0490     st      %f5, [%o2 + 0x04]
0491     st      %f6, [%o2 + 0x08]
0492     st      %f7, [%o2 + 0x0c]
0493 
0494     retl
0495      VISExit
0496 ENDPROC(aes_sparc64_encrypt_192)
0497 
0498     .align      32
0499 ENTRY(aes_sparc64_encrypt_256)
0500     /* %o0=key, %o1=input, %o2=output */
0501     VISEntry
0502     ld      [%o1 + 0x00], %f4
0503     ld      [%o1 + 0x04], %f5
0504     ld      [%o1 + 0x08], %f6
0505     ld      [%o1 + 0x0c], %f7
0506 
0507     ldd     [%o0 + 0x00], %f8
0508     ldd     [%o0 + 0x08], %f10
0509 
0510     fxor        %f8, %f4, %f4
0511     fxor        %f10, %f6, %f6
0512 
0513     ldd     [%o0 + 0x10], %f8
0514 
0515     ldd     [%o0 + 0x18], %f10
0516     ldd     [%o0 + 0x20], %f12
0517     ldd     [%o0 + 0x28], %f14
0518     add     %o0, 0x20, %o0
0519 
0520     ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
0521 
0522     ldd     [%o0 + 0x10], %f8
0523 
0524     ldd     [%o0 + 0x18], %f10
0525     ldd     [%o0 + 0x20], %f12
0526     ldd     [%o0 + 0x28], %f14
0527     add     %o0, 0x20, %o0
0528 
0529     ENCRYPT_TWO_ROUNDS(8, 4, 6, 0, 2)
0530 
0531     ldd     [%o0 + 0x10], %f12
0532     ldd     [%o0 + 0x18], %f14
0533     ldd     [%o0 + 0x20], %f16
0534     ldd     [%o0 + 0x28], %f18
0535     ldd     [%o0 + 0x30], %f20
0536     ldd     [%o0 + 0x38], %f22
0537     ldd     [%o0 + 0x40], %f24
0538     ldd     [%o0 + 0x48], %f26
0539     ldd     [%o0 + 0x50], %f28
0540     ldd     [%o0 + 0x58], %f30
0541     ldd     [%o0 + 0x60], %f32
0542     ldd     [%o0 + 0x68], %f34
0543     ldd     [%o0 + 0x70], %f36
0544     ldd     [%o0 + 0x78], %f38
0545     ldd     [%o0 + 0x80], %f40
0546     ldd     [%o0 + 0x88], %f42
0547     ldd     [%o0 + 0x90], %f44
0548     ldd     [%o0 + 0x98], %f46
0549     ldd     [%o0 + 0xa0], %f48
0550     ldd     [%o0 + 0xa8], %f50
0551 
0552     ENCRYPT_128(12, 4, 6, 0, 2)
0553 
0554     st      %f4, [%o2 + 0x00]
0555     st      %f5, [%o2 + 0x04]
0556     st      %f6, [%o2 + 0x08]
0557     st      %f7, [%o2 + 0x0c]
0558 
0559     retl
0560      VISExit
0561 ENDPROC(aes_sparc64_encrypt_256)
0562 
0563     .align      32
0564 ENTRY(aes_sparc64_decrypt_128)
0565     /* %o0=key, %o1=input, %o2=output */
0566     VISEntry
0567     ld      [%o1 + 0x00], %f4
0568     ld      [%o1 + 0x04], %f5
0569     ld      [%o1 + 0x08], %f6
0570     ld      [%o1 + 0x0c], %f7
0571     ldd     [%o0 + 0xa0], %f8
0572     ldd     [%o0 + 0xa8], %f10
0573     ldd     [%o0 + 0x98], %f12
0574     ldd     [%o0 + 0x90], %f14
0575     ldd     [%o0 + 0x88], %f16
0576     ldd     [%o0 + 0x80], %f18
0577     ldd     [%o0 + 0x78], %f20
0578     ldd     [%o0 + 0x70], %f22
0579     ldd     [%o0 + 0x68], %f24
0580     ldd     [%o0 + 0x60], %f26
0581     ldd     [%o0 + 0x58], %f28
0582     ldd     [%o0 + 0x50], %f30
0583     ldd     [%o0 + 0x48], %f32
0584     ldd     [%o0 + 0x40], %f34
0585     ldd     [%o0 + 0x38], %f36
0586     ldd     [%o0 + 0x30], %f38
0587     ldd     [%o0 + 0x28], %f40
0588     ldd     [%o0 + 0x20], %f42
0589     ldd     [%o0 + 0x18], %f44
0590     ldd     [%o0 + 0x10], %f46
0591     ldd     [%o0 + 0x08], %f48
0592     ldd     [%o0 + 0x00], %f50
0593     fxor        %f8, %f4, %f4
0594     fxor        %f10, %f6, %f6
0595     DECRYPT_128(12, 4, 6, 0, 2)
0596     st      %f4, [%o2 + 0x00]
0597     st      %f5, [%o2 + 0x04]
0598     st      %f6, [%o2 + 0x08]
0599     st      %f7, [%o2 + 0x0c]
0600     retl
0601      VISExit
0602 ENDPROC(aes_sparc64_decrypt_128)
0603 
0604     .align      32
0605 ENTRY(aes_sparc64_decrypt_192)
0606     /* %o0=key, %o1=input, %o2=output */
0607     VISEntry
0608     ld      [%o1 + 0x00], %f4
0609     ld      [%o1 + 0x04], %f5
0610     ld      [%o1 + 0x08], %f6
0611     ld      [%o1 + 0x0c], %f7
0612     ldd     [%o0 + 0xc0], %f8
0613     ldd     [%o0 + 0xc8], %f10
0614     ldd     [%o0 + 0xb8], %f12
0615     ldd     [%o0 + 0xb0], %f14
0616     ldd     [%o0 + 0xa8], %f16
0617     ldd     [%o0 + 0xa0], %f18
0618     fxor        %f8, %f4, %f4
0619     fxor        %f10, %f6, %f6
0620     ldd     [%o0 + 0x98], %f20
0621     ldd     [%o0 + 0x90], %f22
0622     ldd     [%o0 + 0x88], %f24
0623     ldd     [%o0 + 0x80], %f26
0624     DECRYPT_TWO_ROUNDS(12, 4, 6, 0, 2)
0625     ldd     [%o0 + 0x78], %f28
0626     ldd     [%o0 + 0x70], %f30
0627     ldd     [%o0 + 0x68], %f32
0628     ldd     [%o0 + 0x60], %f34
0629     ldd     [%o0 + 0x58], %f36
0630     ldd     [%o0 + 0x50], %f38
0631     ldd     [%o0 + 0x48], %f40
0632     ldd     [%o0 + 0x40], %f42
0633     ldd     [%o0 + 0x38], %f44
0634     ldd     [%o0 + 0x30], %f46
0635     ldd     [%o0 + 0x28], %f48
0636     ldd     [%o0 + 0x20], %f50
0637     ldd     [%o0 + 0x18], %f52
0638     ldd     [%o0 + 0x10], %f54
0639     ldd     [%o0 + 0x08], %f56
0640     ldd     [%o0 + 0x00], %f58
0641     DECRYPT_128(20, 4, 6, 0, 2)
0642     st      %f4, [%o2 + 0x00]
0643     st      %f5, [%o2 + 0x04]
0644     st      %f6, [%o2 + 0x08]
0645     st      %f7, [%o2 + 0x0c]
0646     retl
0647      VISExit
0648 ENDPROC(aes_sparc64_decrypt_192)
0649 
0650     .align      32
0651 ENTRY(aes_sparc64_decrypt_256)
0652     /* %o0=key, %o1=input, %o2=output */
0653     VISEntry
0654     ld      [%o1 + 0x00], %f4
0655     ld      [%o1 + 0x04], %f5
0656     ld      [%o1 + 0x08], %f6
0657     ld      [%o1 + 0x0c], %f7
0658     ldd     [%o0 + 0xe0], %f8
0659     ldd     [%o0 + 0xe8], %f10
0660     ldd     [%o0 + 0xd8], %f12
0661     ldd     [%o0 + 0xd0], %f14
0662     ldd     [%o0 + 0xc8], %f16
0663     fxor        %f8, %f4, %f4
0664     ldd     [%o0 + 0xc0], %f18
0665     fxor        %f10, %f6, %f6
0666     ldd     [%o0 + 0xb8], %f20
0667     AES_DROUND23(12, 4, 6, 2)
0668     ldd     [%o0 + 0xb0], %f22
0669     AES_DROUND01(14, 4, 6, 0)
0670     ldd     [%o0 + 0xa8], %f24
0671     AES_DROUND23(16, 0, 2, 6)
0672     ldd     [%o0 + 0xa0], %f26
0673     AES_DROUND01(18, 0, 2, 4)
0674     ldd     [%o0 + 0x98], %f12
0675     AES_DROUND23(20, 4, 6, 2)
0676     ldd     [%o0 + 0x90], %f14
0677     AES_DROUND01(22, 4, 6, 0)
0678     ldd     [%o0 + 0x88], %f16
0679     AES_DROUND23(24, 0, 2, 6)
0680     ldd     [%o0 + 0x80], %f18
0681     AES_DROUND01(26, 0, 2, 4)
0682     ldd     [%o0 + 0x78], %f20
0683     AES_DROUND23(12, 4, 6, 2)
0684     ldd     [%o0 + 0x70], %f22
0685     AES_DROUND01(14, 4, 6, 0)
0686     ldd     [%o0 + 0x68], %f24
0687     AES_DROUND23(16, 0, 2, 6)
0688     ldd     [%o0 + 0x60], %f26
0689     AES_DROUND01(18, 0, 2, 4)
0690     ldd     [%o0 + 0x58], %f28
0691     AES_DROUND23(20, 4, 6, 2)
0692     ldd     [%o0 + 0x50], %f30
0693     AES_DROUND01(22, 4, 6, 0)
0694     ldd     [%o0 + 0x48], %f32
0695     AES_DROUND23(24, 0, 2, 6)
0696     ldd     [%o0 + 0x40], %f34
0697     AES_DROUND01(26, 0, 2, 4)
0698     ldd     [%o0 + 0x38], %f36
0699     AES_DROUND23(28, 4, 6, 2)
0700     ldd     [%o0 + 0x30], %f38
0701     AES_DROUND01(30, 4, 6, 0)
0702     ldd     [%o0 + 0x28], %f40
0703     AES_DROUND23(32, 0, 2, 6)
0704     ldd     [%o0 + 0x20], %f42
0705     AES_DROUND01(34, 0, 2, 4)
0706     ldd     [%o0 + 0x18], %f44
0707     AES_DROUND23(36, 4, 6, 2)
0708     ldd     [%o0 + 0x10], %f46
0709     AES_DROUND01(38, 4, 6, 0)
0710     ldd     [%o0 + 0x08], %f48
0711     AES_DROUND23(40, 0, 2, 6)
0712     ldd     [%o0 + 0x00], %f50
0713     AES_DROUND01(42, 0, 2, 4)
0714     AES_DROUND23(44, 4, 6, 2)
0715     AES_DROUND01(46, 4, 6, 0)
0716     AES_DROUND23_L(48, 0, 2, 6)
0717     AES_DROUND01_L(50, 0, 2, 4)
0718     st      %f4, [%o2 + 0x00]
0719     st      %f5, [%o2 + 0x04]
0720     st      %f6, [%o2 + 0x08]
0721     st      %f7, [%o2 + 0x0c]
0722     retl
0723      VISExit
0724 ENDPROC(aes_sparc64_decrypt_256)
0725 
0726     .align      32
0727 ENTRY(aes_sparc64_load_encrypt_keys_128)
0728     /* %o0=key */
0729     VISEntry
0730     ldd     [%o0 + 0x10], %f8
0731     ldd     [%o0 + 0x18], %f10
0732     ldd     [%o0 + 0x20], %f12
0733     ldd     [%o0 + 0x28], %f14
0734     ldd     [%o0 + 0x30], %f16
0735     ldd     [%o0 + 0x38], %f18
0736     ldd     [%o0 + 0x40], %f20
0737     ldd     [%o0 + 0x48], %f22
0738     ldd     [%o0 + 0x50], %f24
0739     ldd     [%o0 + 0x58], %f26
0740     ldd     [%o0 + 0x60], %f28
0741     ldd     [%o0 + 0x68], %f30
0742     ldd     [%o0 + 0x70], %f32
0743     ldd     [%o0 + 0x78], %f34
0744     ldd     [%o0 + 0x80], %f36
0745     ldd     [%o0 + 0x88], %f38
0746     ldd     [%o0 + 0x90], %f40
0747     ldd     [%o0 + 0x98], %f42
0748     ldd     [%o0 + 0xa0], %f44
0749     retl
0750      ldd        [%o0 + 0xa8], %f46
0751 ENDPROC(aes_sparc64_load_encrypt_keys_128)
0752 
0753     .align      32
0754 ENTRY(aes_sparc64_load_encrypt_keys_192)
0755     /* %o0=key */
0756     VISEntry
0757     ldd     [%o0 + 0x10], %f8
0758     ldd     [%o0 + 0x18], %f10
0759     ldd     [%o0 + 0x20], %f12
0760     ldd     [%o0 + 0x28], %f14
0761     ldd     [%o0 + 0x30], %f16
0762     ldd     [%o0 + 0x38], %f18
0763     ldd     [%o0 + 0x40], %f20
0764     ldd     [%o0 + 0x48], %f22
0765     ldd     [%o0 + 0x50], %f24
0766     ldd     [%o0 + 0x58], %f26
0767     ldd     [%o0 + 0x60], %f28
0768     ldd     [%o0 + 0x68], %f30
0769     ldd     [%o0 + 0x70], %f32
0770     ldd     [%o0 + 0x78], %f34
0771     ldd     [%o0 + 0x80], %f36
0772     ldd     [%o0 + 0x88], %f38
0773     ldd     [%o0 + 0x90], %f40
0774     ldd     [%o0 + 0x98], %f42
0775     ldd     [%o0 + 0xa0], %f44
0776     ldd     [%o0 + 0xa8], %f46
0777     ldd     [%o0 + 0xb0], %f48
0778     ldd     [%o0 + 0xb8], %f50
0779     ldd     [%o0 + 0xc0], %f52
0780     retl
0781      ldd        [%o0 + 0xc8], %f54
0782 ENDPROC(aes_sparc64_load_encrypt_keys_192)
0783 
0784     .align      32
0785 ENTRY(aes_sparc64_load_encrypt_keys_256)
0786     /* %o0=key */
0787     VISEntry
0788     ldd     [%o0 + 0x10], %f8
0789     ldd     [%o0 + 0x18], %f10
0790     ldd     [%o0 + 0x20], %f12
0791     ldd     [%o0 + 0x28], %f14
0792     ldd     [%o0 + 0x30], %f16
0793     ldd     [%o0 + 0x38], %f18
0794     ldd     [%o0 + 0x40], %f20
0795     ldd     [%o0 + 0x48], %f22
0796     ldd     [%o0 + 0x50], %f24
0797     ldd     [%o0 + 0x58], %f26
0798     ldd     [%o0 + 0x60], %f28
0799     ldd     [%o0 + 0x68], %f30
0800     ldd     [%o0 + 0x70], %f32
0801     ldd     [%o0 + 0x78], %f34
0802     ldd     [%o0 + 0x80], %f36
0803     ldd     [%o0 + 0x88], %f38
0804     ldd     [%o0 + 0x90], %f40
0805     ldd     [%o0 + 0x98], %f42
0806     ldd     [%o0 + 0xa0], %f44
0807     ldd     [%o0 + 0xa8], %f46
0808     ldd     [%o0 + 0xb0], %f48
0809     ldd     [%o0 + 0xb8], %f50
0810     ldd     [%o0 + 0xc0], %f52
0811     ldd     [%o0 + 0xc8], %f54
0812     ldd     [%o0 + 0xd0], %f56
0813     ldd     [%o0 + 0xd8], %f58
0814     ldd     [%o0 + 0xe0], %f60
0815     retl
0816      ldd        [%o0 + 0xe8], %f62
0817 ENDPROC(aes_sparc64_load_encrypt_keys_256)
0818 
0819     .align      32
0820 ENTRY(aes_sparc64_load_decrypt_keys_128)
0821     /* %o0=key */
0822     VISEntry
0823     ldd     [%o0 + 0x98], %f8
0824     ldd     [%o0 + 0x90], %f10
0825     ldd     [%o0 + 0x88], %f12
0826     ldd     [%o0 + 0x80], %f14
0827     ldd     [%o0 + 0x78], %f16
0828     ldd     [%o0 + 0x70], %f18
0829     ldd     [%o0 + 0x68], %f20
0830     ldd     [%o0 + 0x60], %f22
0831     ldd     [%o0 + 0x58], %f24
0832     ldd     [%o0 + 0x50], %f26
0833     ldd     [%o0 + 0x48], %f28
0834     ldd     [%o0 + 0x40], %f30
0835     ldd     [%o0 + 0x38], %f32
0836     ldd     [%o0 + 0x30], %f34
0837     ldd     [%o0 + 0x28], %f36
0838     ldd     [%o0 + 0x20], %f38
0839     ldd     [%o0 + 0x18], %f40
0840     ldd     [%o0 + 0x10], %f42
0841     ldd     [%o0 + 0x08], %f44
0842     retl
0843      ldd        [%o0 + 0x00], %f46
0844 ENDPROC(aes_sparc64_load_decrypt_keys_128)
0845 
0846     .align      32
0847 ENTRY(aes_sparc64_load_decrypt_keys_192)
0848     /* %o0=key */
0849     VISEntry
0850     ldd     [%o0 + 0xb8], %f8
0851     ldd     [%o0 + 0xb0], %f10
0852     ldd     [%o0 + 0xa8], %f12
0853     ldd     [%o0 + 0xa0], %f14
0854     ldd     [%o0 + 0x98], %f16
0855     ldd     [%o0 + 0x90], %f18
0856     ldd     [%o0 + 0x88], %f20
0857     ldd     [%o0 + 0x80], %f22
0858     ldd     [%o0 + 0x78], %f24
0859     ldd     [%o0 + 0x70], %f26
0860     ldd     [%o0 + 0x68], %f28
0861     ldd     [%o0 + 0x60], %f30
0862     ldd     [%o0 + 0x58], %f32
0863     ldd     [%o0 + 0x50], %f34
0864     ldd     [%o0 + 0x48], %f36
0865     ldd     [%o0 + 0x40], %f38
0866     ldd     [%o0 + 0x38], %f40
0867     ldd     [%o0 + 0x30], %f42
0868     ldd     [%o0 + 0x28], %f44
0869     ldd     [%o0 + 0x20], %f46
0870     ldd     [%o0 + 0x18], %f48
0871     ldd     [%o0 + 0x10], %f50
0872     ldd     [%o0 + 0x08], %f52
0873     retl
0874      ldd        [%o0 + 0x00], %f54
0875 ENDPROC(aes_sparc64_load_decrypt_keys_192)
0876 
0877     .align      32
0878 ENTRY(aes_sparc64_load_decrypt_keys_256)
0879     /* %o0=key */
0880     VISEntry
0881     ldd     [%o0 + 0xd8], %f8
0882     ldd     [%o0 + 0xd0], %f10
0883     ldd     [%o0 + 0xc8], %f12
0884     ldd     [%o0 + 0xc0], %f14
0885     ldd     [%o0 + 0xb8], %f16
0886     ldd     [%o0 + 0xb0], %f18
0887     ldd     [%o0 + 0xa8], %f20
0888     ldd     [%o0 + 0xa0], %f22
0889     ldd     [%o0 + 0x98], %f24
0890     ldd     [%o0 + 0x90], %f26
0891     ldd     [%o0 + 0x88], %f28
0892     ldd     [%o0 + 0x80], %f30
0893     ldd     [%o0 + 0x78], %f32
0894     ldd     [%o0 + 0x70], %f34
0895     ldd     [%o0 + 0x68], %f36
0896     ldd     [%o0 + 0x60], %f38
0897     ldd     [%o0 + 0x58], %f40
0898     ldd     [%o0 + 0x50], %f42
0899     ldd     [%o0 + 0x48], %f44
0900     ldd     [%o0 + 0x40], %f46
0901     ldd     [%o0 + 0x38], %f48
0902     ldd     [%o0 + 0x30], %f50
0903     ldd     [%o0 + 0x28], %f52
0904     ldd     [%o0 + 0x20], %f54
0905     ldd     [%o0 + 0x18], %f56
0906     ldd     [%o0 + 0x10], %f58
0907     ldd     [%o0 + 0x08], %f60
0908     retl
0909      ldd        [%o0 + 0x00], %f62
0910 ENDPROC(aes_sparc64_load_decrypt_keys_256)
0911 
0912     .align      32
0913 ENTRY(aes_sparc64_ecb_encrypt_128)
0914     /* %o0=key, %o1=input, %o2=output, %o3=len */
0915     ldx     [%o0 + 0x00], %g1
0916     subcc       %o3, 0x10, %o3
0917     be      10f
0918      ldx        [%o0 + 0x08], %g2
0919 1:  ldx     [%o1 + 0x00], %g3
0920     ldx     [%o1 + 0x08], %g7
0921     ldx     [%o1 + 0x10], %o4
0922     ldx     [%o1 + 0x18], %o5
0923     xor     %g1, %g3, %g3
0924     xor     %g2, %g7, %g7
0925     MOVXTOD_G3_F4
0926     MOVXTOD_G7_F6
0927     xor     %g1, %o4, %g3
0928     xor     %g2, %o5, %g7
0929     MOVXTOD_G3_F60
0930     MOVXTOD_G7_F62
0931     ENCRYPT_128_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
0932     std     %f4, [%o2 + 0x00]
0933     std     %f6, [%o2 + 0x08]
0934     std     %f60, [%o2 + 0x10]
0935     std     %f62, [%o2 + 0x18]
0936     sub     %o3, 0x20, %o3
0937     add     %o1, 0x20, %o1
0938     brgz        %o3, 1b
0939      add        %o2, 0x20, %o2
0940     brlz,pt     %o3, 11f
0941      nop
0942 10: ldx     [%o1 + 0x00], %g3
0943     ldx     [%o1 + 0x08], %g7
0944     xor     %g1, %g3, %g3
0945     xor     %g2, %g7, %g7
0946     MOVXTOD_G3_F4
0947     MOVXTOD_G7_F6
0948     ENCRYPT_128(8, 4, 6, 0, 2)
0949     std     %f4, [%o2 + 0x00]
0950     std     %f6, [%o2 + 0x08]
0951 11: retl
0952      nop
0953 ENDPROC(aes_sparc64_ecb_encrypt_128)
0954 
0955     .align      32
0956 ENTRY(aes_sparc64_ecb_encrypt_192)
0957     /* %o0=key, %o1=input, %o2=output, %o3=len */
0958     ldx     [%o0 + 0x00], %g1
0959     subcc       %o3, 0x10, %o3
0960     be      10f
0961      ldx        [%o0 + 0x08], %g2
0962 1:  ldx     [%o1 + 0x00], %g3
0963     ldx     [%o1 + 0x08], %g7
0964     ldx     [%o1 + 0x10], %o4
0965     ldx     [%o1 + 0x18], %o5
0966     xor     %g1, %g3, %g3
0967     xor     %g2, %g7, %g7
0968     MOVXTOD_G3_F4
0969     MOVXTOD_G7_F6
0970     xor     %g1, %o4, %g3
0971     xor     %g2, %o5, %g7
0972     MOVXTOD_G3_F60
0973     MOVXTOD_G7_F62
0974     ENCRYPT_192_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
0975     std     %f4, [%o2 + 0x00]
0976     std     %f6, [%o2 + 0x08]
0977     std     %f60, [%o2 + 0x10]
0978     std     %f62, [%o2 + 0x18]
0979     sub     %o3, 0x20, %o3
0980     add     %o1, 0x20, %o1
0981     brgz        %o3, 1b
0982      add        %o2, 0x20, %o2
0983     brlz,pt     %o3, 11f
0984      nop
0985 10: ldx     [%o1 + 0x00], %g3
0986     ldx     [%o1 + 0x08], %g7
0987     xor     %g1, %g3, %g3
0988     xor     %g2, %g7, %g7
0989     MOVXTOD_G3_F4
0990     MOVXTOD_G7_F6
0991     ENCRYPT_192(8, 4, 6, 0, 2)
0992     std     %f4, [%o2 + 0x00]
0993     std     %f6, [%o2 + 0x08]
0994 11: retl
0995      nop
0996 ENDPROC(aes_sparc64_ecb_encrypt_192)
0997 
0998     .align      32
0999 ENTRY(aes_sparc64_ecb_encrypt_256)
1000     /* %o0=key, %o1=input, %o2=output, %o3=len */
1001     ldx     [%o0 + 0x00], %g1
1002     subcc       %o3, 0x10, %o3
1003     be      10f
1004      ldx        [%o0 + 0x08], %g2
1005 1:  ldx     [%o1 + 0x00], %g3
1006     ldx     [%o1 + 0x08], %g7
1007     ldx     [%o1 + 0x10], %o4
1008     ldx     [%o1 + 0x18], %o5
1009     xor     %g1, %g3, %g3
1010     xor     %g2, %g7, %g7
1011     MOVXTOD_G3_F4
1012     MOVXTOD_G7_F6
1013     xor     %g1, %o4, %g3
1014     xor     %g2, %o5, %g7
1015     MOVXTOD_G3_F0
1016     MOVXTOD_G7_F2
1017     ENCRYPT_256_2(8, 4, 6, 0, 2)
1018     std     %f4, [%o2 + 0x00]
1019     std     %f6, [%o2 + 0x08]
1020     std     %f0, [%o2 + 0x10]
1021     std     %f2, [%o2 + 0x18]
1022     sub     %o3, 0x20, %o3
1023     add     %o1, 0x20, %o1
1024     brgz        %o3, 1b
1025      add        %o2, 0x20, %o2
1026     brlz,pt     %o3, 11f
1027      nop
1028 10: ldd     [%o0 + 0xd0], %f56
1029     ldd     [%o0 + 0xd8], %f58
1030     ldd     [%o0 + 0xe0], %f60
1031     ldd     [%o0 + 0xe8], %f62
1032     ldx     [%o1 + 0x00], %g3
1033     ldx     [%o1 + 0x08], %g7
1034     xor     %g1, %g3, %g3
1035     xor     %g2, %g7, %g7
1036     MOVXTOD_G3_F4
1037     MOVXTOD_G7_F6
1038     ENCRYPT_256(8, 4, 6, 0, 2)
1039     std     %f4, [%o2 + 0x00]
1040     std     %f6, [%o2 + 0x08]
1041 11: retl
1042      nop
1043 ENDPROC(aes_sparc64_ecb_encrypt_256)
1044 
1045     .align      32
1046 ENTRY(aes_sparc64_ecb_decrypt_128)
1047     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1048     ldx     [%o0 - 0x10], %g1
1049     subcc       %o3, 0x10, %o3
1050     be      10f
1051      ldx        [%o0 - 0x08], %g2
1052 1:  ldx     [%o1 + 0x00], %g3
1053     ldx     [%o1 + 0x08], %g7
1054     ldx     [%o1 + 0x10], %o4
1055     ldx     [%o1 + 0x18], %o5
1056     xor     %g1, %g3, %g3
1057     xor     %g2, %g7, %g7
1058     MOVXTOD_G3_F4
1059     MOVXTOD_G7_F6
1060     xor     %g1, %o4, %g3
1061     xor     %g2, %o5, %g7
1062     MOVXTOD_G3_F60
1063     MOVXTOD_G7_F62
1064     DECRYPT_128_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1065     std     %f4, [%o2 + 0x00]
1066     std     %f6, [%o2 + 0x08]
1067     std     %f60, [%o2 + 0x10]
1068     std     %f62, [%o2 + 0x18]
1069     sub     %o3, 0x20, %o3
1070     add     %o1, 0x20, %o1
1071     brgz,pt     %o3, 1b
1072      add        %o2, 0x20, %o2
1073     brlz,pt     %o3, 11f
1074      nop
1075 10: ldx     [%o1 + 0x00], %g3
1076     ldx     [%o1 + 0x08], %g7
1077     xor     %g1, %g3, %g3
1078     xor     %g2, %g7, %g7
1079     MOVXTOD_G3_F4
1080     MOVXTOD_G7_F6
1081     DECRYPT_128(8, 4, 6, 0, 2)
1082     std     %f4, [%o2 + 0x00]
1083     std     %f6, [%o2 + 0x08]
1084 11: retl
1085      nop
1086 ENDPROC(aes_sparc64_ecb_decrypt_128)
1087 
1088     .align      32
1089 ENTRY(aes_sparc64_ecb_decrypt_192)
1090     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1091     ldx     [%o0 - 0x10], %g1
1092     subcc       %o3, 0x10, %o3
1093     be      10f
1094      ldx        [%o0 - 0x08], %g2
1095 1:  ldx     [%o1 + 0x00], %g3
1096     ldx     [%o1 + 0x08], %g7
1097     ldx     [%o1 + 0x10], %o4
1098     ldx     [%o1 + 0x18], %o5
1099     xor     %g1, %g3, %g3
1100     xor     %g2, %g7, %g7
1101     MOVXTOD_G3_F4
1102     MOVXTOD_G7_F6
1103     xor     %g1, %o4, %g3
1104     xor     %g2, %o5, %g7
1105     MOVXTOD_G3_F60
1106     MOVXTOD_G7_F62
1107     DECRYPT_192_2(8, 4, 6, 60, 62, 0, 2, 56, 58)
1108     std     %f4, [%o2 + 0x00]
1109     std     %f6, [%o2 + 0x08]
1110     std     %f60, [%o2 + 0x10]
1111     std     %f62, [%o2 + 0x18]
1112     sub     %o3, 0x20, %o3
1113     add     %o1, 0x20, %o1
1114     brgz,pt     %o3, 1b
1115      add        %o2, 0x20, %o2
1116     brlz,pt     %o3, 11f
1117      nop
1118 10: ldx     [%o1 + 0x00], %g3
1119     ldx     [%o1 + 0x08], %g7
1120     xor     %g1, %g3, %g3
1121     xor     %g2, %g7, %g7
1122     MOVXTOD_G3_F4
1123     MOVXTOD_G7_F6
1124     DECRYPT_192(8, 4, 6, 0, 2)
1125     std     %f4, [%o2 + 0x00]
1126     std     %f6, [%o2 + 0x08]
1127 11: retl
1128      nop
1129 ENDPROC(aes_sparc64_ecb_decrypt_192)
1130 
1131     .align      32
1132 ENTRY(aes_sparc64_ecb_decrypt_256)
1133     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
1134     ldx     [%o0 - 0x10], %g1
1135     subcc       %o3, 0x10, %o3
1136     ldx     [%o0 - 0x08], %g2
1137     be      10f
1138      sub        %o0, 0xf0, %o0
1139 1:  ldx     [%o1 + 0x00], %g3
1140     ldx     [%o1 + 0x08], %g7
1141     ldx     [%o1 + 0x10], %o4
1142     ldx     [%o1 + 0x18], %o5
1143     xor     %g1, %g3, %g3
1144     xor     %g2, %g7, %g7
1145     MOVXTOD_G3_F4
1146     MOVXTOD_G7_F6
1147     xor     %g1, %o4, %g3
1148     xor     %g2, %o5, %g7
1149     MOVXTOD_G3_F0
1150     MOVXTOD_G7_F2
1151     DECRYPT_256_2(8, 4, 6, 0, 2)
1152     std     %f4, [%o2 + 0x00]
1153     std     %f6, [%o2 + 0x08]
1154     std     %f0, [%o2 + 0x10]
1155     std     %f2, [%o2 + 0x18]
1156     sub     %o3, 0x20, %o3
1157     add     %o1, 0x20, %o1
1158     brgz,pt     %o3, 1b
1159      add        %o2, 0x20, %o2
1160     brlz,pt     %o3, 11f
1161      nop
1162 10: ldd     [%o0 + 0x18], %f56
1163     ldd     [%o0 + 0x10], %f58
1164     ldd     [%o0 + 0x08], %f60
1165     ldd     [%o0 + 0x00], %f62
1166     ldx     [%o1 + 0x00], %g3
1167     ldx     [%o1 + 0x08], %g7
1168     xor     %g1, %g3, %g3
1169     xor     %g2, %g7, %g7
1170     MOVXTOD_G3_F4
1171     MOVXTOD_G7_F6
1172     DECRYPT_256(8, 4, 6, 0, 2)
1173     std     %f4, [%o2 + 0x00]
1174     std     %f6, [%o2 + 0x08]
1175 11: retl
1176      nop
1177 ENDPROC(aes_sparc64_ecb_decrypt_256)
1178 
1179     .align      32
1180 ENTRY(aes_sparc64_cbc_encrypt_128)
1181     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1182     ldd     [%o4 + 0x00], %f4
1183     ldd     [%o4 + 0x08], %f6
1184     ldx     [%o0 + 0x00], %g1
1185     ldx     [%o0 + 0x08], %g2
1186 1:  ldx     [%o1 + 0x00], %g3
1187     ldx     [%o1 + 0x08], %g7
1188     add     %o1, 0x10, %o1
1189     xor     %g1, %g3, %g3
1190     xor     %g2, %g7, %g7
1191     MOVXTOD_G3_F0
1192     MOVXTOD_G7_F2
1193     fxor        %f4, %f0, %f4
1194     fxor        %f6, %f2, %f6
1195     ENCRYPT_128(8, 4, 6, 0, 2)
1196     std     %f4, [%o2 + 0x00]
1197     std     %f6, [%o2 + 0x08]
1198     subcc       %o3, 0x10, %o3
1199     bne,pt      %xcc, 1b
1200      add        %o2, 0x10, %o2
1201     std     %f4, [%o4 + 0x00]
1202     std     %f6, [%o4 + 0x08]
1203     retl
1204      nop
1205 ENDPROC(aes_sparc64_cbc_encrypt_128)
1206 
1207     .align      32
1208 ENTRY(aes_sparc64_cbc_encrypt_192)
1209     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1210     ldd     [%o4 + 0x00], %f4
1211     ldd     [%o4 + 0x08], %f6
1212     ldx     [%o0 + 0x00], %g1
1213     ldx     [%o0 + 0x08], %g2
1214 1:  ldx     [%o1 + 0x00], %g3
1215     ldx     [%o1 + 0x08], %g7
1216     add     %o1, 0x10, %o1
1217     xor     %g1, %g3, %g3
1218     xor     %g2, %g7, %g7
1219     MOVXTOD_G3_F0
1220     MOVXTOD_G7_F2
1221     fxor        %f4, %f0, %f4
1222     fxor        %f6, %f2, %f6
1223     ENCRYPT_192(8, 4, 6, 0, 2)
1224     std     %f4, [%o2 + 0x00]
1225     std     %f6, [%o2 + 0x08]
1226     subcc       %o3, 0x10, %o3
1227     bne,pt      %xcc, 1b
1228      add        %o2, 0x10, %o2
1229     std     %f4, [%o4 + 0x00]
1230     std     %f6, [%o4 + 0x08]
1231     retl
1232      nop
1233 ENDPROC(aes_sparc64_cbc_encrypt_192)
1234 
1235     .align      32
1236 ENTRY(aes_sparc64_cbc_encrypt_256)
1237     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1238     ldd     [%o4 + 0x00], %f4
1239     ldd     [%o4 + 0x08], %f6
1240     ldx     [%o0 + 0x00], %g1
1241     ldx     [%o0 + 0x08], %g2
1242 1:  ldx     [%o1 + 0x00], %g3
1243     ldx     [%o1 + 0x08], %g7
1244     add     %o1, 0x10, %o1
1245     xor     %g1, %g3, %g3
1246     xor     %g2, %g7, %g7
1247     MOVXTOD_G3_F0
1248     MOVXTOD_G7_F2
1249     fxor        %f4, %f0, %f4
1250     fxor        %f6, %f2, %f6
1251     ENCRYPT_256(8, 4, 6, 0, 2)
1252     std     %f4, [%o2 + 0x00]
1253     std     %f6, [%o2 + 0x08]
1254     subcc       %o3, 0x10, %o3
1255     bne,pt      %xcc, 1b
1256      add        %o2, 0x10, %o2
1257     std     %f4, [%o4 + 0x00]
1258     std     %f6, [%o4 + 0x08]
1259     retl
1260      nop
1261 ENDPROC(aes_sparc64_cbc_encrypt_256)
1262 
1263     .align      32
1264 ENTRY(aes_sparc64_cbc_decrypt_128)
1265     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1266     ldx     [%o0 - 0x10], %g1
1267     ldx     [%o0 - 0x08], %g2
1268     ldx     [%o4 + 0x00], %o0
1269     ldx     [%o4 + 0x08], %o5
1270 1:  ldx     [%o1 + 0x00], %g3
1271     ldx     [%o1 + 0x08], %g7
1272     add     %o1, 0x10, %o1
1273     xor     %g1, %g3, %g3
1274     xor     %g2, %g7, %g7
1275     MOVXTOD_G3_F4
1276     MOVXTOD_G7_F6
1277     DECRYPT_128(8, 4, 6, 0, 2)
1278     MOVXTOD_O0_F0
1279     MOVXTOD_O5_F2
1280     xor     %g1, %g3, %o0
1281     xor     %g2, %g7, %o5
1282     fxor        %f4, %f0, %f4
1283     fxor        %f6, %f2, %f6
1284     std     %f4, [%o2 + 0x00]
1285     std     %f6, [%o2 + 0x08]
1286     subcc       %o3, 0x10, %o3
1287     bne,pt      %xcc, 1b
1288      add        %o2, 0x10, %o2
1289     stx     %o0, [%o4 + 0x00]
1290     stx     %o5, [%o4 + 0x08]
1291     retl
1292      nop
1293 ENDPROC(aes_sparc64_cbc_decrypt_128)
1294 
1295     .align      32
1296 ENTRY(aes_sparc64_cbc_decrypt_192)
1297     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1298     ldx     [%o0 - 0x10], %g1
1299     ldx     [%o0 - 0x08], %g2
1300     ldx     [%o4 + 0x00], %o0
1301     ldx     [%o4 + 0x08], %o5
1302 1:  ldx     [%o1 + 0x00], %g3
1303     ldx     [%o1 + 0x08], %g7
1304     add     %o1, 0x10, %o1
1305     xor     %g1, %g3, %g3
1306     xor     %g2, %g7, %g7
1307     MOVXTOD_G3_F4
1308     MOVXTOD_G7_F6
1309     DECRYPT_192(8, 4, 6, 0, 2)
1310     MOVXTOD_O0_F0
1311     MOVXTOD_O5_F2
1312     xor     %g1, %g3, %o0
1313     xor     %g2, %g7, %o5
1314     fxor        %f4, %f0, %f4
1315     fxor        %f6, %f2, %f6
1316     std     %f4, [%o2 + 0x00]
1317     std     %f6, [%o2 + 0x08]
1318     subcc       %o3, 0x10, %o3
1319     bne,pt      %xcc, 1b
1320      add        %o2, 0x10, %o2
1321     stx     %o0, [%o4 + 0x00]
1322     stx     %o5, [%o4 + 0x08]
1323     retl
1324      nop
1325 ENDPROC(aes_sparc64_cbc_decrypt_192)
1326 
1327     .align      32
1328 ENTRY(aes_sparc64_cbc_decrypt_256)
1329     /* %o0=&key[key_len], %o1=input, %o2=output, %o3=len, %o4=iv */
1330     ldx     [%o0 - 0x10], %g1
1331     ldx     [%o0 - 0x08], %g2
1332     ldx     [%o4 + 0x00], %o0
1333     ldx     [%o4 + 0x08], %o5
1334 1:  ldx     [%o1 + 0x00], %g3
1335     ldx     [%o1 + 0x08], %g7
1336     add     %o1, 0x10, %o1
1337     xor     %g1, %g3, %g3
1338     xor     %g2, %g7, %g7
1339     MOVXTOD_G3_F4
1340     MOVXTOD_G7_F6
1341     DECRYPT_256(8, 4, 6, 0, 2)
1342     MOVXTOD_O0_F0
1343     MOVXTOD_O5_F2
1344     xor     %g1, %g3, %o0
1345     xor     %g2, %g7, %o5
1346     fxor        %f4, %f0, %f4
1347     fxor        %f6, %f2, %f6
1348     std     %f4, [%o2 + 0x00]
1349     std     %f6, [%o2 + 0x08]
1350     subcc       %o3, 0x10, %o3
1351     bne,pt      %xcc, 1b
1352      add        %o2, 0x10, %o2
1353     stx     %o0, [%o4 + 0x00]
1354     stx     %o5, [%o4 + 0x08]
1355     retl
1356      nop
1357 ENDPROC(aes_sparc64_cbc_decrypt_256)
1358 
1359     .align      32
1360 ENTRY(aes_sparc64_ctr_crypt_128)
1361     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1362     ldx     [%o4 + 0x00], %g3
1363     ldx     [%o4 + 0x08], %g7
1364     subcc       %o3, 0x10, %o3
1365     ldx     [%o0 + 0x00], %g1
1366     be      10f
1367      ldx        [%o0 + 0x08], %g2
1368 1:  xor     %g1, %g3, %o5
1369     MOVXTOD_O5_F0
1370     xor     %g2, %g7, %o5
1371     MOVXTOD_O5_F2
1372     add     %g7, 1, %g7
1373     add     %g3, 1, %o5
1374     movrz       %g7, %o5, %g3
1375     xor     %g1, %g3, %o5
1376     MOVXTOD_O5_F4
1377     xor     %g2, %g7, %o5
1378     MOVXTOD_O5_F6
1379     add     %g7, 1, %g7
1380     add     %g3, 1, %o5
1381     movrz       %g7, %o5, %g3
1382     ENCRYPT_128_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1383     ldd     [%o1 + 0x00], %f56
1384     ldd     [%o1 + 0x08], %f58
1385     ldd     [%o1 + 0x10], %f60
1386     ldd     [%o1 + 0x18], %f62
1387     fxor        %f56, %f0, %f56
1388     fxor        %f58, %f2, %f58
1389     fxor        %f60, %f4, %f60
1390     fxor        %f62, %f6, %f62
1391     std     %f56, [%o2 + 0x00]
1392     std     %f58, [%o2 + 0x08]
1393     std     %f60, [%o2 + 0x10]
1394     std     %f62, [%o2 + 0x18]
1395     subcc       %o3, 0x20, %o3
1396     add     %o1, 0x20, %o1
1397     brgz        %o3, 1b
1398      add        %o2, 0x20, %o2
1399     brlz,pt     %o3, 11f
1400      nop
1401 10: xor     %g1, %g3, %o5
1402     MOVXTOD_O5_F0
1403     xor     %g2, %g7, %o5
1404     MOVXTOD_O5_F2
1405     add     %g7, 1, %g7
1406     add     %g3, 1, %o5
1407     movrz       %g7, %o5, %g3
1408     ENCRYPT_128(8, 0, 2, 4, 6)
1409     ldd     [%o1 + 0x00], %f4
1410     ldd     [%o1 + 0x08], %f6
1411     fxor        %f4, %f0, %f4
1412     fxor        %f6, %f2, %f6
1413     std     %f4, [%o2 + 0x00]
1414     std     %f6, [%o2 + 0x08]
1415 11: stx     %g3, [%o4 + 0x00]
1416     retl
1417      stx        %g7, [%o4 + 0x08]
1418 ENDPROC(aes_sparc64_ctr_crypt_128)
1419 
1420     .align      32
1421 ENTRY(aes_sparc64_ctr_crypt_192)
1422     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1423     ldx     [%o4 + 0x00], %g3
1424     ldx     [%o4 + 0x08], %g7
1425     subcc       %o3, 0x10, %o3
1426     ldx     [%o0 + 0x00], %g1
1427     be      10f
1428      ldx        [%o0 + 0x08], %g2
1429 1:  xor     %g1, %g3, %o5
1430     MOVXTOD_O5_F0
1431     xor     %g2, %g7, %o5
1432     MOVXTOD_O5_F2
1433     add     %g7, 1, %g7
1434     add     %g3, 1, %o5
1435     movrz       %g7, %o5, %g3
1436     xor     %g1, %g3, %o5
1437     MOVXTOD_O5_F4
1438     xor     %g2, %g7, %o5
1439     MOVXTOD_O5_F6
1440     add     %g7, 1, %g7
1441     add     %g3, 1, %o5
1442     movrz       %g7, %o5, %g3
1443     ENCRYPT_192_2(8, 0, 2, 4, 6, 56, 58, 60, 62)
1444     ldd     [%o1 + 0x00], %f56
1445     ldd     [%o1 + 0x08], %f58
1446     ldd     [%o1 + 0x10], %f60
1447     ldd     [%o1 + 0x18], %f62
1448     fxor        %f56, %f0, %f56
1449     fxor        %f58, %f2, %f58
1450     fxor        %f60, %f4, %f60
1451     fxor        %f62, %f6, %f62
1452     std     %f56, [%o2 + 0x00]
1453     std     %f58, [%o2 + 0x08]
1454     std     %f60, [%o2 + 0x10]
1455     std     %f62, [%o2 + 0x18]
1456     subcc       %o3, 0x20, %o3
1457     add     %o1, 0x20, %o1
1458     brgz        %o3, 1b
1459      add        %o2, 0x20, %o2
1460     brlz,pt     %o3, 11f
1461      nop
1462 10: xor     %g1, %g3, %o5
1463     MOVXTOD_O5_F0
1464     xor     %g2, %g7, %o5
1465     MOVXTOD_O5_F2
1466     add     %g7, 1, %g7
1467     add     %g3, 1, %o5
1468     movrz       %g7, %o5, %g3
1469     ENCRYPT_192(8, 0, 2, 4, 6)
1470     ldd     [%o1 + 0x00], %f4
1471     ldd     [%o1 + 0x08], %f6
1472     fxor        %f4, %f0, %f4
1473     fxor        %f6, %f2, %f6
1474     std     %f4, [%o2 + 0x00]
1475     std     %f6, [%o2 + 0x08]
1476 11: stx     %g3, [%o4 + 0x00]
1477     retl
1478      stx        %g7, [%o4 + 0x08]
1479 ENDPROC(aes_sparc64_ctr_crypt_192)
1480 
1481     .align      32
1482 ENTRY(aes_sparc64_ctr_crypt_256)
1483     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
1484     ldx     [%o4 + 0x00], %g3
1485     ldx     [%o4 + 0x08], %g7
1486     subcc       %o3, 0x10, %o3
1487     ldx     [%o0 + 0x00], %g1
1488     be      10f
1489      ldx        [%o0 + 0x08], %g2
1490 1:  xor     %g1, %g3, %o5
1491     MOVXTOD_O5_F0
1492     xor     %g2, %g7, %o5
1493     MOVXTOD_O5_F2
1494     add     %g7, 1, %g7
1495     add     %g3, 1, %o5
1496     movrz       %g7, %o5, %g3
1497     xor     %g1, %g3, %o5
1498     MOVXTOD_O5_F4
1499     xor     %g2, %g7, %o5
1500     MOVXTOD_O5_F6
1501     add     %g7, 1, %g7
1502     add     %g3, 1, %o5
1503     movrz       %g7, %o5, %g3
1504     ENCRYPT_256_2(8, 0, 2, 4, 6)
1505     ldd     [%o1 + 0x00], %f56
1506     ldd     [%o1 + 0x08], %f58
1507     ldd     [%o1 + 0x10], %f60
1508     ldd     [%o1 + 0x18], %f62
1509     fxor        %f56, %f0, %f56
1510     fxor        %f58, %f2, %f58
1511     fxor        %f60, %f4, %f60
1512     fxor        %f62, %f6, %f62
1513     std     %f56, [%o2 + 0x00]
1514     std     %f58, [%o2 + 0x08]
1515     std     %f60, [%o2 + 0x10]
1516     std     %f62, [%o2 + 0x18]
1517     subcc       %o3, 0x20, %o3
1518     add     %o1, 0x20, %o1
1519     brgz        %o3, 1b
1520      add        %o2, 0x20, %o2
1521     brlz,pt     %o3, 11f
1522      nop
1523 10: ldd     [%o0 + 0xd0], %f56
1524     ldd     [%o0 + 0xd8], %f58
1525     ldd     [%o0 + 0xe0], %f60
1526     ldd     [%o0 + 0xe8], %f62
1527     xor     %g1, %g3, %o5
1528     MOVXTOD_O5_F0
1529     xor     %g2, %g7, %o5
1530     MOVXTOD_O5_F2
1531     add     %g7, 1, %g7
1532     add     %g3, 1, %o5
1533     movrz       %g7, %o5, %g3
1534     ENCRYPT_256(8, 0, 2, 4, 6)
1535     ldd     [%o1 + 0x00], %f4
1536     ldd     [%o1 + 0x08], %f6
1537     fxor        %f4, %f0, %f4
1538     fxor        %f6, %f2, %f6
1539     std     %f4, [%o2 + 0x00]
1540     std     %f6, [%o2 + 0x08]
1541 11: stx     %g3, [%o4 + 0x00]
1542     retl
1543      stx        %g7, [%o4 + 0x08]
1544 ENDPROC(aes_sparc64_ctr_crypt_256)