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