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 int32\n");
17   __asm__ __volatile__(
18      "movl   0(%0), %%eax\n\t"
19      "movl   8(%0), %%edi\n\t"
20      "xorl   %%edi, %%eax\n\t"
21      JZ_NEXT
22      : : "r"(junk) : "edi", "eax", "cc"
23   );
24
25   printf("\nNo complain int32\n");
26   __asm__ __volatile__(
27      "movl   0(%0), %%eax\n\t"
28      "movl   8(%0), %%edi\n\t"
29      "xorl   %%eax, %%eax\n\t"
30      JZ_NEXT
31      : : "r"(junk) : "edi", "eax", "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      "movl   16(%0), %%esi\n\t"
45      "addl   20(%0), %%esi\n\t"
46      JZ_NEXT
47      : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory"
48   );
49
50   printf("\nNo complain mmx\n");
51   __asm__ __volatile__(
52      "emms\n\t"
53      "movq   0(%0), %%mm0\n\t"
54      "movq   8(%0), %%mm7\n\t"
55      "pxor   %%mm0, %%mm0\n\t"
56      "movq   %%mm0, 16(%0)\n\t"
57      "movl   16(%0), %%esi\n\t"
58      "addl   20(%0), %%esi\n\t"
59      JZ_NEXT
60      : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory"
61   );
62
63
64   /* --- SSE1 --- */
65
66   printf("\nComplain sse xorps\n");
67   __asm__ __volatile__(
68      "movups   0(%0),  %%xmm0\n\t"
69      "movups   16(%0), %%xmm7\n\t"
70      "xorps    %%xmm7, %%xmm0\n\t"
71      "movups   %%xmm0, 32(%0)\n\t"
72      "movl 32(%0), %%esi\n\t"
73      "addl 36(%0), %%esi\n\t"
74      "addl 40(%0), %%esi\n\t"
75      "addl 44(%0), %%esi\n\t"
76      JZ_NEXT
77      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
78   );
79
80   printf("\nNo complain sse xorps\n");
81   __asm__ __volatile__(
82      "movups   0(%0),  %%xmm0\n\t"
83      "movups   16(%0), %%xmm7\n\t"
84      "xorps    %%xmm0, %%xmm0\n\t"
85      "movups   %%xmm0, 32(%0)\n\t"
86      "movl 32(%0), %%esi\n\t"
87      "addl 36(%0), %%esi\n\t"
88      "addl 40(%0), %%esi\n\t"
89      "addl 44(%0), %%esi\n\t"
90      JZ_NEXT
91      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
92   );
93
94
95   /* --- SSE2 --- */
96#if 0
97   printf("\nComplain sse2 pxor\n");
98   __asm__ __volatile__(
99      "movups   0(%0),  %%xmm0\n\t"
100      "movups   16(%0), %%xmm7\n\t"
101      "pxor     %%xmm7, %%xmm0\n\t"
102      "movups   %%xmm0, 32(%0)\n\t"
103      "movl 32(%0), %%esi\n\t"
104      "addl 36(%0), %%esi\n\t"
105      "addl 40(%0), %%esi\n\t"
106      "addl 44(%0), %%esi\n\t"
107      JZ_NEXT
108      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
109   );
110
111   printf("\nNo complain sse2 pxor\n");
112   __asm__ __volatile__(
113      "movups   0(%0),  %%xmm0\n\t"
114      "movups   16(%0), %%xmm7\n\t"
115      "pxor     %%xmm0, %%xmm0\n\t"
116      "movups   %%xmm0, 32(%0)\n\t"
117      "movl 32(%0), %%esi\n\t"
118      "addl 36(%0), %%esi\n\t"
119      "addl 40(%0), %%esi\n\t"
120      "addl 44(%0), %%esi\n\t"
121      JZ_NEXT
122      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
123   );
124
125
126   printf("\nComplain sse2 xorpd\n");
127   __asm__ __volatile__(
128      "movups   0(%0),  %%xmm0\n\t"
129      "movups   16(%0), %%xmm7\n\t"
130      "xorpd    %%xmm7, %%xmm0\n\t"
131      "movups   %%xmm0, 32(%0)\n\t"
132      "movl 32(%0), %%esi\n\t"
133      "addl 36(%0), %%esi\n\t"
134      "addl 40(%0), %%esi\n\t"
135      "addl 44(%0), %%esi\n\t"
136      JZ_NEXT
137      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
138   );
139
140   printf("\nNo complain sse2 xorpd\n");
141   __asm__ __volatile__(
142      "movups   0(%0),  %%xmm0\n\t"
143      "movups   16(%0), %%xmm7\n\t"
144      "xorpd    %%xmm0, %%xmm0\n\t"
145      "movups   %%xmm0, 32(%0)\n\t"
146      "movl 32(%0), %%esi\n\t"
147      "addl 36(%0), %%esi\n\t"
148      "addl 40(%0), %%esi\n\t"
149      "addl 44(%0), %%esi\n\t"
150      JZ_NEXT
151      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
152   );
153#endif
154
155   free(junk);
156   return 0;
157}
158