File:  [Qemu by Fabrice Bellard] / qemu / tests / test-i386-ssse3.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:51:16 2018 UTC (3 years, 7 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu1001, qemu1000, qemu0151, qemu0150, qemu0141, qemu0140, qemu0130, qemu0125, qemu0124, qemu0123, qemu0122, qemu0121, qemu0120, qemu0111, qemu0110, qemu0105, qemu0104, qemu0103, qemu0102, qemu0101, qemu0100, HEAD
qemu 0.10.0

    1: /* See if various MMX/SSE SSSE3 instructions give expected results */
    2: #include <stdio.h>
    3: #include <string.h>
    4: #include <stdint.h>
    5: 
    6: int main(int argc, char *argv[]) {
    7: 	char hello[16];
    8: 	const char ehlo[8] = "EHLO    ";
    9: 	uint64_t mask = 0x8080800302020001;
   10: 
   11: 	uint64_t a = 0x0000000000090007;
   12: 	uint64_t b = 0x0000000000000000;
   13: 	uint32_t c;
   14: 	uint16_t d;
   15: 
   16: 	const char e[16] = "LLOaaaaaaaaaaaaa";
   17: 	const char f[16] = "aaaaaaaaaaaaaaHE";
   18: 
   19: 	/* pshufb mm1/xmm1, mm2/xmm2 */
   20: 	asm volatile ("movq    (%0), %%mm0" : : "r" (ehlo) : "mm0", "mm1");
   21: 	asm volatile ("movq    %0, %%mm1" : : "m" (mask));
   22: 	asm volatile ("pshufb  %mm1, %mm0");
   23: 	asm volatile ("movq    %%mm0, %0" : "=m" (hello));
   24: 	printf("%s\n", hello);
   25: 
   26: 	/* pshufb mm1/xmm1, m64/m128 */
   27: 	asm volatile ("movq    (%0), %%mm0" : : "r" (ehlo) : "mm0");
   28: 	asm volatile ("pshufb  %0, %%mm0" : : "m" (mask));
   29: 	asm volatile ("movq    %%mm0, %0" : "=m" (hello));
   30: 	printf("%s\n", hello);
   31: 
   32: 	/* psubsw mm1/xmm1, m64/m128 */
   33: 	asm volatile ("movq    %0, %%mm0" : : "r" (a) : "mm0");
   34: 	asm volatile ("phsubsw %0, %%mm0" : : "m" (b));
   35: 	asm volatile ("movq    %%mm0, %0" : "=m" (a));
   36: 	printf("%i - %i = %i\n", 9, 7, -(int16_t) a);
   37: 
   38: 	/* palignr mm1/xmm1, m64/m128, imm8 */
   39: 	asm volatile ("movdqa  (%0), %%xmm0" : : "r" (e) : "xmm0");
   40: 	asm volatile ("palignr $14, (%0), %%xmm0" : : "r" (f));
   41: 	asm volatile ("movdqa  %%xmm0, (%0)" : : "r" (hello));
   42: 	printf("%5.5s\n", hello);
   43: 
   44: #if 1 /* SSE4 */
   45: 	/* popcnt r64, r/m64 */
   46: 	asm volatile ("movq    $0x8421000010009c63, %%rax" : : : "rax");
   47: 	asm volatile ("popcnt  %%ax, %%dx" : : : "dx");
   48: 	asm volatile ("popcnt  %%eax, %%ecx" : : : "ecx");
   49: 	asm volatile ("popcnt  %rax, %rax");
   50: 	asm volatile ("movq    %%rax, %0" : "=m" (a));
   51: 	asm volatile ("movl    %%ecx, %0" : "=m" (c));
   52: 	asm volatile ("movw    %%dx, %0" : "=m" (d));
   53: 	printf("%i = %i\n%i = %i = %i\n", 13, (int) a, 9, c, d + 1);
   54: #endif
   55: 
   56: 	return 0;
   57: }

unix.superglobalmegacorp.com