array literals

This commit is contained in:
2025-06-07 13:27:22 +02:00
parent c3badb609c
commit 252efd914e
7 changed files with 61 additions and 64 deletions

View File

@@ -1,5 +1,5 @@
func main[] : I64 func main[] : I64
let xs: Array = Array.new() let xs: Array = [5849, 3869, 2859]
Array.push(xs, 5242) Array.push(xs, 5242)
Array.push(xs, 6533) Array.push(xs, 6533)
Array.push(xs, 4574) Array.push(xs, 4574)

View File

@@ -22,19 +22,7 @@ func partition[arr: Array, low: I64, high: I64] : I64
return i + 1 return i + 1
func main[] : I64 func main[] : I64
let arr: Array = Array.new() let arr: Array = [340, 252, 352, 117, 650, 652, 322, 175, 714, 268, 725, 664]
Array.push(arr, 340)
Array.push(arr, 252)
Array.push(arr, 352)
Array.push(arr, 117)
Array.push(arr, 650)
Array.push(arr, 652)
Array.push(arr, 322)
Array.push(arr, 175)
Array.push(arr, 714)
Array.push(arr, 268)
Array.push(arr, 725)
Array.push(arr, 664)
for i in 0:Array.size(arr) for i in 0:Array.size(arr)
print_i64(Array.nth(arr, i)) print_i64(Array.nth(arr, i))

View File

@@ -1,5 +1,5 @@
func rule110_step[state: Array] : Array func rule110_step[state: Array] : Array
let new_state: Array = Array.new() let new_state: Array = []
for i in 0:Array.size(state) for i in 0:Array.size(state)
let left: Bool = false let left: Bool = false
@@ -27,7 +27,7 @@ func to_str[state: Array]: String
func main[] : I64 func main[] : I64
let SIZE: I64 = 60 let SIZE: I64 = 60
let state: Array = Array.new() let state: Array = []
for i in 0:SIZE for i in 0:SIZE
Array.push(state, false) Array.push(state, false)
Array.push(state, true) Array.push(state, true)

View File

@@ -33,29 +33,29 @@ OS.listdir:
mov rdi, r14 mov rdi, r14
call opendir call opendir
mov r14, rax mov r14, rax
.LBB5_1: .OS.listdir.1:
mov rdi, r14 mov rdi, r14
call readdir call readdir
test rax, rax test rax, rax
je .LBB5_7 je .OS.listdir.3
cmp byte [rax+19], 46 cmp byte [rax+19], 46
jne .LBB5_6 jne .OS.listdir.2
movzx ecx, byte [rax+20] movzx ecx, byte [rax+20]
test ecx, ecx test ecx, ecx
je .LBB5_1 je .OS.listdir.1
cmp ecx, 46 cmp ecx, 46
jne .LBB5_6 jne .OS.listdir.2
cmp byte [rax+21], 0 cmp byte [rax+21], 0
je .LBB5_1 je .OS.listdir.1
.LBB5_6: .OS.listdir.2:
add rax, 19 add rax, 19
mov rdi, rax mov rdi, rax
call strdup call strdup
mov rsi, rax mov rsi, rax
mov rdi, rbx mov rdi, rbx
call Array.push call Array.push
jmp .LBB5_1 jmp .OS.listdir.1
.LBB5_7: .OS.listdir.3:
mov rdi, r14 mov rdi, r14
call closedir call closedir
mov rax, rbx mov rax, rbx
@@ -64,11 +64,6 @@ OS.listdir:
pop r14 pop r14
ret ret
Array.new:
mov rdi, 1
mov rsi, 24
jmp calloc
Array.nth: Array.nth:
mov rax, [rdi] mov rax, [rdi]
mov rax, [rax + rsi*8] mov rax, [rax + rsi*8]
@@ -88,7 +83,7 @@ Array.push:
mov rax, [rdi] mov rax, [rdi]
mov rcx, [rdi + 16] mov rcx, [rdi + 16]
cmp rcx, [rdi + 8] cmp rcx, [rdi + 8]
jne .no_realloc jne .Array.push.1
lea rdx, [rcx + rcx] lea rdx, [rcx + rcx]
mov rsi, 4 mov rsi, 4
test rcx, rcx test rcx, rcx
@@ -99,7 +94,7 @@ Array.push:
call realloc call realloc
mov [rbx], rax mov [rbx], rax
mov rcx, [rbx + 16] mov rcx, [rbx + 16]
.no_realloc: .Array.push.1:
mov [rax + rcx*8], r14 mov [rax + rcx*8], r14
inc qword [rbx + 16] inc qword [rbx + 16]
add rsp, 8 add rsp, 8
@@ -119,34 +114,3 @@ Array.free:
mov rdi, rbx mov rdi, rbx
pop rbx pop rbx
jmp free jmp free
Math.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

