mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-10 17:36:21 +00:00
78 lines
1.8 KiB
C
78 lines
1.8 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 (%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;
|
|
}
|