18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/*************************************************************************** 38c2ecf20Sopenharmony_ci* Copyright (C) 2006 by Joachim Fritschi, <jfritschi@freenet.de> * 48c2ecf20Sopenharmony_ci* * 58c2ecf20Sopenharmony_ci***************************************************************************/ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci.file "twofish-i586-asm.S" 88c2ecf20Sopenharmony_ci.text 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/linkage.h> 118c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* return address at 0 */ 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define in_blk 12 /* input byte array address parameter*/ 168c2ecf20Sopenharmony_ci#define out_blk 8 /* output byte array address parameter*/ 178c2ecf20Sopenharmony_ci#define ctx 4 /* Twofish context structure */ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define a_offset 0 208c2ecf20Sopenharmony_ci#define b_offset 4 218c2ecf20Sopenharmony_ci#define c_offset 8 228c2ecf20Sopenharmony_ci#define d_offset 12 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* Structure of the crypto context struct*/ 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define s0 0 /* S0 Array 256 Words each */ 278c2ecf20Sopenharmony_ci#define s1 1024 /* S1 Array */ 288c2ecf20Sopenharmony_ci#define s2 2048 /* S2 Array */ 298c2ecf20Sopenharmony_ci#define s3 3072 /* S3 Array */ 308c2ecf20Sopenharmony_ci#define w 4096 /* 8 whitening keys (word) */ 318c2ecf20Sopenharmony_ci#define k 4128 /* key 1-32 ( word ) */ 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* define a few register aliases to allow macro substitution */ 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define R0D %eax 368c2ecf20Sopenharmony_ci#define R0B %al 378c2ecf20Sopenharmony_ci#define R0H %ah 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define R1D %ebx 408c2ecf20Sopenharmony_ci#define R1B %bl 418c2ecf20Sopenharmony_ci#define R1H %bh 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define R2D %ecx 448c2ecf20Sopenharmony_ci#define R2B %cl 458c2ecf20Sopenharmony_ci#define R2H %ch 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci#define R3D %edx 488c2ecf20Sopenharmony_ci#define R3B %dl 498c2ecf20Sopenharmony_ci#define R3H %dh 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci/* performs input whitening */ 538c2ecf20Sopenharmony_ci#define input_whitening(src,context,offset)\ 548c2ecf20Sopenharmony_ci xor w+offset(context), src; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/* performs input whitening */ 578c2ecf20Sopenharmony_ci#define output_whitening(src,context,offset)\ 588c2ecf20Sopenharmony_ci xor w+16+offset(context), src; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci/* 618c2ecf20Sopenharmony_ci * a input register containing a (rotated 16) 628c2ecf20Sopenharmony_ci * b input register containing b 638c2ecf20Sopenharmony_ci * c input register containing c 648c2ecf20Sopenharmony_ci * d input register containing d (already rol $1) 658c2ecf20Sopenharmony_ci * operations on a and b are interleaved to increase performance 668c2ecf20Sopenharmony_ci */ 678c2ecf20Sopenharmony_ci#define encrypt_round(a,b,c,d,round)\ 688c2ecf20Sopenharmony_ci push d ## D;\ 698c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 708c2ecf20Sopenharmony_ci mov s1(%ebp,%edi,4),d ## D;\ 718c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 728c2ecf20Sopenharmony_ci mov s2(%ebp,%edi,4),%esi;\ 738c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 748c2ecf20Sopenharmony_ci ror $16, b ## D;\ 758c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),d ## D;\ 768c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 778c2ecf20Sopenharmony_ci ror $16, a ## D;\ 788c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),%esi;\ 798c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 808c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),d ## D;\ 818c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 828c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), %esi;\ 838c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 848c2ecf20Sopenharmony_ci ror $15, b ## D;\ 858c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), d ## D;\ 868c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 878c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),%esi;\ 888c2ecf20Sopenharmony_ci pop %edi;\ 898c2ecf20Sopenharmony_ci add d ## D, %esi;\ 908c2ecf20Sopenharmony_ci add %esi, d ## D;\ 918c2ecf20Sopenharmony_ci add k+round(%ebp), %esi;\ 928c2ecf20Sopenharmony_ci xor %esi, c ## D;\ 938c2ecf20Sopenharmony_ci rol $15, c ## D;\ 948c2ecf20Sopenharmony_ci add k+4+round(%ebp),d ## D;\ 958c2ecf20Sopenharmony_ci xor %edi, d ## D; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci/* 988c2ecf20Sopenharmony_ci * a input register containing a (rotated 16) 998c2ecf20Sopenharmony_ci * b input register containing b 1008c2ecf20Sopenharmony_ci * c input register containing c 1018c2ecf20Sopenharmony_ci * d input register containing d (already rol $1) 1028c2ecf20Sopenharmony_ci * operations on a and b are interleaved to increase performance 1038c2ecf20Sopenharmony_ci * last round has different rotations for the output preparation 1048c2ecf20Sopenharmony_ci */ 1058c2ecf20Sopenharmony_ci#define encrypt_last_round(a,b,c,d,round)\ 1068c2ecf20Sopenharmony_ci push d ## D;\ 1078c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1088c2ecf20Sopenharmony_ci mov s1(%ebp,%edi,4),d ## D;\ 1098c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1108c2ecf20Sopenharmony_ci mov s2(%ebp,%edi,4),%esi;\ 1118c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 1128c2ecf20Sopenharmony_ci ror $16, b ## D;\ 1138c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),d ## D;\ 1148c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1158c2ecf20Sopenharmony_ci ror $16, a ## D;\ 1168c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),%esi;\ 1178c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1188c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),d ## D;\ 1198c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1208c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), %esi;\ 1218c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 1228c2ecf20Sopenharmony_ci ror $16, b ## D;\ 1238c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), d ## D;\ 1248c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1258c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),%esi;\ 1268c2ecf20Sopenharmony_ci pop %edi;\ 1278c2ecf20Sopenharmony_ci add d ## D, %esi;\ 1288c2ecf20Sopenharmony_ci add %esi, d ## D;\ 1298c2ecf20Sopenharmony_ci add k+round(%ebp), %esi;\ 1308c2ecf20Sopenharmony_ci xor %esi, c ## D;\ 1318c2ecf20Sopenharmony_ci ror $1, c ## D;\ 1328c2ecf20Sopenharmony_ci add k+4+round(%ebp),d ## D;\ 1338c2ecf20Sopenharmony_ci xor %edi, d ## D; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci/* 1368c2ecf20Sopenharmony_ci * a input register containing a 1378c2ecf20Sopenharmony_ci * b input register containing b (rotated 16) 1388c2ecf20Sopenharmony_ci * c input register containing c 1398c2ecf20Sopenharmony_ci * d input register containing d (already rol $1) 1408c2ecf20Sopenharmony_ci * operations on a and b are interleaved to increase performance 1418c2ecf20Sopenharmony_ci */ 1428c2ecf20Sopenharmony_ci#define decrypt_round(a,b,c,d,round)\ 1438c2ecf20Sopenharmony_ci push c ## D;\ 1448c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1458c2ecf20Sopenharmony_ci mov (%ebp,%edi,4), c ## D;\ 1468c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1478c2ecf20Sopenharmony_ci mov s3(%ebp,%edi,4),%esi;\ 1488c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1498c2ecf20Sopenharmony_ci ror $16, a ## D;\ 1508c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),c ## D;\ 1518c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 1528c2ecf20Sopenharmony_ci ror $16, b ## D;\ 1538c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), %esi;\ 1548c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1558c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),c ## D;\ 1568c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1578c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),%esi;\ 1588c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1598c2ecf20Sopenharmony_ci ror $15, a ## D;\ 1608c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),c ## D;\ 1618c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 1628c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),%esi;\ 1638c2ecf20Sopenharmony_ci pop %edi;\ 1648c2ecf20Sopenharmony_ci add %esi, c ## D;\ 1658c2ecf20Sopenharmony_ci add c ## D, %esi;\ 1668c2ecf20Sopenharmony_ci add k+round(%ebp), c ## D;\ 1678c2ecf20Sopenharmony_ci xor %edi, c ## D;\ 1688c2ecf20Sopenharmony_ci add k+4+round(%ebp),%esi;\ 1698c2ecf20Sopenharmony_ci xor %esi, d ## D;\ 1708c2ecf20Sopenharmony_ci rol $15, d ## D; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci/* 1738c2ecf20Sopenharmony_ci * a input register containing a 1748c2ecf20Sopenharmony_ci * b input register containing b (rotated 16) 1758c2ecf20Sopenharmony_ci * c input register containing c 1768c2ecf20Sopenharmony_ci * d input register containing d (already rol $1) 1778c2ecf20Sopenharmony_ci * operations on a and b are interleaved to increase performance 1788c2ecf20Sopenharmony_ci * last round has different rotations for the output preparation 1798c2ecf20Sopenharmony_ci */ 1808c2ecf20Sopenharmony_ci#define decrypt_last_round(a,b,c,d,round)\ 1818c2ecf20Sopenharmony_ci push c ## D;\ 1828c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1838c2ecf20Sopenharmony_ci mov (%ebp,%edi,4), c ## D;\ 1848c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1858c2ecf20Sopenharmony_ci mov s3(%ebp,%edi,4),%esi;\ 1868c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1878c2ecf20Sopenharmony_ci ror $16, a ## D;\ 1888c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),c ## D;\ 1898c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 1908c2ecf20Sopenharmony_ci ror $16, b ## D;\ 1918c2ecf20Sopenharmony_ci xor (%ebp,%edi,4), %esi;\ 1928c2ecf20Sopenharmony_ci movzx a ## B, %edi;\ 1938c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),c ## D;\ 1948c2ecf20Sopenharmony_ci movzx b ## B, %edi;\ 1958c2ecf20Sopenharmony_ci xor s1(%ebp,%edi,4),%esi;\ 1968c2ecf20Sopenharmony_ci movzx a ## H, %edi;\ 1978c2ecf20Sopenharmony_ci ror $16, a ## D;\ 1988c2ecf20Sopenharmony_ci xor s3(%ebp,%edi,4),c ## D;\ 1998c2ecf20Sopenharmony_ci movzx b ## H, %edi;\ 2008c2ecf20Sopenharmony_ci xor s2(%ebp,%edi,4),%esi;\ 2018c2ecf20Sopenharmony_ci pop %edi;\ 2028c2ecf20Sopenharmony_ci add %esi, c ## D;\ 2038c2ecf20Sopenharmony_ci add c ## D, %esi;\ 2048c2ecf20Sopenharmony_ci add k+round(%ebp), c ## D;\ 2058c2ecf20Sopenharmony_ci xor %edi, c ## D;\ 2068c2ecf20Sopenharmony_ci add k+4+round(%ebp),%esi;\ 2078c2ecf20Sopenharmony_ci xor %esi, d ## D;\ 2088c2ecf20Sopenharmony_ci ror $1, d ## D; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ciSYM_FUNC_START(twofish_enc_blk) 2118c2ecf20Sopenharmony_ci push %ebp /* save registers according to calling convention*/ 2128c2ecf20Sopenharmony_ci push %ebx 2138c2ecf20Sopenharmony_ci push %esi 2148c2ecf20Sopenharmony_ci push %edi 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci mov ctx + 16(%esp), %ebp /* abuse the base pointer: set new base 2178c2ecf20Sopenharmony_ci * pointer to the ctx address */ 2188c2ecf20Sopenharmony_ci mov in_blk+16(%esp),%edi /* input address in edi */ 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci mov (%edi), %eax 2218c2ecf20Sopenharmony_ci mov b_offset(%edi), %ebx 2228c2ecf20Sopenharmony_ci mov c_offset(%edi), %ecx 2238c2ecf20Sopenharmony_ci mov d_offset(%edi), %edx 2248c2ecf20Sopenharmony_ci input_whitening(%eax,%ebp,a_offset) 2258c2ecf20Sopenharmony_ci ror $16, %eax 2268c2ecf20Sopenharmony_ci input_whitening(%ebx,%ebp,b_offset) 2278c2ecf20Sopenharmony_ci input_whitening(%ecx,%ebp,c_offset) 2288c2ecf20Sopenharmony_ci input_whitening(%edx,%ebp,d_offset) 2298c2ecf20Sopenharmony_ci rol $1, %edx 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,0); 2328c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,8); 2338c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,2*8); 2348c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,3*8); 2358c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,4*8); 2368c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,5*8); 2378c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,6*8); 2388c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,7*8); 2398c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,8*8); 2408c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,9*8); 2418c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,10*8); 2428c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,11*8); 2438c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,12*8); 2448c2ecf20Sopenharmony_ci encrypt_round(R2,R3,R0,R1,13*8); 2458c2ecf20Sopenharmony_ci encrypt_round(R0,R1,R2,R3,14*8); 2468c2ecf20Sopenharmony_ci encrypt_last_round(R2,R3,R0,R1,15*8); 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci output_whitening(%eax,%ebp,c_offset) 2498c2ecf20Sopenharmony_ci output_whitening(%ebx,%ebp,d_offset) 2508c2ecf20Sopenharmony_ci output_whitening(%ecx,%ebp,a_offset) 2518c2ecf20Sopenharmony_ci output_whitening(%edx,%ebp,b_offset) 2528c2ecf20Sopenharmony_ci mov out_blk+16(%esp),%edi; 2538c2ecf20Sopenharmony_ci mov %eax, c_offset(%edi) 2548c2ecf20Sopenharmony_ci mov %ebx, d_offset(%edi) 2558c2ecf20Sopenharmony_ci mov %ecx, (%edi) 2568c2ecf20Sopenharmony_ci mov %edx, b_offset(%edi) 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci pop %edi 2598c2ecf20Sopenharmony_ci pop %esi 2608c2ecf20Sopenharmony_ci pop %ebx 2618c2ecf20Sopenharmony_ci pop %ebp 2628c2ecf20Sopenharmony_ci mov $1, %eax 2638c2ecf20Sopenharmony_ci RET 2648c2ecf20Sopenharmony_ciSYM_FUNC_END(twofish_enc_blk) 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ciSYM_FUNC_START(twofish_dec_blk) 2678c2ecf20Sopenharmony_ci push %ebp /* save registers according to calling convention*/ 2688c2ecf20Sopenharmony_ci push %ebx 2698c2ecf20Sopenharmony_ci push %esi 2708c2ecf20Sopenharmony_ci push %edi 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci mov ctx + 16(%esp), %ebp /* abuse the base pointer: set new base 2748c2ecf20Sopenharmony_ci * pointer to the ctx address */ 2758c2ecf20Sopenharmony_ci mov in_blk+16(%esp),%edi /* input address in edi */ 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci mov (%edi), %eax 2788c2ecf20Sopenharmony_ci mov b_offset(%edi), %ebx 2798c2ecf20Sopenharmony_ci mov c_offset(%edi), %ecx 2808c2ecf20Sopenharmony_ci mov d_offset(%edi), %edx 2818c2ecf20Sopenharmony_ci output_whitening(%eax,%ebp,a_offset) 2828c2ecf20Sopenharmony_ci output_whitening(%ebx,%ebp,b_offset) 2838c2ecf20Sopenharmony_ci ror $16, %ebx 2848c2ecf20Sopenharmony_ci output_whitening(%ecx,%ebp,c_offset) 2858c2ecf20Sopenharmony_ci output_whitening(%edx,%ebp,d_offset) 2868c2ecf20Sopenharmony_ci rol $1, %ecx 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,15*8); 2898c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,14*8); 2908c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,13*8); 2918c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,12*8); 2928c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,11*8); 2938c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,10*8); 2948c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,9*8); 2958c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,8*8); 2968c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,7*8); 2978c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,6*8); 2988c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,5*8); 2998c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,4*8); 3008c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,3*8); 3018c2ecf20Sopenharmony_ci decrypt_round(R2,R3,R0,R1,2*8); 3028c2ecf20Sopenharmony_ci decrypt_round(R0,R1,R2,R3,1*8); 3038c2ecf20Sopenharmony_ci decrypt_last_round(R2,R3,R0,R1,0); 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci input_whitening(%eax,%ebp,c_offset) 3068c2ecf20Sopenharmony_ci input_whitening(%ebx,%ebp,d_offset) 3078c2ecf20Sopenharmony_ci input_whitening(%ecx,%ebp,a_offset) 3088c2ecf20Sopenharmony_ci input_whitening(%edx,%ebp,b_offset) 3098c2ecf20Sopenharmony_ci mov out_blk+16(%esp),%edi; 3108c2ecf20Sopenharmony_ci mov %eax, c_offset(%edi) 3118c2ecf20Sopenharmony_ci mov %ebx, d_offset(%edi) 3128c2ecf20Sopenharmony_ci mov %ecx, (%edi) 3138c2ecf20Sopenharmony_ci mov %edx, b_offset(%edi) 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci pop %edi 3168c2ecf20Sopenharmony_ci pop %esi 3178c2ecf20Sopenharmony_ci pop %ebx 3188c2ecf20Sopenharmony_ci pop %ebp 3198c2ecf20Sopenharmony_ci mov $1, %eax 3208c2ecf20Sopenharmony_ci RET 3218c2ecf20Sopenharmony_ciSYM_FUNC_END(twofish_dec_blk) 322