#include <stdio.h> #include <stdlib.h> #include <assert.h> #include "tests/malloc.h" typedef unsigned char UChar; typedef unsigned int UInt; typedef unsigned long int UWord; typedef unsigned long long int ULong; typedef struct { UChar cs[40]; } Block; void showBlock ( char* msg, Block* b ) { int i; printf(" %s ", msg); for (i = 0; i < 40; i++) printf("%02x", (UInt)b->cs[i]); printf("\n"); } UChar randUChar ( void ) { static UInt seed = 80021; seed = 1103515245 * seed + 12345; return (seed >> 17) & 0xFF; } void randBlock ( Block* b ) { int i; UChar* p = (UChar*)b; for (i = 0; i < sizeof(Block); i++) p[i] = randUChar(); } /* Generate a function test_NAME, that tests the given insn. The insn may only mention (%rax) and r9. */ #define GEN_test_Monly(_name, _mem_form) \ \ __attribute__ ((noinline)) static void test_##_name ( void ) \ { \ Block* b = memalign32(sizeof(Block)); \ randBlock(b); \ printf("%s\n", #_name); \ showBlock("before", b); \ __asm__ __volatile__( \ "leaq 16(%0),%%rax" "\n\t" \ "movq 24(%0),%%r9" "\n\t" \ _mem_form "\n\t" \ "movq %%r9, 32(%0)" "\n\t" \ : /*OUT*/ \ : /*IN*/"r"(b) \ : /*TRASH*/"r9","rax","memory","cc" \ ); \ showBlock("after ", b); \ printf("\n"); \ free(b); \ } GEN_test_Monly( MOVBE_RtoM_64, "movbe %%r9, 1(%%rax)") GEN_test_Monly( MOVBE_RtoM_32, "movbe %%r9d,1(%%rax)") GEN_test_Monly( MOVBE_RtoM_16, "movbe %%r9w,1(%%rax)") GEN_test_Monly( MOVBE_MtoR_64, "movbe 1(%%rax), %%r9") GEN_test_Monly( MOVBE_MtoR_32, "movbe 1(%%rax), %%r9d") GEN_test_Monly( MOVBE_MtoR_16, "movbe 1(%%rax), %%r9w") int main ( void ) { test_MOVBE_RtoM_64(); test_MOVBE_RtoM_32(); test_MOVBE_RtoM_16(); test_MOVBE_MtoR_64(); test_MOVBE_MtoR_32(); test_MOVBE_MtoR_16(); return 0; }