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