diff --git a/examples/euler4.zr b/examples/euler4.zr new file mode 100644 index 0000000..454283a --- /dev/null +++ b/examples/euler4.zr @@ -0,0 +1,23 @@ +func print_i64[x: I64] : I64 + printf("%ld\n", x) + +func i64_to_string[n: I64] : String + let x: I64 = malloc(21) + sprintf(x, "%ld", n) + return x + +func main[] : I64 + let out: I64 = 0 + + let a: I64 = 500 + while a < 1000 + let b: I64 = 500 + while b < 1000 + if a * b > out + let s: String = i64_to_string(a * b) + let s_rev: String = strrev(s) + if strcmp(s, s_rev) == 0 + out = a * b + b = b + 1 + a = a + 1 + print_i64(out) \ No newline at end of file diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index a7e50fe..e1e4a70 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -100,8 +100,37 @@ extern free extern printf extern sprintf extern strlen +extern strcmp extern puts print equ puts + +; generated with clang +strrev: + push r14 + push rbx + push rax + mov rbx, rdi + call strlen + mov r14, rax + lea rdi, [rax + 1] + call malloc + mov rcx, rax + mov rsi, r14 + mov rdx, r14 +.LBB0_1: + sub rdx, 1 + jb .LBB0_2 + mov sil, byte [rbx + rsi - 1] + mov byte [rcx], sil + inc rcx + mov rsi, rdx + jmp .LBB0_1 +.LBB0_2: + mov byte [rax + r14], 0 + add rsp, 8 + pop rbx + pop r14 + ret ", ); Ok(())