146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	mmx.h
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	MultiMedia eXtensions GCC interface library for IA32.
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	To use this library, simply include this header file
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	and compile with GCC.  You MUST have inlining enabled
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	in order for mmx_ok() to work; this can be done by
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	simply using -O on the GCC command line.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Compiling with -DMMX_TRACE will cause detailed trace
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	output to be sent to stderr for each mmx operation.
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	This adds lots of code, and obviously slows execution to
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	a crawl, but can be very useful for debugging.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	AND FITNESS FOR ANY PARTICULAR PURPOSE.
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	1997-99 by H. Dietz and R. Fisher
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Notes:
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	It appears that the latest gas has the pand problem fixed, therefore
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	  I'll undefine BROKEN_PAND by default.
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef _MMX_H
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define _MMX_H
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Warning:  at this writing, the version of GAS packaged
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	with most Linux distributions does not handle the
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	parallel AND operation mnemonic correctly.  If the
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	symbol BROKEN_PAND is defined, a slower alternative
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	coding will be used.  If execution of mmxtest results
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	in an illegal instruction fault, define this symbol.
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#undef	BROKEN_PAND
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	The type of an value that fits in an MMX register
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(note that long long constant values MUST be suffixed
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 by LL and unsigned long long values by ULL, lest
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 they be truncated by the compiler)
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnertypedef	union {
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	long long		q;	/* Quadword (64-bit) value */
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	unsigned long long	uq;	/* Unsigned Quadword */
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int			d[2];	/* 2 Doubleword (32-bit) values */
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	unsigned int		ud[2];	/* 2 Unsigned Doubleword */
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	short			w[4];	/* 4 Word (16-bit) values */
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	unsigned short		uw[4];	/* 4 Unsigned Word */
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char			b[8];	/* 8 Byte (8-bit) values */
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	unsigned char		ub[8];	/* 8 Unsigned Byte */
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	float			s[2];	/* Single-precision (32-bit) value */
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} __attribute__ ((aligned (8))) mmx_t;	/* On an 8-byte (64-bit) boundary */
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if 0
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Function to test if multimedia instructions are supported...
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerinline extern int
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnermm_support(void)
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Returns 1 if MMX instructions are supported,
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	   3 if Cyrix MMX and Extended MMX instructions are supported
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	   5 if AMD MMX and 3DNow! instructions are supported
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	   0 if hardware does not support any of these
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	*/
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	register int rval = 0;
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ (
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* See if CPUID instruction is supported ... */
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* ... Get copies of EFLAGS into eax and ecx */
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"pushf\n\t"
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"popl %%eax\n\t"
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl %%eax, %%ecx\n\t"
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* ... Toggle the ID bit in one copy and store */
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/*     to the EFLAGS reg */
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"xorl $0x200000, %%eax\n\t"
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"push %%eax\n\t"
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"popf\n\t"
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* ... Get the (hopefully modified) EFLAGS */
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"pushf\n\t"
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"popl %%eax\n\t"
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* ... Compare and test result */
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"xorl %%eax, %%ecx\n\t"
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x200000, %%ecx\n\t"
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jz NotSupported1\n\t"		/* CPUID not supported */
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Get standard CPUID information, and
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		       go to a specific vendor section */
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $0, %%eax\n\t"
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cpuid\n\t"
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Check for Intel */
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x756e6547, %%ebx\n\t"
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryAMD\n\t"
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x49656e69, %%edx\n\t"
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryAMD\n\t"
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x6c65746e, %%ecx\n"
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryAMD\n\t"
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Intel\n\t"
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Check for AMD */
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nTryAMD:\n\t"
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x68747541, %%ebx\n\t"
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryCyrix\n\t"
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x69746e65, %%edx\n\t"
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryCyrix\n\t"
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x444d4163, %%ecx\n"
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne TryCyrix\n\t"
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp AMD\n\t"
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Check for Cyrix */
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nTryCyrix:\n\t"
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x69727943, %%ebx\n\t"
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne NotSupported2\n\t"
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x736e4978, %%edx\n\t"
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne NotSupported3\n\t"
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x64616574, %%ecx\n\t"
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne NotSupported4\n\t"
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Drop through to Cyrix... */
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Cyrix Section */
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* See if extended CPUID level 80000001 is supported */
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* The value of CPUID/80000001 for the 6x86MX is undefined
13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   according to the Cyrix CPU Detection Guide (Preliminary
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   Rev. 1.01 table 1), so we'll check the value of eax for
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   CPUID/0 to see if standard CPUID level 2 is supported.
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   According to the table, the only CPU which supports level
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   2 is also the only one which supports extended CPUID levels.
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		*/
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x2, %%eax\n\t"
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jne MMXtest\n\t"	/* Use standard CPUID instead */
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Extended CPUID supported (in theory), so get extended
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		   features */
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $0x80000001, %%eax\n\t"
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cpuid\n\t"
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x00800000, %%eax\n\t"	/* Test for MMX */
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jz NotSupported5\n\t"		/* MMX not supported */
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x01000000, %%eax\n\t"	/* Test for Ext'd MMX */
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jnz EMMXSupported\n\t"
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $1, %0:\n\n\t"		/* MMX Supported */
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Return\n\n"
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"EMMXSupported:\n\t"
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $3, %0:\n\n\t"		/* EMMX and MMX Supported */
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Return\n\t"
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* AMD Section */
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"AMD:\n\t"
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* See if extended CPUID is supported */
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $0x80000000, %%eax\n\t"
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cpuid\n\t"
16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cmpl $0x80000000, %%eax\n\t"
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jl MMXtest\n\t"	/* Use standard CPUID instead */
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Extended CPUID supported, so get extended features */
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $0x80000001, %%eax\n\t"
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cpuid\n\t"
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x00800000, %%edx\n\t"	/* Test for MMX */
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jz NotSupported6\n\t"		/* MMX not supported */
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x80000000, %%edx\n\t"	/* Test for 3DNow! */
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jnz ThreeDNowSupported\n\t"
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $1, %0:\n\n\t"		/* MMX Supported */
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Return\n\n"
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"ThreeDNowSupported:\n\t"
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $5, %0:\n\n\t"		/* 3DNow! and MMX Supported */
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Return\n\t"
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Intel Section */
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"Intel:\n\t"
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Check for MMX */
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"MMXtest:\n\t"
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $1, %%eax\n\t"
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"cpuid\n\t"
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"testl $0x00800000, %%edx\n\t"	/* Test for MMX */
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jz NotSupported7\n\t"		/* MMX Not supported */
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $1, %0:\n\n\t"		/* MMX Supported */
19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"jmp Return\n\t"
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* Nothing supported */
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported1:\n\t"
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $101, %0:\n\n\t"
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported2:\n\t"
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $102, %0:\n\n\t"
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported3:\n\t"
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $103, %0:\n\n\t"
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported4:\n\t"
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $104, %0:\n\n\t"
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported5:\n\t"
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $105, %0:\n\n\t"
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported6:\n\t"
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $106, %0:\n\n\t"
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"\nNotSupported7:\n\t"
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"#movl $107, %0:\n\n\t"
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"movl $0, %0:\n\n\t"
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		"Return:\n\t"
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		: "=a" (rval)
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		: /* no input */
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		: "eax", "ebx", "ecx", "edx"
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	);
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Return */
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(rval);
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Function to test if mmx instructions are supported...
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerinline extern int
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnermmx_ok(void)
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Returns 1 if MMX instructions are supported, 0 otherwise */
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return ( mm_support() & 0x1 );
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Helper functions for the instruction macros that follow...
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(note that memory-to-register, m2r, instructions are nearly
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 as efficient as register-to-register, r2r, instructions;
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 however, memory-to-memory instructions are really simulated
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 as a convenience, and are only 1/3 as efficient)
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef	MMX_TRACE
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Include the stuff for printing a trace to stderr...
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_i2r(op, imm, reg) \
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_t mmx_trace; \
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace.uq = (imm); \
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#op "_i2r(" #imm "=0x%08x%08x, ", \
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #reg ", %0" \
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#reg "=0x%08x%08x) => ", \
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ (#op " %0, %%" #reg \
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ \
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "X" (imm)); \
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #reg ", %0" \
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#reg "=0x%08x%08x\n", \
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_m2r(op, mem, reg) \
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_t mmx_trace; \
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (mem); \
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#op "_m2r(" #mem "=0x%08x%08x, ", \
26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #reg ", %0" \
26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#reg "=0x%08x%08x) => ", \
27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ (#op " %0, %%" #reg \
27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ \
27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "X" (mem)); \
27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #reg ", %0" \
27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#reg "=0x%08x%08x\n", \
27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_r2m(op, reg, mem) \
28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_t mmx_trace; \
28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #reg ", %0" \
28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#op "_r2m(" #reg "=0x%08x%08x, ", \
28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (mem); \
29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#mem "=0x%08x%08x) => ", \
29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ (#op " %%" #reg ", %0" \
29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mem) \
29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (mem); \
29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#mem "=0x%08x%08x\n", \
29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_r2r(op, regs, regd) \
30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_t mmx_trace; \
30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #regs ", %0" \
30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#op "_r2r(" #regs "=0x%08x%08x, ", \
30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #regd ", %0" \
31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#regd "=0x%08x%08x) => ", \
31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ (#op " %" #regs ", %" #regd); \
31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %%" #regd ", %0" \
31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (mmx_trace) \
31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : /* nothing */ ); \
31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#regd "=0x%08x%08x\n", \
31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_m2m(op, mems, memd) \
32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_t mmx_trace; \
32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (mems); \
32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#op "_m2m(" #mems "=0x%08x%08x, ", \
32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (memd); \
32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#memd "=0x%08x%08x) => ", \
33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("movq %0, %%mm0\n\t" \
33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      #op " %1, %%mm0\n\t" \
33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      "movq %%mm0, %0" \
33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "=X" (memd) \
33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				      : "X" (mems)); \
33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_trace = (memd); \
33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf(#memd "=0x%08x%08x\n", \
33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			mmx_trace.d[1], mmx_trace.d[0]); \
33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	These macros are a lot simpler without the tracing...
34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_i2r(op, imm, reg) \
34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ (#op " %0, %%" #reg \
34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : /* nothing */ \
34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "X" (imm) )
35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_m2r(op, mem, reg) \
35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ (#op " %0, %%" #reg \
35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : /* nothing */ \
35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "m" (mem))
35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_r2m(op, reg, mem) \
35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ (#op " %%" #reg ", %0" \
35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "=X" (mem) \
35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : /* nothing */ )
36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_r2r(op, regs, regd) \
36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ (#op " %" #regs ", %" #regd)
36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	mmx_m2m(op, mems, memd) \
36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ ("movq %0, %%mm0\n\t" \
36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      #op " %1, %%mm0\n\t" \
36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      "movq %%mm0, %0" \
36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "=X" (memd) \
36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "X" (mems))
37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64 MOVe Quadword
37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(this is both a load and a store...
37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 in fact, it is the only way to store)
37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movq_m2r(var, reg)	mmx_m2r(movq, var, reg)
37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movq_r2m(reg, var)	mmx_r2m(movq, reg, var)
38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movq_r2r(regs, regd)	mmx_r2r(movq, regs, regd)
38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movq(vars, vard) \
38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ ("movq %1, %%mm0\n\t" \
38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      "movq %%mm0, %0" \
38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "=X" (vard) \
38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "X" (vars))
38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x32 MOVe Doubleword
38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(like movq, this is both load and store...
39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 but is most useful for moving things between
39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 mmx registers and ordinary registers)
39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movd_m2r(var, reg)	mmx_m2r(movd, var, reg)
39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movd_r2m(reg, var)	mmx_r2m(movd, reg, var)
39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movd_r2r(regs, regd)	mmx_r2r(movd, regs, regd)
39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	movd(vars, vard) \
39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__asm__ __volatile__ ("movd %1, %%mm0\n\t" \
39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      "movd %%mm0, %0" \
39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "=X" (vard) \
40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			      : "X" (vars))
40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32, 4x16, and 8x8 Parallel ADDs
40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddd_m2r(var, reg)	mmx_m2r(paddd, var, reg)
40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddd_r2r(regs, regd)	mmx_r2r(paddd, regs, regd)
40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddd(vars, vard)	mmx_m2m(paddd, vars, vard)
40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddw_m2r(var, reg)	mmx_m2r(paddw, var, reg)
41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddw_r2r(regs, regd)	mmx_r2r(paddw, regs, regd)
41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddw(vars, vard)	mmx_m2m(paddw, vars, vard)
41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddb_m2r(var, reg)	mmx_m2r(paddb, var, reg)
41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddb_r2r(regs, regd)	mmx_r2r(paddb, regs, regd)
41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddb(vars, vard)	mmx_m2m(paddb, vars, vard)
41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 and 8x8 Parallel ADDs using Saturation arithmetic
41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsw_m2r(var, reg)	mmx_m2r(paddsw, var, reg)
42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsw_r2r(regs, regd)	mmx_r2r(paddsw, regs, regd)
42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsw(vars, vard)	mmx_m2m(paddsw, vars, vard)
42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsb_m2r(var, reg)	mmx_m2r(paddsb, var, reg)
42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsb_r2r(regs, regd)	mmx_r2r(paddsb, regs, regd)
42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddsb(vars, vard)	mmx_m2m(paddsb, vars, vard)
42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic
43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusw_m2r(var, reg)	mmx_m2r(paddusw, var, reg)
43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusw_r2r(regs, regd)	mmx_r2r(paddusw, regs, regd)
43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusw(vars, vard)	mmx_m2m(paddusw, vars, vard)
43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusb_m2r(var, reg)	mmx_m2r(paddusb, var, reg)
43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusb_r2r(regs, regd)	mmx_r2r(paddusb, regs, regd)
43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	paddusb(vars, vard)	mmx_m2m(paddusb, vars, vard)
43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32, 4x16, and 8x8 Parallel SUBs
44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubd_m2r(var, reg)	mmx_m2r(psubd, var, reg)
44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubd_r2r(regs, regd)	mmx_r2r(psubd, regs, regd)
44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubd(vars, vard)	mmx_m2m(psubd, vars, vard)
44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubw_m2r(var, reg)	mmx_m2r(psubw, var, reg)
44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubw_r2r(regs, regd)	mmx_r2r(psubw, regs, regd)
44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubw(vars, vard)	mmx_m2m(psubw, vars, vard)
44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubb_m2r(var, reg)	mmx_m2r(psubb, var, reg)
45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubb_r2r(regs, regd)	mmx_r2r(psubb, regs, regd)
45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubb(vars, vard)	mmx_m2m(psubb, vars, vard)
45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 and 8x8 Parallel SUBs using Saturation arithmetic
45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsw_m2r(var, reg)	mmx_m2r(psubsw, var, reg)
45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsw_r2r(regs, regd)	mmx_r2r(psubsw, regs, regd)
45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsw(vars, vard)	mmx_m2m(psubsw, vars, vard)
46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsb_m2r(var, reg)	mmx_m2r(psubsb, var, reg)
46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsb_r2r(regs, regd)	mmx_r2r(psubsb, regs, regd)
46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubsb(vars, vard)	mmx_m2m(psubsb, vars, vard)
46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic
46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusw_m2r(var, reg)	mmx_m2r(psubusw, var, reg)
46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusw_r2r(regs, regd)	mmx_r2r(psubusw, regs, regd)
47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusw(vars, vard)	mmx_m2m(psubusw, vars, vard)
47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusb_m2r(var, reg)	mmx_m2r(psubusb, var, reg)
47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusb_r2r(regs, regd)	mmx_r2r(psubusb, regs, regd)
47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psubusb(vars, vard)	mmx_m2m(psubusb, vars, vard)
47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 Parallel MULs giving Low 4x16 portions of results
47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmullw_m2r(var, reg)	mmx_m2r(pmullw, var, reg)
48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmullw_r2r(regs, regd)	mmx_r2r(pmullw, regs, regd)
48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmullw(vars, vard)	mmx_m2m(pmullw, vars, vard)
48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16 Parallel MULs giving High 4x16 portions of results
48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmulhw_m2r(var, reg)	mmx_m2r(pmulhw, var, reg)
48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmulhw_r2r(regs, regd)	mmx_r2r(pmulhw, regs, regd)
48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmulhw(vars, vard)	mmx_m2m(pmulhw, vars, vard)
48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16->2x32 Parallel Mul-ADD
49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(muls like pmullw, then adds adjacent 16-bit fields
49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 in the multiply result to make the final 2x32 result)
49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmaddwd_m2r(var, reg)	mmx_m2r(pmaddwd, var, reg)
49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmaddwd_r2r(regs, regd)	mmx_r2r(pmaddwd, regs, regd)
49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pmaddwd(vars, vard)	mmx_m2m(pmaddwd, vars, vard)
49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64 bitwise AND
50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef	BROKEN_PAND
50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand_m2r(var, reg) \
50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_m2r(pandn, (mmx_t) -1LL, reg); \
50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_m2r(pandn, var, reg); \
50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand_r2r(regs, regd) \
50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_m2r(pandn, (mmx_t) -1LL, regd); \
51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_r2r(pandn, regs, regd) \
51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand(vars, vard) \
51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		movq_m2r(vard, mm0); \
51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_m2r(pandn, (mmx_t) -1LL, mm0); \
51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		mmx_m2r(pandn, vars, mm0); \
51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		movq_r2m(mm0, vard); \
51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand_m2r(var, reg)	mmx_m2r(pand, var, reg)
52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand_r2r(regs, regd)	mmx_r2r(pand, regs, regd)
52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pand(vars, vard)	mmx_m2m(pand, vars, vard)
52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64 bitwise AND with Not the destination
52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pandn_m2r(var, reg)	mmx_m2r(pandn, var, reg)
53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pandn_r2r(regs, regd)	mmx_r2r(pandn, regs, regd)
53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pandn(vars, vard)	mmx_m2m(pandn, vars, vard)
53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64 bitwise OR
53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	por_m2r(var, reg)	mmx_m2r(por, var, reg)
53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	por_r2r(regs, regd)	mmx_r2r(por, regs, regd)
53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	por(vars, vard)	mmx_m2m(por, vars, vard)
53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64 bitwise eXclusive OR
54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pxor_m2r(var, reg)	mmx_m2r(pxor, var, reg)
54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pxor_r2r(regs, regd)	mmx_r2r(pxor, regs, regd)
54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pxor(vars, vard)	mmx_m2m(pxor, vars, vard)
54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32, 4x16, and 8x8 Parallel CoMPare for EQuality
54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(resulting fields are either 0 or -1)
55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqd_m2r(var, reg)	mmx_m2r(pcmpeqd, var, reg)
55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqd_r2r(regs, regd)	mmx_r2r(pcmpeqd, regs, regd)
55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqd(vars, vard)	mmx_m2m(pcmpeqd, vars, vard)
55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqw_m2r(var, reg)	mmx_m2r(pcmpeqw, var, reg)
55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqw_r2r(regs, regd)	mmx_r2r(pcmpeqw, regs, regd)
55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqw(vars, vard)	mmx_m2m(pcmpeqw, vars, vard)
55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqb_m2r(var, reg)	mmx_m2r(pcmpeqb, var, reg)
56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqb_r2r(regs, regd)	mmx_r2r(pcmpeqb, regs, regd)
56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpeqb(vars, vard)	mmx_m2m(pcmpeqb, vars, vard)
56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than
56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(resulting fields are either 0 or -1)
56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtd_m2r(var, reg)	mmx_m2r(pcmpgtd, var, reg)
56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtd_r2r(regs, regd)	mmx_r2r(pcmpgtd, regs, regd)
56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtd(vars, vard)	mmx_m2m(pcmpgtd, vars, vard)
57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtw_m2r(var, reg)	mmx_m2r(pcmpgtw, var, reg)
57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtw_r2r(regs, regd)	mmx_r2r(pcmpgtw, regs, regd)
57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtw(vars, vard)	mmx_m2m(pcmpgtw, vars, vard)
57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtb_m2r(var, reg)	mmx_m2r(pcmpgtb, var, reg)
57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtb_r2r(regs, regd)	mmx_r2r(pcmpgtb, regs, regd)
57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pcmpgtb(vars, vard)	mmx_m2m(pcmpgtb, vars, vard)
57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64, 2x32, and 4x16 Parallel Shift Left Logical
58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllq_i2r(imm, reg)	mmx_i2r(psllq, imm, reg)
58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllq_m2r(var, reg)	mmx_m2r(psllq, var, reg)
58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllq_r2r(regs, regd)	mmx_r2r(psllq, regs, regd)
58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllq(vars, vard)	mmx_m2m(psllq, vars, vard)
58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pslld_i2r(imm, reg)	mmx_i2r(pslld, imm, reg)
58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pslld_m2r(var, reg)	mmx_m2r(pslld, var, reg)
58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pslld_r2r(regs, regd)	mmx_r2r(pslld, regs, regd)
59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	pslld(vars, vard)	mmx_m2m(pslld, vars, vard)
59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllw_i2r(imm, reg)	mmx_i2r(psllw, imm, reg)
59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllw_m2r(var, reg)	mmx_m2r(psllw, var, reg)
59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllw_r2r(regs, regd)	mmx_r2r(psllw, regs, regd)
59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psllw(vars, vard)	mmx_m2m(psllw, vars, vard)
59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	1x64, 2x32, and 4x16 Parallel Shift Right Logical
59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlq_i2r(imm, reg)	mmx_i2r(psrlq, imm, reg)
60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlq_m2r(var, reg)	mmx_m2r(psrlq, var, reg)
60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlq_r2r(regs, regd)	mmx_r2r(psrlq, regs, regd)
60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlq(vars, vard)	mmx_m2m(psrlq, vars, vard)
60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrld_i2r(imm, reg)	mmx_i2r(psrld, imm, reg)
60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrld_m2r(var, reg)	mmx_m2r(psrld, var, reg)
60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrld_r2r(regs, regd)	mmx_r2r(psrld, regs, regd)
60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrld(vars, vard)	mmx_m2m(psrld, vars, vard)
60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlw_i2r(imm, reg)	mmx_i2r(psrlw, imm, reg)
61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlw_m2r(var, reg)	mmx_m2r(psrlw, var, reg)
61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlw_r2r(regs, regd)	mmx_r2r(psrlw, regs, regd)
61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrlw(vars, vard)	mmx_m2m(psrlw, vars, vard)
61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32 and 4x16 Parallel Shift Right Arithmetic
61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrad_i2r(imm, reg)	mmx_i2r(psrad, imm, reg)
61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrad_m2r(var, reg)	mmx_m2r(psrad, var, reg)
62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrad_r2r(regs, regd)	mmx_r2r(psrad, regs, regd)
62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psrad(vars, vard)	mmx_m2m(psrad, vars, vard)
62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psraw_i2r(imm, reg)	mmx_i2r(psraw, imm, reg)
62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psraw_m2r(var, reg)	mmx_m2r(psraw, var, reg)
62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psraw_r2r(regs, regd)	mmx_r2r(psraw, regs, regd)
62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	psraw(vars, vard)	mmx_m2m(psraw, vars, vard)
62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32->4x16 and 4x16->8x8 PACK and Signed Saturate
63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(packs source and dest fields into dest in that order)
63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packssdw_m2r(var, reg)	mmx_m2r(packssdw, var, reg)
63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd)
63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packssdw(vars, vard)	mmx_m2m(packssdw, vars, vard)
63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packsswb_m2r(var, reg)	mmx_m2r(packsswb, var, reg)
63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd)
63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packsswb(vars, vard)	mmx_m2m(packsswb, vars, vard)
63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	4x16->8x8 PACK and Unsigned Saturate
64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(packs source and dest fields into dest in that order)
64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packuswb_m2r(var, reg)	mmx_m2r(packuswb, var, reg)
64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd)
64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	packuswb(vars, vard)	mmx_m2m(packuswb, vars, vard)
64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low
65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(interleaves low half of dest with low half of source
65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 as padding in each result field)
65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckldq_m2r(var, reg)	mmx_m2r(punpckldq, var, reg)
65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd)
65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckldq(vars, vard)	mmx_m2m(punpckldq, vars, vard)
65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklwd_m2r(var, reg)	mmx_m2r(punpcklwd, var, reg)
65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd)
65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklwd(vars, vard)	mmx_m2m(punpcklwd, vars, vard)
66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklbw_m2r(var, reg)	mmx_m2r(punpcklbw, var, reg)
66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd)
66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpcklbw(vars, vard)	mmx_m2m(punpcklbw, vars, vard)
66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High
66746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(interleaves high half of dest with high half of source
66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 as padding in each result field)
66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhdq_m2r(var, reg)	mmx_m2r(punpckhdq, var, reg)
67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd)
67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhdq(vars, vard)	mmx_m2m(punpckhdq, vars, vard)
67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhwd_m2r(var, reg)	mmx_m2r(punpckhwd, var, reg)
67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd)
67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhwd(vars, vard)	mmx_m2m(punpckhwd, vars, vard)
67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhbw_m2r(var, reg)	mmx_m2r(punpckhbw, var, reg)
67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd)
68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	punpckhbw(vars, vard)	mmx_m2m(punpckhbw, vars, vard)
68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*	Empty MMx State
68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	(used to clean-up when going from mmx to float use
68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 of the registers that are shared by both; note that
68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 there is no float-to-mmx operation needed, because
68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	 only the float tag word info is corruptible)
68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef	MMX_TRACE
69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	emms() \
69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{ \
69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		printf("emms()\n"); \
69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		__asm__ __volatile__ ("emms"); \
69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else
69846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
69946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	emms()			__asm__ __volatile__ ("emms")
70046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
70146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
70246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
70346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
70446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
705