diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index 38c84de..effbc66 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -114,39 +114,9 @@ extern fread extern rewind extern system extern exit +extern gettimeofday copystr equ strdup -isqrt: - xor rax, rax - mov rcx, 1 - mov rbx, rdi - shl rcx, 62 -.isqrt.1: - cmp rcx, 0 - je .isqrt.5 - cmp rcx, rbx - jbe .isqrt.2 - shr rcx, 2 - jmp .isqrt.1 -.isqrt.2: - cmp rcx, 0 - je .isqrt.5 - mov rdx, rax - add rdx, rcx - cmp rbx, rdx - jb .isqrt.3 - sub rbx, rdx - shr rax, 1 - add rax, rcx - jmp .isqrt.4 -.isqrt.3: - shr rax, 1 -.isqrt.4: - shr rcx, 2 - jmp .isqrt.2 -.isqrt.5: - ret - nth: movzx rax, byte [rdi + rsi] ret @@ -154,6 +124,54 @@ nth: set: mov [rdi + rsi], dl ret + +time: + push rbx + sub rsp, 16 + mov rbx, rsp + mov rdi, rbx + xor esi, esi + call gettimeofday + imul rcx, qword [rbx], 1000 + mov rax, qword [rbx+8] + mov esi, 1000 + cqo + idiv rsi + add rax, rcx + add rsp, 16 + pop rbx + ret + +isqrt: + xor rax, rax + mov rcx, 1 + mov rbx, rdi + shl rcx, 62 +.isqrt.1: + cmp rcx, 0 + je .isqrt.5 + cmp rcx, rbx + jbe .isqrt.2 + shr rcx, 2 + jmp .isqrt.1 +.isqrt.2: + cmp rcx, 0 + je .isqrt.5 + mov rdx, rax + add rdx, rcx + cmp rbx, rdx + jb .isqrt.3 + sub rbx, rdx + shr rax, 1 + add rax, rcx + jmp .isqrt.4 +.isqrt.3: + shr rax, 1 +.isqrt.4: + shr rcx, 2 + jmp .isqrt.2 +.isqrt.5: + ret ", ); Ok(()) diff --git a/test.py b/test.py deleted file mode 100644 index 193900d..0000000 --- a/test.py +++ /dev/null @@ -1,21 +0,0 @@ -import os -import sys -import time - -os.system("cargo build --release") - -for x in os.listdir("examples/"): - print( - "\033[93mBuilding %s...\033[0m" % x, - end="", - flush=True, - ) - t = time.time() - if os.system("./target/release/zern examples/" + x) != 0: - sys.exit(1) - print(" %sms" % round((time.time() - t) * 1000, 2)) - - t = time.time() - if os.system("./out") != 0: - sys.exit(1) - print("\033[93mRunning %s...\033[0m %sms" % (x, round((time.time() - t) * 1000, 2))) diff --git a/test.zr b/test.zr new file mode 100644 index 0000000..d3f446a --- /dev/null +++ b/test.zr @@ -0,0 +1,40 @@ +func run_test[x: String] : I64 + printf("Building %s...", x) + let cmd: String = concat("./target/release/zern examples/", x) + + let build_start_time: I64 = time() + if system(cmd) != 0 + exit(1) + let build_end_time: I64 = time() + + free(cmd) + printf(" %ldms\n", build_end_time - build_start_time) + + let run_start_time: I64 = time() + if system("./out") != 0 + exit(1) + let run_end_time: I64 = time() + + printf("Running %s... %ldms\n", x, run_end_time - run_start_time) + +func main[] : I64 + system("cargo build --release") + + // TODO + run_test("euler1.zr") + run_test("euler2.zr") + run_test("euler3.zr") + run_test("euler4.zr") + run_test("euler5.zr") + run_test("euler6.zr") + run_test("euler7.zr") + run_test("euler8.zr") + run_test("euler9.zr") + run_test("euler10.zr") + run_test("euler12.zr") + run_test("euler13.zr") + run_test("euler14.zr") + run_test("euler15.zr") + run_test("fib.zr") + run_test("hello.zr") + run_test("strings.zr") \ No newline at end of file