How do I make register allocation behave?

George Spelvin linux@horizon.com
Fri May 27 01:37:00 GMT 2011


This is some low-level crypto code, an MMX implementation of Dan
Bernstien's "ChaCha" pseudorandom function.  The input is a 4x4 array
of 32-bit words, and mixing proceeds down either columns or diagonals.

Thus, the implementation keeps each row in a pair of MMX registers,
does mixing down the columns, then swizzles the rows (shear), mixes down
the colums again, then unshears.

It maps very nicely to sse2 registers, but I was trying to write an MMX
implementation for completeness.  This is tricky because I really need
9 registers, but I have only 8.

I could of course write this in straight assembly, but I was trying to get
gcc to do instruction scheduling for me.  I have progressibely added
more and more "keep this in MMX registers, damn it!" hints to the source,
but GCC keeps generating preposterously large stack frames.
(This example of 516 bytes is better than the 2000+ bytes I started with
before adding all the explicit register specifications.)

I realize that the register pressure is extreme, but I'm handing gcc
statements that map directly to 2-address instructions, and I'm not sure
how much more I can do.

Is there some elementary mistake I'm making?  Or should I just stop being cruel
to the compiler?

System is (32-bit) Debian Linux, gcc version 4.6.1 20110524 (prerelease) (Debian 4.6.0-9)
cc -W -Wall -Os -fomit-frame-pointer -march=pentium2 -mmmx -mno-sse -S chacha1.c
gcc -v      
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i486-linux-gnu/4.6.1/lto-wrapper
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.0-9' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-multiarch --with-multiarch-defaults=i386-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --enable-targets=all --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.6.1 20110524 (prerelease) (Debian 4.6.0-9) 


Source is as follows, then generated assembly.

#include <stdint.h>

/* Some types and a round constant needed everywhere */
typedef int32_t v4si __attribute__ ((vector_size (16)));
typedef int32_t v4si_u __attribute__ ((vector_size (16), aligned(4)));
typedef int32_t v2si __attribute__ ((vector_size (8)));

extern v4si const sigma;

#define ROUNDS 12	/* 8, 12, or 20 */

void chacha1(uint32_t const key[8], uint32_t const iv[4], uint32_t *__restrict out);
void chacha2(uint32_t const key[8], uint32_t const iv[4], uint32_t *__restrict out);
void chacha3(uint32_t const key[8], uint32_t const iv[4], uint32_t *__restrict out);

/* Version 1: an mmx implementation */

/* The basic quarter round: x ^= y += z; z <<<= k; (rotate) */
#if 1
#define OP(x,y,z,k) do { \
		register v2si t  asm("%mm7");		\
		y = __builtin_ia32_paddd(y, z);		\
		x = __builtin_ia32_pxor(x, y);		\
		t = x;					\
		x = __builtin_ia32_pslldi(x, k);	\
		t = __builtin_ia32_psrldi(t, 32-k);	\
		x = __builtin_ia32_por(x, t);		\
	} while (0)
#else
#define OP(x,y,z,k) ( \
		x ^= y += z,				\
		x = __builtin_ia32_pslldi(x, k) | 	\
		    __builtin_ia32_psrldi(x, 32-k)	\
	)
#endif

/* Rotate words right 32 bits */
/* If the words of y:x are 3:2:1:0, rotate right to 0:3:2:1 */
/* Little-endian, that's 0123 -> 1230 */
#define ROTW(x,y) do { \
		register v2si t  asm("%mm7") = t;	\
		t = __builtin_ia32_punpckldq(t, x);	\
		x = __builtin_ia32_punpckhdq(x, x);	\
		x = __builtin_ia32_punpckldq(x, y);	\
		y = __builtin_ia32_punpckhdq(y, t);	\
	} while(0)
	
