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