| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <assert.h> |
| |
| #define JZ_NEXT ".byte 0x74,0x00" /* jz the-next-insn */ |
| |
| int main ( void ) |
| { |
| char* junk = malloc(48); |
| assert(junk); |
| |
| |
| /* --- INTEGER --- */ |
| |
| printf("\nComplain int32\n"); |
| __asm__ __volatile__( |
| "movl 0(%0), %%eax\n\t" |
| "movl 8(%0), %%edi\n\t" |
| "xorl %%edi, %%eax\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "edi", "eax", "cc" |
| ); |
| |
| printf("\nNo complain int32\n"); |
| __asm__ __volatile__( |
| "movl 0(%0), %%eax\n\t" |
| "movl 8(%0), %%edi\n\t" |
| "xorl %%eax, %%eax\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "edi", "eax", "cc" |
| ); |
| |
| |
| /* --- MMX --- */ |
| |
| printf("\nComplain mmx\n"); |
| __asm__ __volatile__( |
| "emms\n\t" |
| "movq 0(%0), %%mm0\n\t" |
| "movq 8(%0), %%mm7\n\t" |
| "pxor %%mm7, %%mm0\n\t" |
| "movq %%mm0, 16(%0)\n\t" |
| "movl 16(%0), %%esi\n\t" |
| "addl 20(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory" |
| ); |
| |
| printf("\nNo complain mmx\n"); |
| __asm__ __volatile__( |
| "emms\n\t" |
| "movq 0(%0), %%mm0\n\t" |
| "movq 8(%0), %%mm7\n\t" |
| "pxor %%mm0, %%mm0\n\t" |
| "movq %%mm0, 16(%0)\n\t" |
| "movl 16(%0), %%esi\n\t" |
| "addl 20(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory" |
| ); |
| |
| |
| /* --- SSE1 --- */ |
| |
| printf("\nComplain sse xorps\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "xorps %%xmm7, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| |
| printf("\nNo complain sse xorps\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "xorps %%xmm0, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| |
| |
| /* --- SSE2 --- */ |
| #if 0 |
| printf("\nComplain sse2 pxor\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "pxor %%xmm7, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| |
| printf("\nNo complain sse2 pxor\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "pxor %%xmm0, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| |
| |
| printf("\nComplain sse2 xorpd\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "xorpd %%xmm7, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| |
| printf("\nNo complain sse2 xorpd\n"); |
| __asm__ __volatile__( |
| "movups 0(%0), %%xmm0\n\t" |
| "movups 16(%0), %%xmm7\n\t" |
| "xorpd %%xmm0, %%xmm0\n\t" |
| "movups %%xmm0, 32(%0)\n\t" |
| "movl 32(%0), %%esi\n\t" |
| "addl 36(%0), %%esi\n\t" |
| "addl 40(%0), %%esi\n\t" |
| "addl 44(%0), %%esi\n\t" |
| JZ_NEXT |
| : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory" |
| ); |
| #endif |
| |
| free(junk); |
| return 0; |
| } |