void
chacha1(uint32_t const key[8], uint32_t const iv[4], uint32_t *__restrict out)
{
	/*
	 * There aren't enough MMX registers for all this, plus
	 * temporaries, so the compiler will have to do some spilling.
	 */
	register v2si a0 asm("%mm0") = ((v2si const *)&sigma)[0];
	register v2si a1 asm("%mm1") = ((v2si const *)&sigma)[1];
	register v2si b0 asm("%mm2") = ((v2si const *)key)[0];
	register v2si b1 asm("%mm3") = ((v2si const *)key)[1];
	register v2si c0 asm("%mm4") = ((v2si const *)key)[2];
	register v2si c1 asm("%mm5") = ((v2si const *)key)[3];
	register v2si d  asm("%mm6") = ((v2si const *)iv)[0];
	v2si dd[2];	/* On stack */
	int i;

	dd[1] = ((v2si const *)iv)[1];

	for (i = 0; i < ROUNDS/4; i++) {
//asm("# OP 1" :: "y" (d), "y" (a0), "y" (b0));
		OP(d, a0, b0, 16);
//asm("# OP 2" :: "y" (b0), "y" (c0), "y" (d));
		OP(b0, c0, d, 12);
//asm("# OP 3" :: "y" (d), "y" (a0), "y" (b0));
		OP(d, a0, b0, 8);
//asm("# OP 4" :: "y" (b0), "y" (c0), "y" (d));
		OP(b0, c0, d, 7);

		dd[0] = d;
		d = dd[1];

//asm("# OP 1" :: "y" (d), "y" (a1), "y" (b1));
		OP(d, a1, b1, 16);
//asm("# OP 2" :: "y" (b1), "y" (c1), "y" (d));
		OP(b1, c1, d, 12);
//asm("# OP 3" :: "y" (d), "y" (a1), "y" (b1));
		OP(d, a1, b1, 8);
//asm("# OP 4" :: "y" (b1), "y" (c1), "y" (d));
		OP(b1, c1, d, 7);

		/* Our ROTW converts 0123 to 1230.  To get
		 * the other orders, combine with implicit swaps.
		 *
		 * a: 0123 -> 3012	ROTW + swap halves
		 * b: 0123    0123	No change
		 * c: 0123    1230	ROTW
		 * d: 0123    2301	swap halves, i.e. DON'T reload
		 */
//asm("# Swap" :: "y" (a0), "y" (a1), "y" (c0), "y" (c1));
		ROTW(a0,a1);
		ROTW(c0,c1);

		/* Same as above, but with a0/a1 and d0/d1 swapped */
		OP(d, a1, b0, 16);
		OP(b0, c0, d, 12);
		OP(d, a1, b0, 8);
		OP(b0, c0, d, 7);

		dd[1] = d;
		d = dd[0];

		OP(d, a0, b1, 16);
		OP(b1, c1, d, 12);
		OP(d, a0, b1, 8);
		OP(b1, c1, d, 7);

		ROTW(a0,a1);
		ROTW(c0,c1);

		/* Now a and c are swapped, but not b or d */
		OP(d, a1, b0, 16);
		OP(b0, c1, d, 12);
		OP(d, a1, b0, 8);
		OP(b0, c1, d, 7);

		dd[0] = d;
		d = dd[1];

		OP(d, a0, b1, 16);
		OP(b1, c0, d, 12);
		OP(d, a0, b1, 8);
		OP(b1, c0, d, 7);

		ROTW(a0,a1);
		ROTW(c0,c1);
		/* And a fourth round.  c and d swapped */

		OP(d, a0, b0, 16);
		OP(b0, c1, d, 12);
		OP(d, a0, b0, 8);
		OP(b0, c1, d, 7);

		dd[1] = d;
		d = dd[0];

		OP(d, a1, b1, 16);
		OP(b1, c0, d, 12);
		OP(d, a1, b1, 8);
		OP(b1, c0, d, 7);

		ROTW(a0,a1);
		ROTW(c0,c1);
	}

	((v2si *)out)[0] = a0   += ((v2si const *)&sigma)[0];
	((v2si *)out)[1] = a1   += ((v2si const *)&sigma)[1];
	((v2si *)out)[2] = b0   += ((v2si const *)key)[0];
	((v2si *)out)[3] = b1   += ((v2si const *)key)[1];
	((v2si *)out)[4] = c0   += ((v2si const *)key)[2];
	((v2si *)out)[5] = c1   += ((v2si const *)key)[3];
	((v2si *)out)[6] = d    += ((v2si const *)iv)[0];
	((v2si *)out)[7] = dd[1] + ((v2si const *)iv)[1];
}


	.file	"chacha1.c"
	.text
	.globl	chacha1
	.type	chacha1, @function
