1
2#include <stdio.h>
3#include <stdlib.h>
4#include <assert.h>
5
6#define JZ_NEXT ".byte 0x74,0x00"  /* jz the-next-insn */
7
8int main ( void )
9{
10   char* junk = malloc(48);
11   assert(junk);
12
13
14   /* --- INTEGER --- */
15
16   printf("\nComplain int64\n");
17   __asm__ __volatile__(
18      "movq   0(%0), %%rax\n\t"
19      "movq   8(%0), %%r8\n\t"
20      "xorq   %%r8, %%rax\n\t"
21      JZ_NEXT
22      : : "r"(junk) : "r8", "rax", "cc"
23   );
24
25   printf("\nNo complain int64\n");
26   __asm__ __volatile__(
27      "movq   0(%0), %%rax\n\t"
28      "movq   8(%0), %%r8\n\t"
29      "xorq   %%rax, %%rax\n\t"
30      JZ_NEXT
31      : : "r"(junk) : "r8", "rax", "cc"
32   );
33
34
35   /* --- MMX --- */
36
37   printf("\nComplain mmx\n");
38   __asm__ __volatile__(
39      "emms\n\t"
40      "movq   0(%0), %%mm0\n\t"
41      "movq   8(%0), %%mm7\n\t"
42      "pxor   %%mm7, %%mm0\n\t"
43      "movq   %%mm0, 16(%0)\n\t"
44      "cmpq   $0,16(%0)\n\t"
45      JZ_NEXT
46      : : "r"(junk) : "mm7", "mm0", "cc", "memory"
47   );
48
49   printf("\nNo complain mmx\n");
50   __asm__ __volatile__(
51      "emms\n\t"
52      "movq   0(%0), %%mm0\n\t"
53      "movq   8(%0), %%mm7\n\t"
54      "pxor   %%mm0, %%mm0\n\t"
55      "movq   %%mm0, 16(%0)\n\t"
56      "cmpq   $0,16(%0)\n\t"
57      JZ_NEXT
58      : : "r"(junk) : "mm7", "mm0", "cc", "memory"
59   );
60
61
62   /* --- SSE1 --- */
63
64   printf("\nComplain sse xorps\n");
65   __asm__ __volatile__(
66      "movups   0(%0),  %%xmm0\n\t"
67      "movups   16(%0), %%xmm8\n\t"
68      "xorps    %%xmm8, %%xmm0\n\t"
69      "movups   %%xmm0, 32(%0)\n\t"
70      "movq 32(%0), %%rax\n\t"
71      "addq 40(%0), %%rax\n\t"
72      JZ_NEXT
73      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
74   );
75
76   printf("\nNo complain sse xorps\n");
77   __asm__ __volatile__(
78      "movups   0(%0),  %%xmm0\n\t"
79      "movups   16(%0), %%xmm8\n\t"
80      "xorps    %%xmm0, %%xmm0\n\t"
81      "movups   %%xmm0, 32(%0)\n\t"
82      "movq 32(%0), %%rax\n\t"
83      "addq 40(%0), %%rax\n\t"
84      JZ_NEXT
85      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
86   );
87
88
89   /* --- SSE2 --- */
90
91   printf("\nComplain sse2 pxor\n");
92   __asm__ __volatile__(
93      "movups   0(%0),  %%xmm0\n\t"
94      "movups   16(%0), %%xmm8\n\t"
95      "pxor     %%xmm8, %%xmm0\n\t"
96      "movups   %%xmm0, 32(%0)\n\t"
97      "movq 32(%0), %%rax\n\t"
98      "addq 40(%0), %%rax\n\t"
99      JZ_NEXT
100      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
101   );
102
103   printf("\nNo complain sse2 pxor\n");
104   __asm__ __volatile__(
105      "movups   0(%0),  %%xmm0\n\t"
106      "movups   16(%0), %%xmm8\n\t"
107      "pxor     %%xmm0, %%xmm0\n\t"
108      "movups   %%xmm0, 32(%0)\n\t"
109      "movq 32(%0), %%rax\n\t"
110      "addq 40(%0), %%rax\n\t"
111      JZ_NEXT
112      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
113   );
114
115
116   printf("\nComplain sse2 xorpd\n");
117   __asm__ __volatile__(
118      "movups   0(%0),  %%xmm0\n\t"
119      "movups   16(%0), %%xmm8\n\t"
120      "xorpd    %%xmm8, %%xmm0\n\t"
121      "movups   %%xmm0, 32(%0)\n\t"
122      "movq 32(%0), %%rax\n\t"
123      "addq 40(%0), %%rax\n\t"
124      JZ_NEXT
125      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
126   );
127
128   printf("\nNo complain sse2 xorpd\n");
129   __asm__ __volatile__(
130      "movups   0(%0),  %%xmm0\n\t"
131      "movups   16(%0), %%xmm8\n\t"
132      "xorpd    %%xmm0, %%xmm0\n\t"
133      "movups   %%xmm0, 32(%0)\n\t"
134      "movq 32(%0), %%rax\n\t"
135      "addq 40(%0), %%rax\n\t"
136      JZ_NEXT
137      : : "r"(junk) : "rax", "xmm8", "xmm0", "cc", "memory"
138   );
139
140
141   free(junk);
142   return 0;
143}
144