Add assembly loops

This commit is contained in:
2023-12-02 22:18:57 +00:00
parent 43718ff047
commit 57acc5e16f
3 changed files with 189 additions and 7 deletions

View File

@@ -9,9 +9,18 @@
#define ARR_LEN(ARR) sizeof(ARR) / sizeof(*ARR)
extern "C" void mov_all_bytes_asm(char *buffer, u64 size);
extern "C" void nop_all_bytes_asm(u64 size);
extern "C" void inc_all_bytes_asm(u64 size);
extern "C" void dec_all_bytes_asm(u64 size);
void test_fread(reptester *tester, alloc_type type);
void test_read(reptester *tester, alloc_type type);
void test_write(reptester *tester, alloc_type type);
void test_write_mov_all_bytes_asm(reptester *tester, alloc_type type);
void test_write_nop_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);
u64 get_file_length(FILE *fp);
int main(int argc, char *argv[]) {
@@ -65,8 +74,16 @@ int main(int argc, char *argv[]) {
func_data funcs[] = {
{{"WRITE", "WRITE WITH MALLOC"}, test_write},
{{"READ", "READ WITH MALLOC"}, test_read},
{{"FREAD", "FREAD WITH MALLOC"}, test_fread},
{{"WRITE MOV ASM", "WRITE MOV ASM WITH MALLOC"},
test_write_mov_all_bytes_asm},
{{"WRITE NOP ASM", "WRITE NOP ASM WITH MALLOC"},
test_write_nop_all_bytes_asm},
{{"WRITE INC ASM", "WRITE INC ASM WITH MALLOC"},
test_write_inc_all_bytes_asm},
{{"WRITE DEC ASM", "WRITE DEC ASM WITH MALLOC"},
test_write_dec_all_bytes_asm},
// {{"READ", "READ WITH MALLOC"}, test_read},
// {{"FREAD", "FREAD WITH MALLOC"}, test_fread},
};
tester.params.read_size = get_file_length(fp);
@@ -155,6 +172,12 @@ void test_read(reptester *tester, alloc_type type) {
fclose(fp);
}
void write_to_all_bytes(char *buffer, u64 size) {
for (u64 i = 0; i < size; ++i) {
buffer[i] = i;
}
}
void test_write(reptester *tester, alloc_type type) {
u64 start = read_cpu_timer();
u64 fault_count_start = page_fault_count();
@@ -163,9 +186,107 @@ void test_write(reptester *tester, alloc_type type) {
u64 total_size = tester->params.read_size * tester->params.read_count;
for (u64 i = 0; i < total_size; ++i) {
tester->params.buffer[i] = '0';
}
write_to_all_bytes(tester->params.buffer, 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_write_mov_all_bytes_asm(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;
mov_all_bytes_asm(tester->params.buffer, 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_write_nop_all_bytes_asm(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;
nop_all_bytes_asm(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_write_inc_all_bytes_asm(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;
inc_all_bytes_asm(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_write_dec_all_bytes_asm(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;
dec_all_bytes_asm(total_size);
u64 fault_count_end = page_fault_count();
u64 end = read_cpu_timer();

View File

@@ -0,0 +1,43 @@
global mov_all_bytes_asm
global nop_all_bytes_asm
global inc_all_bytes_asm
global dec_all_bytes_asm
mov_all_bytes_asm:
xor rax, rax
.loop:
mov BYTE [rdi + rax * 1], al
inc rax
cmp rsi, rax
jne .loop
ret
nop_all_bytes_asm:
xor rax, rax
.loop:
db 0x0f, 0x1f, 0x00
inc rax
cmp rdi, rax
jne .loop
ret
inc_all_bytes_asm:
xor rax, rax
.loop:
inc rax
cmp rdi, rax
jne .loop
ret
dec_all_bytes_asm:
.loop:
dec rdi
jnz .loop
ret