chacha1:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	pushl	%edi
	.cfi_def_cfa_offset 12
	.cfi_offset 7, -12
	pushl	%esi
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	pushl	%ebx
	.cfi_def_cfa_offset 20
	.cfi_offset 3, -20
	subl	$516, %esp
	.cfi_def_cfa_offset 536
	movl	540(%esp), %edx
	movl	536(%esp), %ebx
	movl	540(%esp), %edi
	movl	sigma, %ebp
	movl	(%edx), %eax
	movl	4(%edx), %edx
	movl	8(%edi), %esi
	movl	12(%edi), %edi
	movl	%eax, 16(%esp)
	movl	(%ebx), %eax
	movl	%edx, 20(%esp)
	movl	4(%ebx), %edx
	movl	%esi, 8(%esp)
	movl	20(%ebx), %ecx
	movl	%edi, 12(%esp)
	movl	8(%ebx), %esi
	movl	%eax, (%esp)
	movl	12(%ebx), %edi
	movl	%edx, 4(%esp)
	movl	sigma+4, %edx
	movl	sigma+8, %eax
	movl	%ebp, 24(%esp)
	movl	%ecx, 44(%esp)
	movl	%edx, 28(%esp)
	movl	16(%ebx), %edx
	movl	%esi, 32(%esp)
	movl	%edi, 36(%esp)
	movl	%edx, 40(%esp)
	movl	sigma+12, %edx
	movl	%eax, 48(%esp)
	movl	24(%ebx), %eax
	movq	%mm7, 64(%esp)
	movq	%mm7, 72(%esp)
	movq	%mm7, 80(%esp)
	movq	%mm7, 88(%esp)
	movq	%mm7, 96(%esp)
	movq	%mm7, 104(%esp)
	movq	%mm7, 112(%esp)
	movl	%edx, 52(%esp)
	movl	28(%ebx), %edx
	movq	%mm7, 120(%esp)
	movl	%eax, 56(%esp)
	movl	$3, %eax
	movl	%edx, 60(%esp)
