162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#include <linux/linkage.h> 362306a36Sopenharmony_ci#include <asm/visasm.h> 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "opcodes.h" 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#define CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \ 862306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 0, I1, I0, I1) \ 962306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 2, I0, I1, I0) \ 1062306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 4, I1, I0, I1) \ 1162306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 6, I0, I1, I0) \ 1262306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 8, I1, I0, I1) \ 1362306a36Sopenharmony_ci CAMELLIA_F(KEY_BASE + 10, I0, I1, I0) 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define CAMELLIA_6ROUNDS_FL_FLI(KEY_BASE, I0, I1) \ 1662306a36Sopenharmony_ci CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \ 1762306a36Sopenharmony_ci CAMELLIA_FL(KEY_BASE + 12, I0, I0) \ 1862306a36Sopenharmony_ci CAMELLIA_FLI(KEY_BASE + 14, I1, I1) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci .data 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci .align 8 2362306a36Sopenharmony_ciSIGMA: .xword 0xA09E667F3BCC908B 2462306a36Sopenharmony_ci .xword 0xB67AE8584CAA73B2 2562306a36Sopenharmony_ci .xword 0xC6EF372FE94F82BE 2662306a36Sopenharmony_ci .xword 0x54FF53A5F1D36F1C 2762306a36Sopenharmony_ci .xword 0x10E527FADE682D1D 2862306a36Sopenharmony_ci .xword 0xB05688C2B3E6C1FD 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci .text 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci .align 32 3362306a36Sopenharmony_ciENTRY(camellia_sparc64_key_expand) 3462306a36Sopenharmony_ci /* %o0=in_key, %o1=encrypt_key, %o2=key_len, %o3=decrypt_key */ 3562306a36Sopenharmony_ci VISEntry 3662306a36Sopenharmony_ci ld [%o0 + 0x00], %f0 ! i0, k[0] 3762306a36Sopenharmony_ci ld [%o0 + 0x04], %f1 ! i1, k[1] 3862306a36Sopenharmony_ci ld [%o0 + 0x08], %f2 ! i2, k[2] 3962306a36Sopenharmony_ci ld [%o0 + 0x0c], %f3 ! i3, k[3] 4062306a36Sopenharmony_ci std %f0, [%o1 + 0x00] ! k[0, 1] 4162306a36Sopenharmony_ci fsrc2 %f0, %f28 4262306a36Sopenharmony_ci std %f2, [%o1 + 0x08] ! k[2, 3] 4362306a36Sopenharmony_ci cmp %o2, 16 4462306a36Sopenharmony_ci be 10f 4562306a36Sopenharmony_ci fsrc2 %f2, %f30 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ld [%o0 + 0x10], %f0 4862306a36Sopenharmony_ci ld [%o0 + 0x14], %f1 4962306a36Sopenharmony_ci std %f0, [%o1 + 0x20] ! k[8, 9] 5062306a36Sopenharmony_ci cmp %o2, 24 5162306a36Sopenharmony_ci fone %f10 5262306a36Sopenharmony_ci be,a 1f 5362306a36Sopenharmony_ci fxor %f10, %f0, %f2 5462306a36Sopenharmony_ci ld [%o0 + 0x18], %f2 5562306a36Sopenharmony_ci ld [%o0 + 0x1c], %f3 5662306a36Sopenharmony_ci1: 5762306a36Sopenharmony_ci std %f2, [%o1 + 0x28] ! k[10, 11] 5862306a36Sopenharmony_ci fxor %f28, %f0, %f0 5962306a36Sopenharmony_ci fxor %f30, %f2, %f2 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci10: 6262306a36Sopenharmony_ci sethi %hi(SIGMA), %g3 6362306a36Sopenharmony_ci or %g3, %lo(SIGMA), %g3 6462306a36Sopenharmony_ci ldd [%g3 + 0x00], %f16 6562306a36Sopenharmony_ci ldd [%g3 + 0x08], %f18 6662306a36Sopenharmony_ci ldd [%g3 + 0x10], %f20 6762306a36Sopenharmony_ci ldd [%g3 + 0x18], %f22 6862306a36Sopenharmony_ci ldd [%g3 + 0x20], %f24 6962306a36Sopenharmony_ci ldd [%g3 + 0x28], %f26 7062306a36Sopenharmony_ci CAMELLIA_F(16, 2, 0, 2) 7162306a36Sopenharmony_ci CAMELLIA_F(18, 0, 2, 0) 7262306a36Sopenharmony_ci fxor %f28, %f0, %f0 7362306a36Sopenharmony_ci fxor %f30, %f2, %f2 7462306a36Sopenharmony_ci CAMELLIA_F(20, 2, 0, 2) 7562306a36Sopenharmony_ci CAMELLIA_F(22, 0, 2, 0) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define ROTL128(S01, S23, TMP1, TMP2, N) \ 7862306a36Sopenharmony_ci srlx S01, (64 - N), TMP1; \ 7962306a36Sopenharmony_ci sllx S01, N, S01; \ 8062306a36Sopenharmony_ci srlx S23, (64 - N), TMP2; \ 8162306a36Sopenharmony_ci sllx S23, N, S23; \ 8262306a36Sopenharmony_ci or S01, TMP2, S01; \ 8362306a36Sopenharmony_ci or S23, TMP1, S23 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci cmp %o2, 16 8662306a36Sopenharmony_ci bne 1f 8762306a36Sopenharmony_ci nop 8862306a36Sopenharmony_ci /* 128-bit key */ 8962306a36Sopenharmony_ci std %f0, [%o1 + 0x10] ! k[ 4, 5] 9062306a36Sopenharmony_ci std %f2, [%o1 + 0x18] ! k[ 6, 7] 9162306a36Sopenharmony_ci MOVDTOX_F0_O4 9262306a36Sopenharmony_ci MOVDTOX_F2_O5 9362306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 9462306a36Sopenharmony_ci stx %o4, [%o1 + 0x30] ! k[12, 13] 9562306a36Sopenharmony_ci stx %o5, [%o1 + 0x38] ! k[14, 15] 9662306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 9762306a36Sopenharmony_ci stx %o4, [%o1 + 0x40] ! k[16, 17] 9862306a36Sopenharmony_ci stx %o5, [%o1 + 0x48] ! k[18, 19] 9962306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 10062306a36Sopenharmony_ci stx %o4, [%o1 + 0x60] ! k[24, 25] 10162306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 10262306a36Sopenharmony_ci stx %o4, [%o1 + 0x70] ! k[28, 29] 10362306a36Sopenharmony_ci stx %o5, [%o1 + 0x78] ! k[30, 31] 10462306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 34) 10562306a36Sopenharmony_ci stx %o4, [%o1 + 0xa0] ! k[40, 41] 10662306a36Sopenharmony_ci stx %o5, [%o1 + 0xa8] ! k[42, 43] 10762306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 17) 10862306a36Sopenharmony_ci stx %o4, [%o1 + 0xc0] ! k[48, 49] 10962306a36Sopenharmony_ci stx %o5, [%o1 + 0xc8] ! k[50, 51] 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci ldx [%o1 + 0x00], %o4 ! k[ 0, 1] 11262306a36Sopenharmony_ci ldx [%o1 + 0x08], %o5 ! k[ 2, 3] 11362306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 11462306a36Sopenharmony_ci stx %o4, [%o1 + 0x20] ! k[ 8, 9] 11562306a36Sopenharmony_ci stx %o5, [%o1 + 0x28] ! k[10, 11] 11662306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 30) 11762306a36Sopenharmony_ci stx %o4, [%o1 + 0x50] ! k[20, 21] 11862306a36Sopenharmony_ci stx %o5, [%o1 + 0x58] ! k[22, 23] 11962306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 12062306a36Sopenharmony_ci stx %o5, [%o1 + 0x68] ! k[26, 27] 12162306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 17) 12262306a36Sopenharmony_ci stx %o4, [%o1 + 0x80] ! k[32, 33] 12362306a36Sopenharmony_ci stx %o5, [%o1 + 0x88] ! k[34, 35] 12462306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 17) 12562306a36Sopenharmony_ci stx %o4, [%o1 + 0x90] ! k[36, 37] 12662306a36Sopenharmony_ci stx %o5, [%o1 + 0x98] ! k[38, 39] 12762306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 17) 12862306a36Sopenharmony_ci stx %o4, [%o1 + 0xb0] ! k[44, 45] 12962306a36Sopenharmony_ci stx %o5, [%o1 + 0xb8] ! k[46, 47] 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci ba,pt %xcc, 2f 13262306a36Sopenharmony_ci mov (3 * 16 * 4), %o0 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci1: 13562306a36Sopenharmony_ci /* 192-bit or 256-bit key */ 13662306a36Sopenharmony_ci std %f0, [%o1 + 0x30] ! k[12, 13] 13762306a36Sopenharmony_ci std %f2, [%o1 + 0x38] ! k[14, 15] 13862306a36Sopenharmony_ci ldd [%o1 + 0x20], %f4 ! k[ 8, 9] 13962306a36Sopenharmony_ci ldd [%o1 + 0x28], %f6 ! k[10, 11] 14062306a36Sopenharmony_ci fxor %f0, %f4, %f0 14162306a36Sopenharmony_ci fxor %f2, %f6, %f2 14262306a36Sopenharmony_ci CAMELLIA_F(24, 2, 0, 2) 14362306a36Sopenharmony_ci CAMELLIA_F(26, 0, 2, 0) 14462306a36Sopenharmony_ci std %f0, [%o1 + 0x10] ! k[ 4, 5] 14562306a36Sopenharmony_ci std %f2, [%o1 + 0x18] ! k[ 6, 7] 14662306a36Sopenharmony_ci MOVDTOX_F0_O4 14762306a36Sopenharmony_ci MOVDTOX_F2_O5 14862306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 30) 14962306a36Sopenharmony_ci stx %o4, [%o1 + 0x50] ! k[20, 21] 15062306a36Sopenharmony_ci stx %o5, [%o1 + 0x58] ! k[22, 23] 15162306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 30) 15262306a36Sopenharmony_ci stx %o4, [%o1 + 0xa0] ! k[40, 41] 15362306a36Sopenharmony_ci stx %o5, [%o1 + 0xa8] ! k[42, 43] 15462306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 51) 15562306a36Sopenharmony_ci stx %o4, [%o1 + 0x100] ! k[64, 65] 15662306a36Sopenharmony_ci stx %o5, [%o1 + 0x108] ! k[66, 67] 15762306a36Sopenharmony_ci ldx [%o1 + 0x20], %o4 ! k[ 8, 9] 15862306a36Sopenharmony_ci ldx [%o1 + 0x28], %o5 ! k[10, 11] 15962306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 16062306a36Sopenharmony_ci stx %o4, [%o1 + 0x20] ! k[ 8, 9] 16162306a36Sopenharmony_ci stx %o5, [%o1 + 0x28] ! k[10, 11] 16262306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 16362306a36Sopenharmony_ci stx %o4, [%o1 + 0x40] ! k[16, 17] 16462306a36Sopenharmony_ci stx %o5, [%o1 + 0x48] ! k[18, 19] 16562306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 30) 16662306a36Sopenharmony_ci stx %o4, [%o1 + 0x90] ! k[36, 37] 16762306a36Sopenharmony_ci stx %o5, [%o1 + 0x98] ! k[38, 39] 16862306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 34) 16962306a36Sopenharmony_ci stx %o4, [%o1 + 0xd0] ! k[52, 53] 17062306a36Sopenharmony_ci stx %o5, [%o1 + 0xd8] ! k[54, 55] 17162306a36Sopenharmony_ci ldx [%o1 + 0x30], %o4 ! k[12, 13] 17262306a36Sopenharmony_ci ldx [%o1 + 0x38], %o5 ! k[14, 15] 17362306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 17462306a36Sopenharmony_ci stx %o4, [%o1 + 0x30] ! k[12, 13] 17562306a36Sopenharmony_ci stx %o5, [%o1 + 0x38] ! k[14, 15] 17662306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 30) 17762306a36Sopenharmony_ci stx %o4, [%o1 + 0x70] ! k[28, 29] 17862306a36Sopenharmony_ci stx %o5, [%o1 + 0x78] ! k[30, 31] 17962306a36Sopenharmony_ci srlx %o4, 32, %g2 18062306a36Sopenharmony_ci srlx %o5, 32, %g3 18162306a36Sopenharmony_ci stw %o4, [%o1 + 0xc0] ! k[48] 18262306a36Sopenharmony_ci stw %g3, [%o1 + 0xc4] ! k[49] 18362306a36Sopenharmony_ci stw %o5, [%o1 + 0xc8] ! k[50] 18462306a36Sopenharmony_ci stw %g2, [%o1 + 0xcc] ! k[51] 18562306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 49) 18662306a36Sopenharmony_ci stx %o4, [%o1 + 0xe0] ! k[56, 57] 18762306a36Sopenharmony_ci stx %o5, [%o1 + 0xe8] ! k[58, 59] 18862306a36Sopenharmony_ci ldx [%o1 + 0x00], %o4 ! k[ 0, 1] 18962306a36Sopenharmony_ci ldx [%o1 + 0x08], %o5 ! k[ 2, 3] 19062306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 45) 19162306a36Sopenharmony_ci stx %o4, [%o1 + 0x60] ! k[24, 25] 19262306a36Sopenharmony_ci stx %o5, [%o1 + 0x68] ! k[26, 27] 19362306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 15) 19462306a36Sopenharmony_ci stx %o4, [%o1 + 0x80] ! k[32, 33] 19562306a36Sopenharmony_ci stx %o5, [%o1 + 0x88] ! k[34, 35] 19662306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 17) 19762306a36Sopenharmony_ci stx %o4, [%o1 + 0xb0] ! k[44, 45] 19862306a36Sopenharmony_ci stx %o5, [%o1 + 0xb8] ! k[46, 47] 19962306a36Sopenharmony_ci ROTL128(%o4, %o5, %g2, %g3, 34) 20062306a36Sopenharmony_ci stx %o4, [%o1 + 0xf0] ! k[60, 61] 20162306a36Sopenharmony_ci stx %o5, [%o1 + 0xf8] ! k[62, 63] 20262306a36Sopenharmony_ci mov (4 * 16 * 4), %o0 20362306a36Sopenharmony_ci2: 20462306a36Sopenharmony_ci add %o1, %o0, %o1 20562306a36Sopenharmony_ci ldd [%o1 + 0x00], %f0 20662306a36Sopenharmony_ci ldd [%o1 + 0x08], %f2 20762306a36Sopenharmony_ci std %f0, [%o3 + 0x00] 20862306a36Sopenharmony_ci std %f2, [%o3 + 0x08] 20962306a36Sopenharmony_ci add %o3, 0x10, %o3 21062306a36Sopenharmony_ci1: 21162306a36Sopenharmony_ci sub %o1, (16 * 4), %o1 21262306a36Sopenharmony_ci ldd [%o1 + 0x38], %f0 21362306a36Sopenharmony_ci ldd [%o1 + 0x30], %f2 21462306a36Sopenharmony_ci ldd [%o1 + 0x28], %f4 21562306a36Sopenharmony_ci ldd [%o1 + 0x20], %f6 21662306a36Sopenharmony_ci ldd [%o1 + 0x18], %f8 21762306a36Sopenharmony_ci ldd [%o1 + 0x10], %f10 21862306a36Sopenharmony_ci std %f0, [%o3 + 0x00] 21962306a36Sopenharmony_ci std %f2, [%o3 + 0x08] 22062306a36Sopenharmony_ci std %f4, [%o3 + 0x10] 22162306a36Sopenharmony_ci std %f6, [%o3 + 0x18] 22262306a36Sopenharmony_ci std %f8, [%o3 + 0x20] 22362306a36Sopenharmony_ci std %f10, [%o3 + 0x28] 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci ldd [%o1 + 0x08], %f0 22662306a36Sopenharmony_ci ldd [%o1 + 0x00], %f2 22762306a36Sopenharmony_ci std %f0, [%o3 + 0x30] 22862306a36Sopenharmony_ci std %f2, [%o3 + 0x38] 22962306a36Sopenharmony_ci subcc %o0, (16 * 4), %o0 23062306a36Sopenharmony_ci bne,pt %icc, 1b 23162306a36Sopenharmony_ci add %o3, (16 * 4), %o3 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci std %f2, [%o3 - 0x10] 23462306a36Sopenharmony_ci std %f0, [%o3 - 0x08] 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci retl 23762306a36Sopenharmony_ci VISExit 23862306a36Sopenharmony_ciENDPROC(camellia_sparc64_key_expand) 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci .align 32 24162306a36Sopenharmony_ciENTRY(camellia_sparc64_crypt) 24262306a36Sopenharmony_ci /* %o0=key, %o1=input, %o2=output, %o3=key_len */ 24362306a36Sopenharmony_ci VISEntry 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci ld [%o1 + 0x00], %f0 24662306a36Sopenharmony_ci ld [%o1 + 0x04], %f1 24762306a36Sopenharmony_ci ld [%o1 + 0x08], %f2 24862306a36Sopenharmony_ci ld [%o1 + 0x0c], %f3 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci ldd [%o0 + 0x00], %f4 25162306a36Sopenharmony_ci ldd [%o0 + 0x08], %f6 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci cmp %o3, 16 25462306a36Sopenharmony_ci fxor %f4, %f0, %f0 25562306a36Sopenharmony_ci be 1f 25662306a36Sopenharmony_ci fxor %f6, %f2, %f2 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci ldd [%o0 + 0x10], %f8 25962306a36Sopenharmony_ci ldd [%o0 + 0x18], %f10 26062306a36Sopenharmony_ci ldd [%o0 + 0x20], %f12 26162306a36Sopenharmony_ci ldd [%o0 + 0x28], %f14 26262306a36Sopenharmony_ci ldd [%o0 + 0x30], %f16 26362306a36Sopenharmony_ci ldd [%o0 + 0x38], %f18 26462306a36Sopenharmony_ci ldd [%o0 + 0x40], %f20 26562306a36Sopenharmony_ci ldd [%o0 + 0x48], %f22 26662306a36Sopenharmony_ci add %o0, 0x40, %o0 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci1: 27162306a36Sopenharmony_ci ldd [%o0 + 0x10], %f8 27262306a36Sopenharmony_ci ldd [%o0 + 0x18], %f10 27362306a36Sopenharmony_ci ldd [%o0 + 0x20], %f12 27462306a36Sopenharmony_ci ldd [%o0 + 0x28], %f14 27562306a36Sopenharmony_ci ldd [%o0 + 0x30], %f16 27662306a36Sopenharmony_ci ldd [%o0 + 0x38], %f18 27762306a36Sopenharmony_ci ldd [%o0 + 0x40], %f20 27862306a36Sopenharmony_ci ldd [%o0 + 0x48], %f22 27962306a36Sopenharmony_ci ldd [%o0 + 0x50], %f24 28062306a36Sopenharmony_ci ldd [%o0 + 0x58], %f26 28162306a36Sopenharmony_ci ldd [%o0 + 0x60], %f28 28262306a36Sopenharmony_ci ldd [%o0 + 0x68], %f30 28362306a36Sopenharmony_ci ldd [%o0 + 0x70], %f32 28462306a36Sopenharmony_ci ldd [%o0 + 0x78], %f34 28562306a36Sopenharmony_ci ldd [%o0 + 0x80], %f36 28662306a36Sopenharmony_ci ldd [%o0 + 0x88], %f38 28762306a36Sopenharmony_ci ldd [%o0 + 0x90], %f40 28862306a36Sopenharmony_ci ldd [%o0 + 0x98], %f42 28962306a36Sopenharmony_ci ldd [%o0 + 0xa0], %f44 29062306a36Sopenharmony_ci ldd [%o0 + 0xa8], %f46 29162306a36Sopenharmony_ci ldd [%o0 + 0xb0], %f48 29262306a36Sopenharmony_ci ldd [%o0 + 0xb8], %f50 29362306a36Sopenharmony_ci ldd [%o0 + 0xc0], %f52 29462306a36Sopenharmony_ci ldd [%o0 + 0xc8], %f54 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 29762306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 29862306a36Sopenharmony_ci CAMELLIA_6ROUNDS(40, 0, 2) 29962306a36Sopenharmony_ci fxor %f52, %f2, %f2 30062306a36Sopenharmony_ci fxor %f54, %f0, %f0 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci st %f2, [%o2 + 0x00] 30362306a36Sopenharmony_ci st %f3, [%o2 + 0x04] 30462306a36Sopenharmony_ci st %f0, [%o2 + 0x08] 30562306a36Sopenharmony_ci st %f1, [%o2 + 0x0c] 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci retl 30862306a36Sopenharmony_ci VISExit 30962306a36Sopenharmony_ciENDPROC(camellia_sparc64_crypt) 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci .align 32 31262306a36Sopenharmony_ciENTRY(camellia_sparc64_load_keys) 31362306a36Sopenharmony_ci /* %o0=key, %o1=key_len */ 31462306a36Sopenharmony_ci VISEntry 31562306a36Sopenharmony_ci ldd [%o0 + 0x00], %f4 31662306a36Sopenharmony_ci ldd [%o0 + 0x08], %f6 31762306a36Sopenharmony_ci ldd [%o0 + 0x10], %f8 31862306a36Sopenharmony_ci ldd [%o0 + 0x18], %f10 31962306a36Sopenharmony_ci ldd [%o0 + 0x20], %f12 32062306a36Sopenharmony_ci ldd [%o0 + 0x28], %f14 32162306a36Sopenharmony_ci ldd [%o0 + 0x30], %f16 32262306a36Sopenharmony_ci ldd [%o0 + 0x38], %f18 32362306a36Sopenharmony_ci ldd [%o0 + 0x40], %f20 32462306a36Sopenharmony_ci ldd [%o0 + 0x48], %f22 32562306a36Sopenharmony_ci ldd [%o0 + 0x50], %f24 32662306a36Sopenharmony_ci ldd [%o0 + 0x58], %f26 32762306a36Sopenharmony_ci ldd [%o0 + 0x60], %f28 32862306a36Sopenharmony_ci ldd [%o0 + 0x68], %f30 32962306a36Sopenharmony_ci ldd [%o0 + 0x70], %f32 33062306a36Sopenharmony_ci ldd [%o0 + 0x78], %f34 33162306a36Sopenharmony_ci ldd [%o0 + 0x80], %f36 33262306a36Sopenharmony_ci ldd [%o0 + 0x88], %f38 33362306a36Sopenharmony_ci ldd [%o0 + 0x90], %f40 33462306a36Sopenharmony_ci ldd [%o0 + 0x98], %f42 33562306a36Sopenharmony_ci ldd [%o0 + 0xa0], %f44 33662306a36Sopenharmony_ci ldd [%o0 + 0xa8], %f46 33762306a36Sopenharmony_ci ldd [%o0 + 0xb0], %f48 33862306a36Sopenharmony_ci ldd [%o0 + 0xb8], %f50 33962306a36Sopenharmony_ci ldd [%o0 + 0xc0], %f52 34062306a36Sopenharmony_ci retl 34162306a36Sopenharmony_ci ldd [%o0 + 0xc8], %f54 34262306a36Sopenharmony_ciENDPROC(camellia_sparc64_load_keys) 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci .align 32 34562306a36Sopenharmony_ciENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds) 34662306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key */ 34762306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f0 34862306a36Sopenharmony_ci ldd [%o0 + 0x08], %f2 34962306a36Sopenharmony_ci add %o0, 0x10, %o0 35062306a36Sopenharmony_ci fxor %f4, %f0, %f0 35162306a36Sopenharmony_ci fxor %f6, %f2, %f2 35262306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 35362306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 35462306a36Sopenharmony_ci CAMELLIA_6ROUNDS(40, 0, 2) 35562306a36Sopenharmony_ci fxor %f52, %f2, %f2 35662306a36Sopenharmony_ci fxor %f54, %f0, %f0 35762306a36Sopenharmony_ci std %f2, [%o1 + 0x00] 35862306a36Sopenharmony_ci std %f0, [%o1 + 0x08] 35962306a36Sopenharmony_ci subcc %o2, 0x10, %o2 36062306a36Sopenharmony_ci bne,pt %icc, 1b 36162306a36Sopenharmony_ci add %o1, 0x10, %o1 36262306a36Sopenharmony_ci retl 36362306a36Sopenharmony_ci nop 36462306a36Sopenharmony_ciENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds) 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci .align 32 36762306a36Sopenharmony_ciENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds) 36862306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key */ 36962306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f0 37062306a36Sopenharmony_ci ldd [%o0 + 0x08], %f2 37162306a36Sopenharmony_ci add %o0, 0x10, %o0 37262306a36Sopenharmony_ci fxor %f4, %f0, %f0 37362306a36Sopenharmony_ci fxor %f6, %f2, %f2 37462306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 37562306a36Sopenharmony_ci ldd [%o3 + 0xd0], %f8 37662306a36Sopenharmony_ci ldd [%o3 + 0xd8], %f10 37762306a36Sopenharmony_ci ldd [%o3 + 0xe0], %f12 37862306a36Sopenharmony_ci ldd [%o3 + 0xe8], %f14 37962306a36Sopenharmony_ci ldd [%o3 + 0xf0], %f16 38062306a36Sopenharmony_ci ldd [%o3 + 0xf8], %f18 38162306a36Sopenharmony_ci ldd [%o3 + 0x100], %f20 38262306a36Sopenharmony_ci ldd [%o3 + 0x108], %f22 38362306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 38462306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) 38562306a36Sopenharmony_ci CAMELLIA_F(8, 2, 0, 2) 38662306a36Sopenharmony_ci CAMELLIA_F(10, 0, 2, 0) 38762306a36Sopenharmony_ci ldd [%o3 + 0x10], %f8 38862306a36Sopenharmony_ci ldd [%o3 + 0x18], %f10 38962306a36Sopenharmony_ci CAMELLIA_F(12, 2, 0, 2) 39062306a36Sopenharmony_ci CAMELLIA_F(14, 0, 2, 0) 39162306a36Sopenharmony_ci ldd [%o3 + 0x20], %f12 39262306a36Sopenharmony_ci ldd [%o3 + 0x28], %f14 39362306a36Sopenharmony_ci CAMELLIA_F(16, 2, 0, 2) 39462306a36Sopenharmony_ci CAMELLIA_F(18, 0, 2, 0) 39562306a36Sopenharmony_ci ldd [%o3 + 0x30], %f16 39662306a36Sopenharmony_ci ldd [%o3 + 0x38], %f18 39762306a36Sopenharmony_ci fxor %f20, %f2, %f2 39862306a36Sopenharmony_ci fxor %f22, %f0, %f0 39962306a36Sopenharmony_ci ldd [%o3 + 0x40], %f20 40062306a36Sopenharmony_ci ldd [%o3 + 0x48], %f22 40162306a36Sopenharmony_ci std %f2, [%o1 + 0x00] 40262306a36Sopenharmony_ci std %f0, [%o1 + 0x08] 40362306a36Sopenharmony_ci subcc %o2, 0x10, %o2 40462306a36Sopenharmony_ci bne,pt %icc, 1b 40562306a36Sopenharmony_ci add %o1, 0x10, %o1 40662306a36Sopenharmony_ci retl 40762306a36Sopenharmony_ci nop 40862306a36Sopenharmony_ciENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds) 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci .align 32 41162306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_encrypt_3_grand_rounds) 41262306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ 41362306a36Sopenharmony_ci ldd [%o4 + 0x00], %f60 41462306a36Sopenharmony_ci ldd [%o4 + 0x08], %f62 41562306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f0 41662306a36Sopenharmony_ci ldd [%o0 + 0x08], %f2 41762306a36Sopenharmony_ci add %o0, 0x10, %o0 41862306a36Sopenharmony_ci fxor %f60, %f0, %f0 41962306a36Sopenharmony_ci fxor %f62, %f2, %f2 42062306a36Sopenharmony_ci fxor %f4, %f0, %f0 42162306a36Sopenharmony_ci fxor %f6, %f2, %f2 42262306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 42362306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 42462306a36Sopenharmony_ci CAMELLIA_6ROUNDS(40, 0, 2) 42562306a36Sopenharmony_ci fxor %f52, %f2, %f60 42662306a36Sopenharmony_ci fxor %f54, %f0, %f62 42762306a36Sopenharmony_ci std %f60, [%o1 + 0x00] 42862306a36Sopenharmony_ci std %f62, [%o1 + 0x08] 42962306a36Sopenharmony_ci subcc %o2, 0x10, %o2 43062306a36Sopenharmony_ci bne,pt %icc, 1b 43162306a36Sopenharmony_ci add %o1, 0x10, %o1 43262306a36Sopenharmony_ci std %f60, [%o4 + 0x00] 43362306a36Sopenharmony_ci retl 43462306a36Sopenharmony_ci std %f62, [%o4 + 0x08] 43562306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds) 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci .align 32 43862306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_encrypt_4_grand_rounds) 43962306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ 44062306a36Sopenharmony_ci ldd [%o4 + 0x00], %f60 44162306a36Sopenharmony_ci ldd [%o4 + 0x08], %f62 44262306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f0 44362306a36Sopenharmony_ci ldd [%o0 + 0x08], %f2 44462306a36Sopenharmony_ci add %o0, 0x10, %o0 44562306a36Sopenharmony_ci fxor %f60, %f0, %f0 44662306a36Sopenharmony_ci fxor %f62, %f2, %f2 44762306a36Sopenharmony_ci fxor %f4, %f0, %f0 44862306a36Sopenharmony_ci fxor %f6, %f2, %f2 44962306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 45062306a36Sopenharmony_ci ldd [%o3 + 0xd0], %f8 45162306a36Sopenharmony_ci ldd [%o3 + 0xd8], %f10 45262306a36Sopenharmony_ci ldd [%o3 + 0xe0], %f12 45362306a36Sopenharmony_ci ldd [%o3 + 0xe8], %f14 45462306a36Sopenharmony_ci ldd [%o3 + 0xf0], %f16 45562306a36Sopenharmony_ci ldd [%o3 + 0xf8], %f18 45662306a36Sopenharmony_ci ldd [%o3 + 0x100], %f20 45762306a36Sopenharmony_ci ldd [%o3 + 0x108], %f22 45862306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 45962306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) 46062306a36Sopenharmony_ci CAMELLIA_F(8, 2, 0, 2) 46162306a36Sopenharmony_ci CAMELLIA_F(10, 0, 2, 0) 46262306a36Sopenharmony_ci ldd [%o3 + 0x10], %f8 46362306a36Sopenharmony_ci ldd [%o3 + 0x18], %f10 46462306a36Sopenharmony_ci CAMELLIA_F(12, 2, 0, 2) 46562306a36Sopenharmony_ci CAMELLIA_F(14, 0, 2, 0) 46662306a36Sopenharmony_ci ldd [%o3 + 0x20], %f12 46762306a36Sopenharmony_ci ldd [%o3 + 0x28], %f14 46862306a36Sopenharmony_ci CAMELLIA_F(16, 2, 0, 2) 46962306a36Sopenharmony_ci CAMELLIA_F(18, 0, 2, 0) 47062306a36Sopenharmony_ci ldd [%o3 + 0x30], %f16 47162306a36Sopenharmony_ci ldd [%o3 + 0x38], %f18 47262306a36Sopenharmony_ci fxor %f20, %f2, %f60 47362306a36Sopenharmony_ci fxor %f22, %f0, %f62 47462306a36Sopenharmony_ci ldd [%o3 + 0x40], %f20 47562306a36Sopenharmony_ci ldd [%o3 + 0x48], %f22 47662306a36Sopenharmony_ci std %f60, [%o1 + 0x00] 47762306a36Sopenharmony_ci std %f62, [%o1 + 0x08] 47862306a36Sopenharmony_ci subcc %o2, 0x10, %o2 47962306a36Sopenharmony_ci bne,pt %icc, 1b 48062306a36Sopenharmony_ci add %o1, 0x10, %o1 48162306a36Sopenharmony_ci std %f60, [%o4 + 0x00] 48262306a36Sopenharmony_ci retl 48362306a36Sopenharmony_ci std %f62, [%o4 + 0x08] 48462306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds) 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci .align 32 48762306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_decrypt_3_grand_rounds) 48862306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ 48962306a36Sopenharmony_ci ldd [%o4 + 0x00], %f60 49062306a36Sopenharmony_ci ldd [%o4 + 0x08], %f62 49162306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f56 49262306a36Sopenharmony_ci ldd [%o0 + 0x08], %f58 49362306a36Sopenharmony_ci add %o0, 0x10, %o0 49462306a36Sopenharmony_ci fxor %f4, %f56, %f0 49562306a36Sopenharmony_ci fxor %f6, %f58, %f2 49662306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 49762306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 49862306a36Sopenharmony_ci CAMELLIA_6ROUNDS(40, 0, 2) 49962306a36Sopenharmony_ci fxor %f52, %f2, %f2 50062306a36Sopenharmony_ci fxor %f54, %f0, %f0 50162306a36Sopenharmony_ci fxor %f60, %f2, %f2 50262306a36Sopenharmony_ci fxor %f62, %f0, %f0 50362306a36Sopenharmony_ci fsrc2 %f56, %f60 50462306a36Sopenharmony_ci fsrc2 %f58, %f62 50562306a36Sopenharmony_ci std %f2, [%o1 + 0x00] 50662306a36Sopenharmony_ci std %f0, [%o1 + 0x08] 50762306a36Sopenharmony_ci subcc %o2, 0x10, %o2 50862306a36Sopenharmony_ci bne,pt %icc, 1b 50962306a36Sopenharmony_ci add %o1, 0x10, %o1 51062306a36Sopenharmony_ci std %f60, [%o4 + 0x00] 51162306a36Sopenharmony_ci retl 51262306a36Sopenharmony_ci std %f62, [%o4 + 0x08] 51362306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds) 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci .align 32 51662306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_decrypt_4_grand_rounds) 51762306a36Sopenharmony_ci /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ 51862306a36Sopenharmony_ci ldd [%o4 + 0x00], %f60 51962306a36Sopenharmony_ci ldd [%o4 + 0x08], %f62 52062306a36Sopenharmony_ci1: ldd [%o0 + 0x00], %f56 52162306a36Sopenharmony_ci ldd [%o0 + 0x08], %f58 52262306a36Sopenharmony_ci add %o0, 0x10, %o0 52362306a36Sopenharmony_ci fxor %f4, %f56, %f0 52462306a36Sopenharmony_ci fxor %f6, %f58, %f2 52562306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) 52662306a36Sopenharmony_ci ldd [%o3 + 0xd0], %f8 52762306a36Sopenharmony_ci ldd [%o3 + 0xd8], %f10 52862306a36Sopenharmony_ci ldd [%o3 + 0xe0], %f12 52962306a36Sopenharmony_ci ldd [%o3 + 0xe8], %f14 53062306a36Sopenharmony_ci ldd [%o3 + 0xf0], %f16 53162306a36Sopenharmony_ci ldd [%o3 + 0xf8], %f18 53262306a36Sopenharmony_ci ldd [%o3 + 0x100], %f20 53362306a36Sopenharmony_ci ldd [%o3 + 0x108], %f22 53462306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) 53562306a36Sopenharmony_ci CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) 53662306a36Sopenharmony_ci CAMELLIA_F(8, 2, 0, 2) 53762306a36Sopenharmony_ci CAMELLIA_F(10, 0, 2, 0) 53862306a36Sopenharmony_ci ldd [%o3 + 0x10], %f8 53962306a36Sopenharmony_ci ldd [%o3 + 0x18], %f10 54062306a36Sopenharmony_ci CAMELLIA_F(12, 2, 0, 2) 54162306a36Sopenharmony_ci CAMELLIA_F(14, 0, 2, 0) 54262306a36Sopenharmony_ci ldd [%o3 + 0x20], %f12 54362306a36Sopenharmony_ci ldd [%o3 + 0x28], %f14 54462306a36Sopenharmony_ci CAMELLIA_F(16, 2, 0, 2) 54562306a36Sopenharmony_ci CAMELLIA_F(18, 0, 2, 0) 54662306a36Sopenharmony_ci ldd [%o3 + 0x30], %f16 54762306a36Sopenharmony_ci ldd [%o3 + 0x38], %f18 54862306a36Sopenharmony_ci fxor %f20, %f2, %f2 54962306a36Sopenharmony_ci fxor %f22, %f0, %f0 55062306a36Sopenharmony_ci ldd [%o3 + 0x40], %f20 55162306a36Sopenharmony_ci ldd [%o3 + 0x48], %f22 55262306a36Sopenharmony_ci fxor %f60, %f2, %f2 55362306a36Sopenharmony_ci fxor %f62, %f0, %f0 55462306a36Sopenharmony_ci fsrc2 %f56, %f60 55562306a36Sopenharmony_ci fsrc2 %f58, %f62 55662306a36Sopenharmony_ci std %f2, [%o1 + 0x00] 55762306a36Sopenharmony_ci std %f0, [%o1 + 0x08] 55862306a36Sopenharmony_ci subcc %o2, 0x10, %o2 55962306a36Sopenharmony_ci bne,pt %icc, 1b 56062306a36Sopenharmony_ci add %o1, 0x10, %o1 56162306a36Sopenharmony_ci std %f60, [%o4 + 0x00] 56262306a36Sopenharmony_ci retl 56362306a36Sopenharmony_ci std %f62, [%o4 + 0x08] 56462306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds) 565