View File

@@ -58,6 +58,7 @@ macro_rules! emit {
} }
static REGISTERS: [&str; 6] = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"]; static REGISTERS: [&str; 6] = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"];
// TODO: currently they are all just 8 byte values
static TYPES: [&str; 6] = ["I64", "String", "Bool", "Ptr", "Char", "Array"]; static TYPES: [&str; 6] = ["I64", "String", "Bool", "Ptr", "Char", "Array"];
pub struct CodegenX86_64 { pub struct CodegenX86_64 {
@@ -452,6 +453,18 @@ extern gettimeofday
emit!(&mut self.output, " call {}", callee); emit!(&mut self.output, " call {}", callee);
} }
Expr::ArrayLiteral(exprs) => {
emit!(&mut self.output, " call Array.new");
emit!(&mut self.output, " mov r12, rax");
for expr in exprs {
self.compile_expr(env, expr)?;
emit!(&mut self.output, " mov rsi, rax");
emit!(&mut self.output, " mov rdi, r12");
emit!(&mut self.output, " call Array.push");
}
emit!(&mut self.output, " mov rax, r12");
}
} }
Ok(()) Ok(())
} }

View File

@@ -66,6 +66,7 @@ pub enum Expr {
paren: Token, paren: Token,
args: Vec<Expr>, args: Vec<Expr>,
}, },
ArrayLiteral(Vec<Expr>),
} }
pub struct Parser { pub struct Parser {
@@ -436,6 +437,19 @@ impl Parser {
let expr = self.expression()?; let expr = self.expression()?;
self.consume(TokenType::RightParen, "expected ')' after expression")?; self.consume(TokenType::RightParen, "expected ')' after expression")?;
Ok(Expr::Grouping(Box::new(expr))) Ok(Expr::Grouping(Box::new(expr)))
} else if self.match_token(&[TokenType::LeftBracket]) {
let mut xs = vec![];
if !self.check(&TokenType::RightBracket) {
loop {
xs.push(self.expression()?);
if !self.match_token(&[TokenType::Comma]) {
break;
}
}
}
self.consume(TokenType::RightBracket, "expected ']' after values")?;
Ok(Expr::ArrayLiteral(xs))
} else if self.match_token(&[TokenType::Identifier]) { } else if self.match_token(&[TokenType::Identifier]) {
Ok(Expr::Variable(self.previous().clone())) Ok(Expr::Variable(self.previous().clone()))
} else { } else {

View File

@@ -95,6 +95,21 @@ func Math.pow[b: I64, e: I64] : I64
func Math.lcm[a: I64, b: I64] : I64 func Math.lcm[a: I64, b: I64] : I64
return (a * b) / Math.gcd(a, b) return (a * b) / Math.gcd(a, b)
func Math.isqrt[n: I64] : I64
if n < 0
return -1
if n == 0 || n == 1
return n
let guess: I64 = n
let next_guess: I64 = (guess + n / guess) / 2
while next_guess < guess
guess = next_guess
next_guess = (guess + n / guess) / 2
return guess
func Math.is_prime[n: I64]: I64 func Math.is_prime[n: I64]: I64
if n <= 1 if n <= 1
return false return false
@@ -109,3 +124,6 @@ func Math.is_prime[n: I64]: I64
return false return false
i = i + 6 i = i + 6
return true return true
func Array.new[] : Array
return calloc(1, 24)