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