movbe.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
1
2#include <stdio.h>
3#include <stdlib.h>
4#include <assert.h>
5#include <malloc.h>
6
7typedef  unsigned char           UChar;
8typedef  unsigned int            UInt;
9typedef  unsigned long int       UWord;
10typedef  unsigned long long int  ULong;
11
12
13typedef  struct { UChar cs[40]; }  Block;
14
15void showBlock ( char* msg, Block* b )
16{
17   int i;
18   printf("  %s ", msg);
19   for (i = 0; i < 40; i++)
20      printf("%02x", (UInt)b->cs[i]);
21   printf("\n");
22}
23
24UChar randUChar ( void )
25{
26   static UInt seed = 80021;
27   seed = 1103515245 * seed + 12345;
28   return (seed >> 17) & 0xFF;
29}
30
31void randBlock ( Block* b )
32{
33   int i;
34   UChar* p = (UChar*)b;
35   for (i = 0; i < sizeof(Block); i++)
36      p[i] = randUChar();
37}
38
39/* Generate a function test_NAME, that tests the given insn.
40   The insn may only mention (%eax) and esi. */
41
42#define GEN_test_Monly(_name, _mem_form)   \
43    \
44    __attribute__ ((noinline)) static void test_##_name ( void )   \
45    { \
46       Block* b = memalign(32, sizeof(Block)); \
47       randBlock(b); \
48       printf("%s\n", #_name); \
49       showBlock("before", b); \
50       __asm__ __volatile__( \
51          "leal      16(%0),%%eax"  "\n\t" \
52          "movl      24(%0),%%esi"   "\n\t" \
53          _mem_form  "\n\t" \
54          "movl      %%esi, 32(%0)"  "\n\t" \
55          : /*OUT*/  \
56          : /*IN*/"r"(b) \
57          : /*TRASH*/"esi","eax","memory","cc" \
58       ); \
59       showBlock("after ", b); \
60       printf("\n"); \
61       free(b); \
62    }
63
64GEN_test_Monly( MOVBE_RtoM_32, "movbel %%esi,1(%%eax)")
65GEN_test_Monly( MOVBE_RtoM_16, "movbew %%si,1(%%eax)")
66
67GEN_test_Monly( MOVBE_MtoR_32, "movbel 1(%%eax), %%esi")
68GEN_test_Monly( MOVBE_MtoR_16, "movbew 1(%%eax), %%si")
69
70int main ( void )
71{
72   test_MOVBE_RtoM_32();
73   test_MOVBE_RtoM_16();
74   test_MOVBE_MtoR_32();
75   test_MOVBE_MtoR_16();
76   return 0;
77}
78