mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 01:46:17 +00:00
82 lines
1.9 KiB
C
82 lines
1.9 KiB
C
|
|
#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;
|
|
}
|