amd64: Implement RDRAND, VCVTPH2PS and VCVTPS2PH.
[valgrind.git] / none / tests / amd64 / movbe.c
blob603e140cbfa2e2d18c65fc2b991ec45a1d60a2c4
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <assert.h>
5 #include "tests/malloc.h"
7 typedef unsigned char UChar;
8 typedef unsigned int UInt;
9 typedef unsigned long int UWord;
10 typedef unsigned long long int ULong;
13 typedef struct { UChar cs[40]; } Block;
15 void showBlock ( char* msg, Block* b )
17 int i;
18 printf(" %s ", msg);
19 for (i = 0; i < 40; i++)
20 printf("%02x", (UInt)b->cs[i]);
21 printf("\n");
24 UChar randUChar ( void )
26 static UInt seed = 80021;
27 seed = 1103515245 * seed + 12345;
28 return (seed >> 17) & 0xFF;
31 void randBlock ( Block* b )
33 int i;
34 UChar* p = (UChar*)b;
35 for (i = 0; i < sizeof(Block); i++)
36 p[i] = randUChar();
39 /* Generate a function test_NAME, that tests the given insn.
40 The insn may only mention (%rax) and r9. */
42 #define GEN_test_Monly(_name, _mem_form) \
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); \
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)")
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")
72 int main ( void )
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;