@@ -311,6 +311,9 @@ fn (mut c Amd64) cmp_var_reg(var Var, reg Register, config VarConfig) {
311311 // TODO
312312 // g.cmp()
313313 }
314+ ExternVar {
315+ c.cmp_var_reg (var_object as ExternVar , reg, config)
316+ }
314317 }
315318 }
316319 LocalVar {
@@ -330,6 +333,9 @@ fn (mut c Amd64) cmp_var_reg(var Var, reg Register, config VarConfig) {
330333 GlobalVar {
331334 // TODO
332335 }
336+ ExternVar {
337+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
338+ }
333339 }
334340}
335341
@@ -348,6 +354,9 @@ fn (mut c Amd64) cmp_var(var Var, val i32, config VarConfig) {
348354 // TODO
349355 // g.cmp()
350356 }
357+ ExternVar {
358+ c.cmp_var (var_object as ExternVar , val, config)
359+ }
351360 }
352361 }
353362 LocalVar {
@@ -367,6 +376,9 @@ fn (mut c Amd64) cmp_var(var Var, val i32, config VarConfig) {
367376 GlobalVar {
368377 // TODO
369378 }
379+ ExternVar {
380+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
381+ }
370382 }
371383}
372384
@@ -386,6 +398,9 @@ fn (mut c Amd64) dec_var(var Var, config VarConfig) {
386398 // TODO
387399 // g.dec()
388400 }
401+ ExternVar {
402+ c.dec_var (var_object as ExternVar , config)
403+ }
389404 }
390405 }
391406 LocalVar {
@@ -405,6 +420,9 @@ fn (mut c Amd64) dec_var(var Var, config VarConfig) {
405420 GlobalVar {
406421 // TODO
407422 }
423+ ExternVar {
424+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
425+ }
408426 }
409427}
410428
@@ -425,6 +443,9 @@ fn (mut c Amd64) inc_var(var Var, config VarConfig) {
425443 // TODO
426444 // g.inc()
427445 }
446+ ExternVar {
447+ c.inc_var (var_object as ExternVar , config)
448+ }
428449 }
429450 }
430451 LocalVar {
@@ -468,6 +489,9 @@ fn (mut c Amd64) inc_var(var Var, config VarConfig) {
468489 c.g.n_error ('${@LOCATION } Global variables incrementation is not supported yet' )
469490 // TODO
470491 }
492+ ExternVar {
493+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
494+ }
471495 }
472496}
473497
@@ -662,6 +686,9 @@ fn (mut c Amd64) mov_reg_to_var(var Var, r Register, config VarConfig) {
662686 // TODO
663687 c.g.n_error ('${@LOCATION } unsupported Ident Register' )
664688 }
689+ ExternVar {
690+ c.mov_reg_to_var (var_object as ExternVar , reg, config)
691+ }
665692 }
666693 }
667694 LocalVar {
@@ -743,6 +770,9 @@ fn (mut c Amd64) mov_reg_to_var(var Var, r Register, config VarConfig) {
743770 // TODO
744771 c.g.n_error ('${@LOCATION } Unsupported GlobalVar' )
745772 }
773+ ExternVar {
774+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
775+ }
746776 }
747777}
748778
@@ -760,6 +790,9 @@ fn (mut c Amd64) mov_int_to_var(var Var, integer i32, config VarConfig) {
760790 Register {
761791 // TODO
762792 }
793+ ExternVar {
794+ c.mov_int_to_var (var_object as ExternVar , integer, config)
795+ }
763796 }
764797 }
765798 LocalVar {
@@ -822,6 +855,9 @@ fn (mut c Amd64) mov_int_to_var(var Var, integer i32, config VarConfig) {
822855 GlobalVar {
823856 // TODO
824857 }
858+ ExternVar {
859+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
860+ }
825861 }
826862}
827863
@@ -868,6 +904,9 @@ fn (mut c Amd64) mov_var_to_reg(reg Register, var Var, config VarConfig) {
868904 Register {
869905 // TODO
870906 }
907+ ExternVar {
908+ c.mov_var_to_reg (reg, var_object as ExternVar , config)
909+ }
871910 }
872911 }
873912 LocalVar {
@@ -933,6 +972,9 @@ fn (mut c Amd64) mov_var_to_reg(reg Register, var Var, config VarConfig) {
933972 GlobalVar {
934973 c.g.n_error ('${@LOCATION } Unsupported GlobalVar' )
935974 }
975+ ExternVar {
976+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
977+ }
936978 }
937979}
938980
@@ -2077,19 +2119,34 @@ fn (mut c Amd64) assign_var(var IdentVar, raw_type ast.Type) {
20772119 size := c.g.get_type_size (typ)
20782120 if typ.is_pure_float () {
20792121 match var {
2080- LocalVar { c.mov_ssereg_to_var (var as LocalVar , .xmm0 ) }
2081- GlobalVar { c.mov_ssereg_to_var (var as GlobalVar , .xmm0 ) }
2122+ LocalVar {
2123+ c.mov_ssereg_to_var (var as LocalVar , .xmm0 )
2124+ }
2125+ GlobalVar {
2126+ c.mov_ssereg_to_var (var as GlobalVar , .xmm0 )
2127+ }
20822128 // Amd64Register { c.g.mov_ssereg(var as Amd64Register, .xmm0) }
2083- else {}
2129+ else {
2130+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
2131+ }
20842132 }
20852133 } else if info is ast.Struct && ! typ.is_any_kind_of_pointer ()
20862134 && ! raw_type.is_any_kind_of_pointer () {
20872135 c.assign_struct_var (var, typ, size)
20882136 } else if int (size) in [1 , 2 , 4 , 8 ] {
20892137 match var {
2090- LocalVar { c.mov_reg_to_var (var as LocalVar , Amd64 Register.rax) }
2091- GlobalVar { c.mov_reg_to_var (var as GlobalVar , Amd64 Register.rax) }
2092- Register { c.mov_reg (var as Amd64Register , Amd64 Register.rax) }
2138+ LocalVar {
2139+ c.mov_reg_to_var (var as LocalVar , Amd64 Register.rax)
2140+ }
2141+ GlobalVar {
2142+ c.mov_reg_to_var (var as GlobalVar , Amd64 Register.rax)
2143+ }
2144+ Register {
2145+ c.mov_reg (var as Amd64Register , Amd64 Register.rax)
2146+ }
2147+ ExternVar {
2148+ c.mov_reg_to_var (var as ExternVar , Amd64 Register.rax)
2149+ }
20932150 }
20942151 } else {
20952152 c.g.n_error ('${@LOCATION } error assigning type ${typ } with size ${size }: ${info }' )
@@ -2121,6 +2178,12 @@ fn (mut c Amd64) assign_ident_int_lit(node ast.AssignStmt, i i32, int_lit ast.In
21212178 c.div_reg (.rax, .rdx)
21222179 c.mov_reg_to_var (left, Amd64 Register.rax)
21232180 }
2181+ .mod_assign {
2182+ c.mov_var_to_reg (Amd64 Register.rax, left)
2183+ c.mov64 (Amd64 Register.rdx, i64 (int_lit.val.int ()))
2184+ c.mod_reg (.rax, .rdx)
2185+ c.mov_reg_to_var (left, Amd64 Register.rax)
2186+ }
21242187 .decl_assign {
21252188 c.allocate_var (left.name, 8 , i64 (int_lit.val.int ()))
21262189 }
@@ -2241,11 +2304,19 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
22412304 val := enum_info.fields[right.val] or {
22422305 c.g.n_error ('${@LOCATION } enum field not found ${right .val }' )
22432306 }
2244- if node.op == .decl_assign {
2245- c.allocate_var (ident.name, enum_info.size, val)
2246- } else {
2247- c.mov64 (Amd64 Register.rax, val)
2248- c.mov_reg_to_var (ident, Amd64 Register.rax)
2307+ match val {
2308+ Number {
2309+ if node.op == .decl_assign {
2310+ c.allocate_var (ident.name, enum_info.size, val)
2311+ } else {
2312+ c.mov64 (Amd64 Register.rax, val)
2313+ c.mov_reg_to_var (ident, Amd64 Register.rax)
2314+ }
2315+ }
2316+ ast.Expr {
2317+ c.g.expr (val)
2318+ c.mov_reg_to_var (ident, Amd64 Register.rax)
2319+ }
22492320 }
22502321 }
22512322 ast.FloatLiteral {
@@ -2777,14 +2848,35 @@ fn (mut c Amd64) assign_stmt(node ast.AssignStmt) {
27772848 c.pop (.rdx) // effective address of left expr
27782849 c.gen_type_promotion (node.right_types[0 ], var_type)
27792850
2851+ size := match c.g.get_type_size (var_type) {
2852+ 1 { Size._8 }
2853+ 2 { Size._16 }
2854+ 4 { Size._32 }
2855+ else { Size._64 }
2856+ }
27802857 match node.op {
27812858 .decl_assign, .assign {
2782- c.mov_store (.rdx, .rax, match c.g.get_type_size (var_type) {
2783- 1 { ._8 }
2784- 2 { ._16 }
2785- 4 { ._32 }
2786- else { ._64 }
2787- })
2859+ c.mov_store (.rdx, .rax, size)
2860+ }
2861+ .plus_assign {
2862+ c.mov_deref (Amd64 Register.rcx, Amd64 Register.rdx, var_type)
2863+ c.add_reg (.rax, .rcx)
2864+ c.mov_store (.rdx, .rax, size)
2865+ }
2866+ .minus_assign {
2867+ c.mov_deref (Amd64 Register.rcx, Amd64 Register.rdx, var_type)
2868+ c.sub_reg (.rax, .rcx)
2869+ c.mov_store (.rdx, .rax, size)
2870+ }
2871+ .and_assign {
2872+ c.mov_deref (Amd64 Register.rcx, Amd64 Register.rdx, var_type)
2873+ c.bitand_reg (.rax, .rcx)
2874+ c.mov_store (.rdx, .rax, size)
2875+ }
2876+ .mod_assign {
2877+ c.mov_deref (Amd64 Register.rcx, Amd64 Register.rdx, var_type)
2878+ c.mod_reg (.rax, .rcx)
2879+ c.mov_store (.rdx, .rax, size)
27882880 }
27892881 else {
27902882 c.g.n_error ('${@LOCATION } Unsupported assign instruction (${node .op })' )
@@ -3676,6 +3768,9 @@ fn (mut c Amd64) init_struct(var Var, init ast.StructInit) {
36763768 // TODO
36773769 // c.g.cmp()
36783770 }
3771+ ExternVar {
3772+ c.init_struct (var_object as ExternVar , init)
3773+ }
36793774 }
36803775 }
36813776 LocalVar {
@@ -3718,6 +3813,9 @@ fn (mut c Amd64) init_struct(var Var, init ast.StructInit) {
37183813 GlobalVar {
37193814 c.g.n_error ('${@LOCATION } GlobalVar not implemented for ast.StructInit' )
37203815 }
3816+ ExternVar {
3817+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
3818+ }
37213819 }
37223820}
37233821
@@ -3766,6 +3864,9 @@ fn (mut c Amd64) init_array(var Var, node ast.ArrayInit) {
37663864 // TODO
37673865 // c.g.cmp()
37683866 }
3867+ ExternVar {
3868+ c.init_array (var_object as ExternVar , node)
3869+ }
37693870 }
37703871 }
37713872 LocalVar {
@@ -3779,6 +3880,9 @@ fn (mut c Amd64) init_array(var Var, node ast.ArrayInit) {
37793880 GlobalVar {
37803881 c.g.n_error ('${@LOCATION } GlobalVar not implemented for ast.ArrayInit' )
37813882 }
3883+ ExternVar {
3884+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
3885+ }
37823886 }
37833887}
37843888
@@ -4075,6 +4179,9 @@ fn (mut c Amd64) mov_ssereg_to_var(var Var, reg Amd64SSERegister, config VarConf
40754179 c.mov_ssereg_to_var (var_object as GlobalVar , reg, config)
40764180 }
40774181 Register {}
4182+ ExternVar {
4183+ c.mov_ssereg_to_var (var_object as ExternVar , reg, config)
4184+ }
40784185 }
40794186 }
40804187 LocalVar {
@@ -4100,6 +4207,9 @@ fn (mut c Amd64) mov_ssereg_to_var(var Var, reg Amd64SSERegister, config VarConf
41004207 GlobalVar {
41014208 // TODO
41024209 }
4210+ ExternVar {
4211+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
4212+ }
41034213 }
41044214}
41054215
@@ -4119,6 +4229,9 @@ fn (mut c Amd64) mov_var_to_ssereg(reg Amd64SSERegister, var Var, config VarConf
41194229 c.mov_var_to_ssereg (reg, var_object as GlobalVar , config)
41204230 }
41214231 Register {}
4232+ ExternVar {
4233+ c.mov_var_to_ssereg (reg, var_object as ExternVar , config)
4234+ }
41224235 }
41234236 }
41244237 LocalVar {
@@ -4144,6 +4257,9 @@ fn (mut c Amd64) mov_var_to_ssereg(reg Amd64SSERegister, var Var, config VarConf
41444257 GlobalVar {
41454258 // TODO
41464259 }
4260+ ExternVar {
4261+ c.g.n_error ('${@LOCATION } unsupported var type ${var }' )
4262+ }
41474263 }
41484264}
41494265
0 commit comments