#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 (%eax) and esi. */ #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__( \ "leal 16(%0),%%eax" "\n\t" \ "movl 24(%0),%%esi" "\n\t" \ _mem_form "\n\t" \ "movl %%esi, 32(%0)" "\n\t" \ : /*OUT*/ \ : /*IN*/"r"(b) \ : /*TRASH*/"esi","eax","memory","cc" \ ); \ showBlock("after ", b); \ printf("\n"); \ free(b); \ } GEN_test_Monly( MOVBE_RtoM_32, "movbel %%esi,1(%%eax)") GEN_test_Monly( MOVBE_RtoM_16, "movbew %%si,1(%%eax)") GEN_test_Monly( MOVBE_MtoR_32, "movbel 1(%%eax), %%esi") GEN_test_Monly( MOVBE_MtoR_16, "movbew 1(%%eax), %%si") int main ( void ) { test_MOVBE_RtoM_32(); test_MOVBE_RtoM_16(); test_MOVBE_MtoR_32(); test_MOVBE_MtoR_16(); return 0; }