Code alignment testing
This commit is contained in:
parent
12f25cfe51
commit
063183e46c
@ -15,6 +15,14 @@ extern "C" void nop_1x3_all_bytes_asm(u64 size);
|
|||||||
extern "C" void nop_1x9_all_bytes_asm(u64 size);
|
extern "C" void nop_1x9_all_bytes_asm(u64 size);
|
||||||
extern "C" void inc_all_bytes_asm(u64 size);
|
extern "C" void inc_all_bytes_asm(u64 size);
|
||||||
extern "C" void dec_all_bytes_asm(u64 size);
|
extern "C" void dec_all_bytes_asm(u64 size);
|
||||||
|
extern "C" void align64_loop(u64 size);
|
||||||
|
extern "C" void align1_loop(u64 size);
|
||||||
|
extern "C" void align15_loop(u64 size);
|
||||||
|
extern "C" void align31_loop(u64 size);
|
||||||
|
extern "C" void align63_loop(u64 size);
|
||||||
|
extern "C" void align75_loop(u64 size);
|
||||||
|
extern "C" void align90_loop(u64 size);
|
||||||
|
extern "C" void align112_loop(u64 size);
|
||||||
|
|
||||||
void test_fread(reptester *tester, alloc_type type);
|
void test_fread(reptester *tester, alloc_type type);
|
||||||
void test_read(reptester *tester, alloc_type type);
|
void test_read(reptester *tester, alloc_type type);
|
||||||
@ -25,6 +33,14 @@ void test_write_nop_1x3_all_bytes_asm(reptester *tester, alloc_type type);
|
|||||||
void test_write_nop_1x9_all_bytes_asm(reptester *tester, alloc_type type);
|
void test_write_nop_1x9_all_bytes_asm(reptester *tester, alloc_type type);
|
||||||
void test_write_inc_all_bytes_asm(reptester *tester, alloc_type type);
|
void test_write_inc_all_bytes_asm(reptester *tester, alloc_type type);
|
||||||
void test_write_dec_all_bytes_asm(reptester *tester, alloc_type type);
|
void test_write_dec_all_bytes_asm(reptester *tester, alloc_type type);
|
||||||
|
void test_align64_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align1_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align15_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align31_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align63_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align75_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align90_loop(reptester *tester, alloc_type type);
|
||||||
|
void test_align112_loop(reptester *tester, alloc_type type);
|
||||||
u64 get_file_length(FILE *fp);
|
u64 get_file_length(FILE *fp);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
@ -80,18 +96,26 @@ int main(int argc, char *argv[]) {
|
|||||||
// {{"WRITE", "WRITE WITH MALLOC"}, test_write},
|
// {{"WRITE", "WRITE WITH MALLOC"}, test_write},
|
||||||
// {{"WRITE MOV ASM", "WRITE MOV ASM WITH MALLOC"},
|
// {{"WRITE MOV ASM", "WRITE MOV ASM WITH MALLOC"},
|
||||||
// test_write_mov_all_bytes_asm},
|
// test_write_mov_all_bytes_asm},
|
||||||
{{"WRITE NOP ASM", "WRITE NOP ASM WITH MALLOC"},
|
// {{"WRITE NOP ASM", "WRITE NOP ASM WITH MALLOC"},
|
||||||
test_write_nop_all_bytes_asm},
|
// test_write_nop_all_bytes_asm},
|
||||||
{{"WRITE NOP 1x3 ASM", "WRITE NOP 1x3 ASM WITH MALLOC"},
|
// {{"WRITE NOP 1x3 ASM", "WRITE NOP 1x3 ASM WITH MALLOC"},
|
||||||
test_write_nop_1x3_all_bytes_asm},
|
// test_write_nop_1x3_all_bytes_asm},
|
||||||
{{"WRITE NOP 1x9 ASM", "WRITE NOP 1x9 ASM WITH MALLOC"},
|
// {{"WRITE NOP 1x9 ASM", "WRITE NOP 1x9 ASM WITH MALLOC"},
|
||||||
test_write_nop_1x9_all_bytes_asm},
|
// test_write_nop_1x9_all_bytes_asm},
|
||||||
// {{"WRITE INC ASM", "WRITE INC ASM WITH MALLOC"},
|
// {{"WRITE INC ASM", "WRITE INC ASM WITH MALLOC"},
|
||||||
// test_write_inc_all_bytes_asm},
|
// test_write_inc_all_bytes_asm},
|
||||||
// {{"WRITE DEC ASM", "WRITE DEC ASM WITH MALLOC"},
|
// {{"WRITE DEC ASM", "WRITE DEC ASM WITH MALLOC"},
|
||||||
// test_write_dec_all_bytes_asm},
|
// test_write_dec_all_bytes_asm},
|
||||||
// {{"READ", "READ WITH MALLOC"}, test_read},
|
// {{"READ", "READ WITH MALLOC"}, test_read},
|
||||||
// {{"FREAD", "FREAD WITH MALLOC"}, test_fread},
|
// {{"FREAD", "FREAD WITH MALLOC"}, test_fread},
|
||||||
|
{{"ALIGN 64", "ALIGN 64 WITH MALLOC"}, test_align64_loop},
|
||||||
|
{{"ALIGN 1", "ALIGN 1 WITH MALLOC"}, test_align1_loop},
|
||||||
|
{{"ALIGN 15", "ALIGN 15 WITH MALLOC"}, test_align15_loop},
|
||||||
|
{{"ALIGN 31", "ALIGN 31 WITH MALLOC"}, test_align31_loop},
|
||||||
|
{{"ALIGN 63", "ALIGN 63 WITH MALLOC"}, test_align63_loop},
|
||||||
|
{{"ALIGN 75", "ALIGN 75 WITH MALLOC"}, test_align75_loop},
|
||||||
|
{{"ALIGN 90", "ALIGN 90 WITH MALLOC"}, test_align90_loop},
|
||||||
|
{{"ALIGN 112", "ALIGN 112 WITH MALLOC"}, test_align112_loop},
|
||||||
};
|
};
|
||||||
|
|
||||||
tester.params.read_size = get_file_length(fp);
|
tester.params.read_size = get_file_length(fp);
|
||||||
@ -361,6 +385,208 @@ void test_write_dec_all_bytes_asm(reptester *tester, alloc_type type) {
|
|||||||
handle_free(tester, type);
|
handle_free(tester, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_align64_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align64_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align1_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align1_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align15_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align15_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align31_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align31_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align63_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align63_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align75_loop(reptester *tester, alloc_type type) {
|
||||||
|
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align75_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align90_loop(reptester *tester, alloc_type type) {
|
||||||
|
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align90_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_align112_loop(reptester *tester, alloc_type type) {
|
||||||
|
u64 start = read_cpu_timer();
|
||||||
|
u64 fault_count_start = page_fault_count();
|
||||||
|
|
||||||
|
handle_alloc(tester, type);
|
||||||
|
|
||||||
|
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||||
|
|
||||||
|
align112_loop(total_size);
|
||||||
|
|
||||||
|
u64 fault_count_end = page_fault_count();
|
||||||
|
u64 end = read_cpu_timer();
|
||||||
|
|
||||||
|
u64 read_time = end - start;
|
||||||
|
u64 page_faults = fault_count_end - fault_count_start;
|
||||||
|
|
||||||
|
tester->results = {
|
||||||
|
total_size,
|
||||||
|
read_time,
|
||||||
|
page_faults,
|
||||||
|
};
|
||||||
|
|
||||||
|
handle_free(tester, type);
|
||||||
|
}
|
||||||
|
|
||||||
u64 get_file_length(FILE *fp) {
|
u64 get_file_length(FILE *fp) {
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -4,6 +4,14 @@ global nop_1x3_all_bytes_asm
|
|||||||
global nop_1x9_all_bytes_asm
|
global nop_1x9_all_bytes_asm
|
||||||
global inc_all_bytes_asm
|
global inc_all_bytes_asm
|
||||||
global dec_all_bytes_asm
|
global dec_all_bytes_asm
|
||||||
|
global align64_loop
|
||||||
|
global align1_loop
|
||||||
|
global align15_loop
|
||||||
|
global align31_loop
|
||||||
|
global align63_loop
|
||||||
|
global align75_loop
|
||||||
|
global align90_loop
|
||||||
|
global align112_loop
|
||||||
|
|
||||||
mov_all_bytes_asm:
|
mov_all_bytes_asm:
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
@ -75,3 +83,110 @@ dec_all_bytes_asm:
|
|||||||
jnz .loop
|
jnz .loop
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
align64_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align1_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
nop
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align15_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 15
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align31_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 31
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align63_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 63
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align75_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 75
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align90_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 90
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align112_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 112
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user