cleanup: 1
This commit is contained in:
parent
6ad0b41759
commit
959bfd7f76
|
@ -342,7 +342,7 @@ fib_iter := fn(n: int): int {
|
||||||
```hb
|
```hb
|
||||||
main := fn(): int {
|
main := fn(): int {
|
||||||
addr := @as(u16, 0x1FF)
|
addr := @as(u16, 0x1FF)
|
||||||
msg := [u8].(0, 0, @as(u8, addr & 0xFF), @as(u8, addr >> 8 & 0xFF))
|
msg := [u8].(0, 0, @trunc(addr), @trunc(addr >> 8))
|
||||||
_force_stack := &msg
|
_force_stack := &msg
|
||||||
|
|
||||||
arr := [int].(1, 2, 4)
|
arr := [int].(1, 2, 4)
|
||||||
|
|
|
@ -874,7 +874,7 @@ impl Codegen {
|
||||||
|
|
||||||
match base_val.ty.expand() {
|
match base_val.ty.expand() {
|
||||||
ty::Kind::Slice(arr) => {
|
ty::Kind::Slice(arr) => {
|
||||||
let ty = self.tys.ins.arrays[arr as usize].ty;
|
let ty = self.tys.ins.slices[arr as usize].elem;
|
||||||
let item_size = self.tys.size_of(ty);
|
let item_size = self.tys.size_of(ty);
|
||||||
|
|
||||||
let Loc::Rt { derefed: true, ref mut reg, ref stack, offset } =
|
let Loc::Rt { derefed: true, ref mut reg, ref stack, offset } =
|
||||||
|
@ -1209,12 +1209,12 @@ impl Codegen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Kind::Slice(arr) => {
|
ty::Kind::Slice(arr) => {
|
||||||
let arr = self.tys.ins.arrays[arr as usize];
|
let arr = self.tys.ins.slices[arr as usize];
|
||||||
let item_size = self.tys.size_of(arr.ty);
|
let item_size = self.tys.size_of(arr.elem);
|
||||||
for (i, value) in fields.iter().enumerate() {
|
for (i, value) in fields.iter().enumerate() {
|
||||||
let loc = loc.as_ref().offset(i as u32 * item_size);
|
let loc = loc.as_ref().offset(i as u32 * item_size);
|
||||||
let value =
|
let value = self
|
||||||
self.expr_ctx(value, Ctx::default().with_loc(loc).with_ty(arr.ty))?;
|
.expr_ctx(value, Ctx::default().with_loc(loc).with_ty(arr.elem))?;
|
||||||
self.ci.free_loc(value.loc);
|
self.ci.free_loc(value.loc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2014,9 +2014,9 @@ impl Codegen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Kind::Slice(arr) => {
|
ty::Kind::Slice(arr) => {
|
||||||
let arr = &self.tys.ins.arrays[arr as usize];
|
let arr = &self.tys.ins.slices[arr as usize];
|
||||||
if arr.len == ArrayLen::MAX {
|
if arr.len == ArrayLen::MAX {
|
||||||
ty = self.tys.make_array(arr.ty, field_len as _);
|
ty = self.tys.make_array(arr.elem, field_len as _);
|
||||||
} else if arr.len != field_len as u32 {
|
} else if arr.len != field_len as u32 {
|
||||||
self.report(
|
self.report(
|
||||||
pos,
|
pos,
|
||||||
|
|
|
@ -280,6 +280,7 @@ impl TokenKind {
|
||||||
Self::Eq => (a == b) as i64,
|
Self::Eq => (a == b) as i64,
|
||||||
Self::Ne => (a != b) as i64,
|
Self::Ne => (a != b) as i64,
|
||||||
Self::Band => a & b,
|
Self::Band => a & b,
|
||||||
|
Self::Shr => a >> b,
|
||||||
s => todo!("{s}"),
|
s => todo!("{s}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,7 +318,7 @@ mod ty {
|
||||||
let gb = &ctx.globals[g as usize];
|
let gb = &ctx.globals[g as usize];
|
||||||
crate::SymKey::Decl(gb.file, gb.name)
|
crate::SymKey::Decl(gb.file, gb.name)
|
||||||
}
|
}
|
||||||
Kind::Slice(s) => crate::SymKey::Array(&ctx.arrays[s as usize]),
|
Kind::Slice(s) => crate::SymKey::Array(&ctx.slices[s as usize]),
|
||||||
Kind::Module(_) | Kind::Builtin(_) => crate::SymKey::Decl(u32::MAX, u32::MAX),
|
Kind::Module(_) | Kind::Builtin(_) => crate::SymKey::Decl(u32::MAX, u32::MAX),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -351,7 +351,7 @@ mod ty {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_pointer(self) -> bool {
|
pub fn is_pointer(self) -> bool {
|
||||||
matches!(Kind::from_ty(self), Kind::Ptr(_))
|
matches!(self.expand(), Kind::Ptr(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn try_upcast(self, ob: Self, kind: TyCheck) -> Option<Self> {
|
pub fn try_upcast(self, ob: Self, kind: TyCheck) -> Option<Self> {
|
||||||
|
@ -587,9 +587,9 @@ mod ty {
|
||||||
idx.fmt(f)
|
idx.fmt(f)
|
||||||
}
|
}
|
||||||
TK::Slice(idx) => {
|
TK::Slice(idx) => {
|
||||||
let array = self.tys.ins.arrays[idx as usize];
|
let array = self.tys.ins.slices[idx as usize];
|
||||||
f.write_str("[")?;
|
f.write_str("[")?;
|
||||||
self.rety(array.ty).fmt(f)?;
|
self.rety(array.elem).fmt(f)?;
|
||||||
if array.len != ArrayLen::MAX {
|
if array.len != ArrayLen::MAX {
|
||||||
f.write_str("; ")?;
|
f.write_str("; ")?;
|
||||||
array.len.fmt(f)?;
|
array.len.fmt(f)?;
|
||||||
|
@ -738,9 +738,14 @@ pub struct Ptr {
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub struct Array {
|
pub struct Array {
|
||||||
ty: ty::Id,
|
elem: ty::Id,
|
||||||
len: ArrayLen,
|
len: ArrayLen,
|
||||||
}
|
}
|
||||||
|
impl Array {
|
||||||
|
fn len(&self) -> Option<usize> {
|
||||||
|
(self.len != ArrayLen::MAX).then_some(self.len as usize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct ParamAlloc(Range<u8>);
|
struct ParamAlloc(Range<u8>);
|
||||||
|
|
||||||
|
@ -822,7 +827,7 @@ pub struct TypeIns {
|
||||||
structs: Vec<Struct>,
|
structs: Vec<Struct>,
|
||||||
fields: Vec<Field>,
|
fields: Vec<Field>,
|
||||||
ptrs: Vec<Ptr>,
|
ptrs: Vec<Ptr>,
|
||||||
arrays: Vec<Array>,
|
slices: Vec<Array>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -1118,9 +1123,9 @@ impl Types {
|
||||||
|
|
||||||
fn make_array_low(&mut self, ty: ty::Id, len: ArrayLen) -> ty::Slice {
|
fn make_array_low(&mut self, ty: ty::Id, len: ArrayLen) -> ty::Slice {
|
||||||
self.syms
|
self.syms
|
||||||
.get_or_insert(SymKey::Array(&Array { ty, len }), &mut self.ins, |ins| {
|
.get_or_insert(SymKey::Array(&Array { elem: ty, len }), &mut self.ins, |ins| {
|
||||||
ins.arrays.push(Array { ty, len });
|
ins.slices.push(Array { elem: ty, len });
|
||||||
ty::Kind::Slice(ins.arrays.len() as u32 - 1).compress()
|
ty::Kind::Slice(ins.slices.len() as u32 - 1).compress()
|
||||||
})
|
})
|
||||||
.expand()
|
.expand()
|
||||||
.inner()
|
.inner()
|
||||||
|
@ -1156,11 +1161,11 @@ impl Types {
|
||||||
ty::Kind::Builtin(ty::I16 | ty::U16) => 2,
|
ty::Kind::Builtin(ty::I16 | ty::U16) => 2,
|
||||||
ty::Kind::Builtin(ty::I8 | ty::U8 | ty::BOOL) => 1,
|
ty::Kind::Builtin(ty::I8 | ty::U8 | ty::BOOL) => 1,
|
||||||
ty::Kind::Slice(arr) => {
|
ty::Kind::Slice(arr) => {
|
||||||
let arr = &self.ins.arrays[arr as usize];
|
let arr = &self.ins.slices[arr as usize];
|
||||||
match arr.len {
|
match arr.len {
|
||||||
0 => 0,
|
0 => 0,
|
||||||
ArrayLen::MAX => 16,
|
ArrayLen::MAX => 16,
|
||||||
len => self.size_of(arr.ty) * len,
|
len => self.size_of(arr.elem) * len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Kind::Struct(stru) => {
|
ty::Kind::Struct(stru) => {
|
||||||
|
@ -1197,10 +1202,10 @@ impl Types {
|
||||||
align
|
align
|
||||||
}
|
}
|
||||||
ty::Kind::Slice(arr) => {
|
ty::Kind::Slice(arr) => {
|
||||||
let arr = &self.ins.arrays[arr as usize];
|
let arr = &self.ins.slices[arr as usize];
|
||||||
match arr.len {
|
match arr.len {
|
||||||
ArrayLen::MAX => 8,
|
ArrayLen::MAX => 8,
|
||||||
_ => self.align_of(arr.ty),
|
_ => self.align_of(arr.elem),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => self.size_of(ty).max(1),
|
_ => self.size_of(ty).max(1),
|
||||||
|
|
|
@ -622,6 +622,7 @@ fn find_ident(idents: &mut [ScopeIdent], id: Ident) -> &mut ScopeIdent {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_symbol(symbols: &[Symbol], id: Ident) -> &Symbol {
|
pub fn find_symbol(symbols: &[Symbol], id: Ident) -> &Symbol {
|
||||||
|
// TODO: we can turn this to direct index
|
||||||
symbols.binary_search_by_key(&id, |s| s.name).map(|i| &symbols[i]).unwrap()
|
symbols.binary_search_by_key(&id, |s| s.name).map(|i| &symbols[i]).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1024
lang/src/son.rs
1024
lang/src/son.rs
File diff suppressed because it is too large
Load diff
36
lang/tests/son_tests_arrays.txt
Normal file
36
lang/tests/son_tests_arrays.txt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
main:
|
||||||
|
ADDI64 r254, r254, -100d
|
||||||
|
ST r31, r254, 28a, 72h
|
||||||
|
LI64 r32, 4d
|
||||||
|
LI64 r33, 1d
|
||||||
|
LI64 r34, 2d
|
||||||
|
LI64 r35, 3d
|
||||||
|
LI64 r36, 1d
|
||||||
|
LI64 r37, 0d
|
||||||
|
ADDI64 r2, r254, 0d
|
||||||
|
ADDI64 r38, r254, 24d
|
||||||
|
ST r37, r254, 24a, 1h
|
||||||
|
ST r37, r254, 25a, 1h
|
||||||
|
ST r35, r254, 26a, 1h
|
||||||
|
ST r33, r254, 27a, 1h
|
||||||
|
ST r36, r254, 0a, 8h
|
||||||
|
ST r34, r254, 8a, 8h
|
||||||
|
ST r32, r254, 16a, 8h
|
||||||
|
JAL r31, r0, :pass
|
||||||
|
LD r39, r254, 27a, 1h
|
||||||
|
ADD64 r1, r39, r1
|
||||||
|
LD r31, r254, 28a, 72h
|
||||||
|
ADDI64 r254, r254, 100d
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
pass:
|
||||||
|
LD r3, r2, 8a, 8h
|
||||||
|
MULI64 r8, r3, 8d
|
||||||
|
ADD64 r10, r8, r2
|
||||||
|
LD r8, r10, 0a, 8h
|
||||||
|
LD r9, r2, 0a, 8h
|
||||||
|
ADD64 r11, r3, r9
|
||||||
|
ADD64 r1, r8, r11
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
code size: 337
|
||||||
|
ret: 8
|
||||||
|
status: Ok(())
|
0
lang/tests/son_tests_global_variables.txt
Normal file
0
lang/tests/son_tests_global_variables.txt
Normal file
Loading…
Reference in a new issue