.L2:
	movq	24(%esp), %mm0
	paddd	(%esp), %mm0
	movq	16(%esp), %mm1
	movq	(%esp), %mm4
	movq	48(%esp), %mm6
	paddd	32(%esp), %mm6
	movq	32(%esp), %mm7
	decl	%eax
	pxor	%mm0, %mm1
	movq	%mm1, %mm3
	psrld	$16, %mm1
	pslld	$16, %mm3
	por	%mm1, %mm3
	movq	40(%esp), %mm1
	paddd	%mm3, %mm1
	pxor	%mm1, %mm4
	movq	%mm4, %mm2
	psrld	$20, %mm4
	pslld	$12, %mm2
	por	%mm4, %mm2
	paddd	%mm2, %mm0
	pxor	%mm0, %mm3
	movq	%mm3, %mm4
	psrld	$24, %mm3
	pslld	$8, %mm4
	por	%mm4, %mm3
	paddd	%mm3, %mm1
	movq	%mm3, (%esp)
	pxor	%mm1, %mm2
	movq	%mm2, %mm4
	psrld	$25, %mm2
	pslld	$7, %mm4
	por	%mm2, %mm4
	movq	8(%esp), %mm2
	pxor	%mm6, %mm2
	movq	%mm2, %mm5
	psrld	$16, %mm2
	pslld	$16, %mm5
	por	%mm2, %mm5
	movq	56(%esp), %mm2
	paddd	%mm5, %mm2
	pxor	%mm2, %mm7
	movq	%mm7, %mm3
	psrld	$20, %mm7
	pslld	$12, %mm3
	por	%mm7, %mm3
	movq	%mm5, %mm7
	paddd	%mm3, %mm6
	pxor	%mm6, %mm7
	movq	%mm7, %mm5
	psrld	$24, %mm7
	pslld	$8, %mm5
	por	%mm7, %mm5
	movq	%mm3, %mm7
	paddd	%mm5, %mm2
	pxor	%mm2, %mm7
	movq	%mm7, %mm3
	psrld	$25, %mm7
	pslld	$7, %mm3
	por	%mm7, %mm3
	movq	120(%esp), %mm7
	punpckldq	%mm0, %mm7
	punpckhdq	%mm0, %mm0
	movq	%mm7, 120(%esp)
	punpckldq	%mm6, %mm0
	punpckhdq	%mm7, %mm6
	movq	64(%esp), %mm7
	punpckldq	%mm1, %mm7
	punpckhdq	%mm1, %mm1
	paddd	%mm3, %mm0
	paddd	%mm4, %mm6
	movq	%mm7, 64(%esp)
	punpckldq	%mm2, %mm1
	punpckhdq	%mm7, %mm2
	movq	%mm5, %mm7
	pxor	%mm6, %mm7
	movq	%mm7, %mm5
	psrld	$16, %mm7
	pslld	$16, %mm5
	por	%mm7, %mm5
	movq	%mm4, %mm7
	paddd	%mm5, %mm1
	pxor	%mm1, %mm7
	movq	%mm7, %mm4
	psrld	$20, %mm7
	pslld	$12, %mm4
	por	%mm7, %mm4
	paddd	%mm4, %mm6
	pxor	%mm6, %mm5
	movq	%mm5, %mm7
	psrld	$24, %mm5
	pslld	$8, %mm7
	por	%mm7, %mm5
	paddd	%mm5, %mm1
	movq	%mm5, 8(%esp)
	pxor	%mm1, %mm4
	movq	%mm4, %mm5
	psrld	$25, %mm4
	pslld	$7, %mm5
	por	%mm4, %mm5
	movq	(%esp), %mm4
	pxor	%mm0, %mm4
	movq	%mm4, %mm7
	psrld	$16, %mm4
	pslld	$16, %mm7
	por	%mm4, %mm7
	paddd	%mm7, %mm2
	pxor	%mm2, %mm3
	movq	%mm3, %mm4
	psrld	$20, %mm3
	pslld	$12, %mm4
	por	%mm3, %mm4
	paddd	%mm4, %mm0
	pxor	%mm0, %mm7
	movq	%mm7, %mm3
	psrld	$24, %mm7
	pslld	$8, %mm3
	por	%mm7, %mm3
	paddd	%mm3, %mm2
	pxor	%mm2, %mm4
	movq	%mm4, %mm7
	psrld	$25, %mm4
	pslld	$7, %mm7
	por	%mm4, %mm7
	movq	72(%esp), %mm4
	punpckldq	%mm0, %mm4
	punpckhdq	%mm0, %mm0
	movq	%mm4, 72(%esp)
	punpckldq	%mm6, %mm0
	punpckhdq	%mm4, %mm6
	movq	80(%esp), %mm4
	punpckldq	%mm1, %mm4
	punpckhdq	%mm1, %mm1
	paddd	%mm7, %mm0
	paddd	%mm5, %mm6
	pxor	%mm6, %mm3
	movq	%mm4, 80(%esp)
	punpckldq	%mm2, %mm1
	punpckhdq	%mm4, %mm2
	movq	%mm3, %mm4
	psrld	$16, %mm3
	pslld	$16, %mm4
	por	%mm3, %mm4
	paddd	%mm4, %mm2
	pxor	%mm2, %mm5
	movq	%mm5, %mm3
	psrld	$20, %mm5
	pslld	$12, %mm3
	por	%mm5, %mm3
	paddd	%mm3, %mm6
	pxor	%mm6, %mm4
	movq	%mm4, %mm5
	psrld	$24, %mm4
	pslld	$8, %mm5
	por	%mm5, %mm4
	movq	8(%esp), %mm5
	pxor	%mm0, %mm5
	paddd	%mm4, %mm2
	movq	%mm4, 16(%esp)
	movq	%mm3, %mm4
	pxor	%mm2, %mm4
	movq	%mm4, %mm3
	psrld	$25, %mm4
	pslld	$7, %mm3
	por	%mm4, %mm3
	movq	%mm5, %mm4
	psrld	$16, %mm5
	pslld	$16, %mm4
	por	%mm5, %mm4
	paddd	%mm4, %mm1
	pxor	%mm1, %mm7
	movq	%mm7, %mm5
	psrld	$20, %mm7
	pslld	$12, %mm5
	por	%mm7, %mm5
	movq	%mm4, %mm7
	paddd	%mm5, %mm0
	pxor	%mm0, %mm7
	movq	%mm7, %mm4
	psrld	$24, %mm7
	pslld	$8, %mm4
	por	%mm7, %mm4
	paddd	%mm4, %mm1
	pxor	%mm1, %mm5
	movq	%mm5, %mm7
	psrld	$25, %mm5
	pslld	$7, %mm7
	por	%mm5, %mm7
	movq	88(%esp), %mm5
	punpckldq	%mm0, %mm5
	punpckhdq	%mm0, %mm0
	movq	%mm5, 88(%esp)
	punpckldq	%mm6, %mm0
	punpckhdq	%mm5, %mm6
	movq	96(%esp), %mm5
	punpckldq	%mm1, %mm5
	punpckhdq	%mm1, %mm1
	paddd	%mm3, %mm0
	pxor	%mm0, %mm4
	paddd	%mm7, %mm6
	movq	%mm5, 96(%esp)
	punpckldq	%mm2, %mm1
	punpckhdq	%mm5, %mm2
	movq	%mm4, %mm5
	psrld	$16, %mm4
	pslld	$16, %mm5
	por	%mm4, %mm5
	paddd	%mm5, %mm2
	pxor	%mm2, %mm3
	movq	%mm3, %mm4
	psrld	$20, %mm3
	pslld	$12, %mm4
	por	%mm3, %mm4
	paddd	%mm4, %mm0
	pxor	%mm0, %mm5
	movq	%mm5, %mm3
	psrld	$24, %mm5
	pslld	$8, %mm3
	por	%mm3, %mm5
	movq	16(%esp), %mm3
	pxor	%mm6, %mm3
	paddd	%mm5, %mm2
	movq	%mm5, 8(%esp)
	pxor	%mm2, %mm4
	movq	%mm4, %mm5
	psrld	$25, %mm4
	pslld	$7, %mm5
	por	%mm5, %mm4
	movq	104(%esp), %mm5
	punpckldq	%mm0, %mm5
	movq	%mm4, (%esp)
	movq	%mm3, %mm4
	psrld	$16, %mm3
	pslld	$16, %mm4
	por	%mm3, %mm4
	punpckhdq	%mm0, %mm0
	paddd	%mm4, %mm1
	pxor	%mm1, %mm7
	movq	%mm7, %mm3
	psrld	$20, %mm7
	pslld	$12, %mm3
	por	%mm7, %mm3
	paddd	%mm3, %mm6
	pxor	%mm6, %mm4
	punpckldq	%mm6, %mm0
	movq	%mm4, %mm7
	psrld	$24, %mm4
	pslld	$8, %mm7
	por	%mm7, %mm4
	punpckhdq	%mm5, %mm6
	paddd	%mm4, %mm1
	movq	%mm4, 16(%esp)
	pxor	%mm1, %mm3
	movq	%mm3, %mm4
	psrld	$25, %mm3
	pslld	$7, %mm4
	por	%mm4, %mm3
	movq	%mm3, 32(%esp)
	movq	%mm5, 104(%esp)
	movq	112(%esp), %mm7
	punpckldq	%mm1, %mm7
	movq	%mm0, 24(%esp)
	movq	%mm6, 48(%esp)
	punpckhdq	%mm1, %mm1
	movq	%mm7, 112(%esp)
	movq	%mm1, %mm0
	punpckldq	%mm2, %mm0
	punpckhdq	%mm7, %mm2
	movq	%mm0, 40(%esp)
	movq	%mm2, 56(%esp)
	jne	.L2
	movl	28(%esp), %edi
	movl	%ebp, %eax
	xorl	%ecx, %ecx
	movl	24(%esp), %edx
	movl	%ecx, 492(%esp)
	movl	24(%esp), %esi
	movl	%ebp, 472(%esp)
	movl	%edi, 484(%esp)
	movl	sigma+4, %edi
	addl	%edx, %eax
	movl	484(%esp), %ecx
	movl	%eax, 488(%esp)
	movl	488(%esp), %eax
	movl	%edi, 476(%esp)
	movl	544(%esp), %edi
	addl	476(%esp), %ecx
	movl	%esi, 480(%esp)
	movl	48(%esp), %esi
	movl	%eax, 464(%esp)
	movl	%ecx, 468(%esp)
	movl	464(%esp), %eax
	xorl	%ecx, %ecx
	movl	468(%esp), %edx
	movl	%eax, (%edi)
	movl	sigma+8, %eax
	movl	%edx, 4(%edi)
	movl	52(%esp), %edi
	movl	48(%esp), %edx
	movl	%esi, 432(%esp)
	movl	sigma+8, %esi
	movl	%ecx, 444(%esp)
	movl	%edi, 436(%esp)
	movl	sigma+12, %edi
	addl	%edx, %eax
	movl	436(%esp), %ecx
	movl	%eax, 440(%esp)
	movl	440(%esp), %eax
	movl	%esi, 424(%esp)
	movl	%edi, 428(%esp)
	movl	544(%esp), %edi
	addl	428(%esp), %ecx
	movl	%eax, 416(%esp)
	movl	(%esp), %esi
	movl	416(%esp), %eax
	movl	%ecx, 420(%esp)
	xorl	%ecx, %ecx
	movl	420(%esp), %edx
	movl	%eax, 8(%edi)
	movl	%edx, 12(%edi)
	movl	(%esp), %edx
	movl	(%ebx), %ebp
	movl	4(%esp), %edi
	movl	%ecx, 396(%esp)
	movl	%esi, 384(%esp)
	movl	32(%esp), %esi
	movl	%ebp, %eax
	addl	%edx, %eax
	movl	%eax, 392(%esp)
	movl	%edi, 388(%esp)
	movl	392(%esp), %eax
	movl	4(%ebx), %edi
	movl	388(%esp), %ecx
	movl	%ebp, 376(%esp)
	movl	%eax, 368(%esp)
	movl	%edi, 380(%esp)
	movl	368(%esp), %eax
	addl	380(%esp), %ecx
	movl	544(%esp), %edi
	movl	%ecx, 372(%esp)
	xorl	%ecx, %ecx
	movl	372(%esp), %edx
	movl	%eax, 16(%edi)
	movl	%edx, 20(%edi)
	movl	32(%esp), %edx
	movl	8(%ebx), %ebp
	movl	36(%esp), %edi
	movl	%ecx, 348(%esp)
	movl	%ebp, %eax
	addl	%edx, %eax
	movl	%eax, 344(%esp)
	movl	344(%esp), %eax
	movl	%esi, 336(%esp)
	movl	40(%esp), %esi
	movl	%edi, 340(%esp)
	movl	12(%ebx), %edi
	movl	340(%esp), %ecx
	movl	%eax, 320(%esp)
	movl	320(%esp), %eax
	movl	%edi, 332(%esp)
	movl	544(%esp), %edi
	addl	332(%esp), %ecx
	movl	%ebp, 328(%esp)
	movl	%ecx, 324(%esp)
	xorl	%ecx, %ecx
	movl	324(%esp), %edx
	movl	%eax, 24(%edi)
	movl	%edx, 28(%edi)
	movl	40(%esp), %edx
	movl	16(%ebx), %ebp
	movl	44(%esp), %edi
	movl	%ecx, 300(%esp)
	movl	%esi, 288(%esp)
	movl	%ebp, %eax
	addl	%edx, %eax
	movl	%eax, 296(%esp)
	movl	%edi, 292(%esp)
	movl	296(%esp), %eax
	movl	20(%ebx), %edi
	movl	292(%esp), %ecx
	movl	%ebp, 280(%esp)
	movl	%eax, 272(%esp)
	movl	%edi, 284(%esp)
	movl	272(%esp), %eax
	addl	284(%esp), %ecx
	movl	544(%esp), %edi
	movl	%ecx, 276(%esp)
	xorl	%ecx, %ecx
	movl	276(%esp), %edx
	movl	%eax, 32(%edi)
	movl	%edx, 36(%edi)
	movl	24(%ebx), %ebp
	movl	56(%esp), %edx
	movl	60(%esp), %edi
	movl	28(%ebx), %ebx
	movl	%ebp, %eax
	movl	56(%esp), %esi
	addl	%edx, %eax
	movl	%eax, 248(%esp)
	movl	248(%esp), %eax
	movl	%edi, 244(%esp)
	movl	544(%esp), %edi
	movl	%ecx, 252(%esp)
	movl	244(%esp), %ecx
	movl	%ebx, 236(%esp)
	movl	%eax, 224(%esp)
	addl	236(%esp), %ecx
	movl	224(%esp), %eax
	movl	%esi, 240(%esp)
	movl	16(%esp), %esi
	movl	%ecx, 228(%esp)
	xorl	%ecx, %ecx
	movl	228(%esp), %edx
	movl	%ebp, 232(%esp)
	movl	%eax, 40(%edi)
	movl	540(%esp), %eax
	movl	%edx, 44(%edi)
	movl	16(%esp), %edx
	movl	20(%esp), %edi
	movl	(%eax), %ebx
	movl	4(%eax), %ebp
	movl	%ecx, 204(%esp)
	movl	%edi, 196(%esp)
	movl	%ebx, %eax
	movl	196(%esp), %ecx
	addl	%edx, %eax
	movl	%eax, 200(%esp)
	movl	200(%esp), %eax
	movl	%esi, 192(%esp)
	movl	%ebx, 184(%esp)
	movl	544(%esp), %edi
	movl	%ebp, 188(%esp)
	movl	8(%esp), %esi
	movl	%eax, 176(%esp)
	addl	188(%esp), %ecx
	movl	176(%esp), %eax
	movl	%ecx, 180(%esp)
	xorl	%ecx, %ecx
	movl	180(%esp), %edx
	movl	%eax, 48(%edi)
	movl	540(%esp), %eax
	movl	%edx, 52(%edi)
	movl	8(%esp), %edx
	movl	8(%eax), %ebx
	movl	12(%esp), %edi
	movl	12(%eax), %ebp
	movl	%ecx, 156(%esp)
	movl	%ebx, %eax
	addl	%edx, %eax
	movl	%edi, 148(%esp)
	movl	544(%esp), %edi
	movl	%eax, 152(%esp)
	movl	148(%esp), %ecx
	movl	152(%esp), %eax
	movl	%ebp, 140(%esp)
	addl	140(%esp), %ecx
	movl	%esi, 144(%esp)
	movl	%eax, 128(%esp)
	movl	%ecx, 132(%esp)
	movl	128(%esp), %eax
	movl	132(%esp), %edx
	movl	%ebx, 136(%esp)
	movl	%eax, 56(%edi)
	movl	%edx, 60(%edi)
	addl	$516, %esp
	.cfi_def_cfa_offset 20
	popl	%ebx
	.cfi_def_cfa_offset 16
	.cfi_restore 3
	popl	%esi
	.cfi_def_cfa_offset 12
	.cfi_restore 6
	popl	%edi
	.cfi_def_cfa_offset 8
	.cfi_restore 7
	popl	%ebp
	.cfi_def_cfa_offset 4
	.cfi_restore 5
	ret
	.cfi_endproc
.LFE0:
	.size	chacha1, .-chacha1
	.ident	"GCC: (Debian 4.6.0-9) 4.6.1 20110524 (prerelease)"
	.section	.note.GNU-stack,"",@progbits



More information about the Gcc-bugs mailing list