@@ -1962,6 +1962,10 @@ fn (mut c Amd64) mod_reg_rax(b Amd64Register) {
19621962 c.mov_reg (.rax, .rdx)
19631963}
19641964
1965+ fn (mut c Amd64) cg_sub_reg (a Register, b Register) {
1966+ c.sub_reg (a.amd64 (), b.amd64 ())
1967+ }
1968+
19651969fn (mut c Amd64) sub_reg (a Amd64 Register, b Amd64 Register) {
19661970 if i32 (a) < = i32 (Amd64 Register.r15 ) && i32 (b) < = i32 (Amd64 Register.r15 ) {
19671971 c.g.write8 (0x48 + if i32 (a) > = i32 (Amd64 Register.r8 ) { i32 (1 ) } else { i32 (0 ) } +
@@ -2086,7 +2090,7 @@ pub fn (mut c Amd64) cg_call_fn(node ast.CallExpr) {
20862090 return_size := c.g.get_type_size (node.return_type)
20872091 mut return_pos := i32 (- 1 )
20882092 mut is_struct_return := false
2089- if ts.kind in [.struct , .multi_return] {
2093+ if ts.kind in [.struct , .multi_return, .array ] {
20902094 return_pos = c.g.allocate_by_type ('' , node.return_type)
20912095 if return_size > 16 {
20922096 is_struct_return = true
@@ -2361,7 +2365,7 @@ fn (mut c Amd64) assign_struct_var(ident_var IdentVar, typ ast.Type, s i32) {
23612365 assert size == 0
23622366}
23632367
2364- fn (mut c Amd64) assign_var (var IdentVar, raw_type ast.Type) {
2368+ fn (mut c Amd64) cg_assign_var (var IdentVar, raw_type ast.Type) {
23652369 typ := c.g.unwrap (raw_type)
23662370 info := c.g.table.sym (typ).info
23672371 size := c.g.get_type_size (typ)
@@ -2381,6 +2385,9 @@ fn (mut c Amd64) assign_var(var IdentVar, raw_type ast.Type) {
23812385 } else if info is ast.Struct && ! typ.is_any_kind_of_pointer ()
23822386 && ! raw_type.is_any_kind_of_pointer () {
23832387 c.assign_struct_var (var, typ, size)
2388+ } else if info is ast.Array && ! typ.is_any_kind_of_pointer ()
2389+ && ! raw_type.is_any_kind_of_pointer () {
2390+ c.assign_struct_var (var, typ, size)
23842391 } else if int (size) in [1 , 2 , 4 , 8 ] {
23852392 match var {
23862393 LocalVar {
@@ -2593,8 +2600,12 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
25932600 match node.op {
25942601 .decl_assign {
25952602 if right.is_fixed {
2596- c.g.n_error ('${@LOCATION} Unsupported ${node} ${right} ' )
2603+ dest := c.g.allocate_by_type (name, ast.voidptr_type_idx)
2604+ c.g.expr (right)
2605+ c.cg_mov_reg_to_var (LocalVar{dest, ast.voidptr_type_idx, name},
2606+ .reg0 )
25972607 } else if right.exprs.len == 0 {
2608+ // TODO: remove when ArrayInit for dynarrays will be solved in the transformer
25982609 // `[]int{len: 6, cap:10, init:22}`
25992610 c.g.allocate_by_type (ident.name, ast.array_type)
26002611 len := ast.CallArg{
@@ -2728,7 +2739,7 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
27282739
27292740 if node.op in [.assign, .decl_assign] {
27302741 var := c.g.get_var_from_ident (ident)
2731- c.assign_var (var, left_type)
2742+ c.cg_assign_var (var, left_type)
27322743 } else if left_type.is_pure_float () {
27332744 c.mov_var_to_ssereg (.xmm1 , ident)
27342745
@@ -2775,7 +2786,7 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
27752786
27762787 if node.op in [.assign, .decl_assign] {
27772788 var := c.g.get_var_from_ident (ident)
2778- c.assign_var (var, left_type)
2789+ c.cg_assign_var (var, left_type)
27792790 } else if left_type.is_pure_float () {
27802791 c.mov_var_to_ssereg (.xmm1 , ident)
27812792
@@ -4293,55 +4304,6 @@ fn (mut c Amd64) copy_struct_to_struct(field ast.StructField, f_offset i32, data
42934304 }
42944305}
42954306
4296- fn (mut c Amd64) cg_init_array (var Var, node ast.ArrayInit) {
4297- match var {
4298- ast.Ident {
4299- var_object := c.g.get_var_from_ident (var)
4300- match var_object {
4301- LocalVar {
4302- c.cg_init_array (var_object as LocalVar , node)
4303- }
4304- GlobalVar {
4305- c.cg_init_array (var_object as GlobalVar , node)
4306- }
4307- Register {
4308- // TODO
4309- // c.g.cmp()
4310- }
4311- ExternVar {
4312- c.cg_init_array (var_object as ExternVar , node)
4313- }
4314- PreprocVar {
4315- c.cg_init_array (var_object as PreprocVar , node)
4316- }
4317- ConstVar {
4318- c.cg_init_array (var_object as ConstVar , node)
4319- }
4320- }
4321- }
4322- LocalVar {
4323- mut offset := var.offset
4324- for expr in node.exprs {
4325- c.g.expr (expr)
4326- c.cg_mov_reg_to_var (LocalVar{offset, ast.i64_ type_idx, '' }, .reg0 )
4327- offset + = 8
4328- }
4329- }
4330- GlobalVar {
4331- c.g.n_error ('${@LOCATION} unsupported var type ${var} ' )
4332- }
4333- ExternVar {
4334- c.g.n_error ('${@LOCATION} unsupported var type ${var} ' )
4335- }
4336- PreprocVar {
4337- c.g.n_error ('${@LOCATION} unsupported var type ${var} ' )
4338- }
4339- ConstVar {
4340- c.g.n_error ('${@LOCATION} unsupported var type ${var} ' )
4341- }
4342- }
4343- }
4344-
43454307// TODO: replace with .str()
43464308fn (mut c Amd64) cg_convert_bool_to_string (r Register) {
43474309 reg := r.amd64 ()
0 commit comments