Home | History | Annotate | Download | only in amd64
      1 
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <assert.h>
      5 #include "tests/malloc.h"
      6 
      7 typedef  unsigned char           UChar;
      8 typedef  unsigned int            UInt;
      9 typedef  unsigned long int       UWord;
     10 typedef  unsigned long long int  ULong;
     11 
     12 
     13 typedef  struct { UChar cs[40]; }  Block;
     14 
     15 void 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 
     24 UChar randUChar ( void )
     25 {
     26    static UInt seed = 80021;
     27    seed = 1103515245 * seed + 12345;
     28    return (seed >> 17) & 0xFF;
     29 }
     30 
     31 void 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 (%rax) and r9. */
     41 
     42 #define GEN_test_Monly(_name, _mem_form)   \
     43     \
     44     __attribute__ ((noinline)) static void test_##_name ( void )   \
     45     { \
     46        Block* b = memalign32(sizeof(Block)); \
     47        randBlock(b); \
     48        printf("%s\n", #_name); \
     49        showBlock("before", b); \
     50        __asm__ __volatile__( \
     51           "leaq      16(%0),%%rax"  "\n\t" \
     52           "movq      24(%0),%%r9"   "\n\t" \
     53           _mem_form  "\n\t" \
     54           "movq      %%r9, 32(%0)"  "\n\t" \
     55           : /*OUT*/  \
     56           : /*IN*/"r"(b) \
     57           : /*TRASH*/"r9","rax","memory","cc" \
     58        ); \
     59        showBlock("after ", b); \
     60        printf("\n"); \
     61        free(b); \
     62     }
     63 
     64 GEN_test_Monly( MOVBE_RtoM_64, "movbe %%r9, 1(%%rax)")
     65 GEN_test_Monly( MOVBE_RtoM_32, "movbe %%r9d,1(%%rax)")
     66 GEN_test_Monly( MOVBE_RtoM_16, "movbe %%r9w,1(%%rax)")
     67 
     68 GEN_test_Monly( MOVBE_MtoR_64, "movbe 1(%%rax), %%r9")
     69 GEN_test_Monly( MOVBE_MtoR_32, "movbe 1(%%rax), %%r9d")
     70 GEN_test_Monly( MOVBE_MtoR_16, "movbe 1(%%rax), %%r9w")
     71 
     72 int main ( void )
     73 {
     74    test_MOVBE_RtoM_64();
     75    test_MOVBE_RtoM_32();
     76    test_MOVBE_RtoM_16();
     77    test_MOVBE_MtoR_64();
     78    test_MOVBE_MtoR_32();
     79    test_MOVBE_MtoR_16();
     80    return 0;
     81 }
     82