From c4c533ffbd3ae5daf8a901ec9c9410df86fd8e3c Mon Sep 17 00:00:00 2001 From: nub31 Date: Mon, 8 Sep 2025 20:46:50 +0200 Subject: [PATCH] Simplify variables --- example/src/main.nub | 7 +++++ .../NubLang/Generation/QBE/QBEGenerator.cs | 28 +++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/example/src/main.nub b/example/src/main.nub index 1cb3710..0e933a0 100644 --- a/example/src/main.nub +++ b/example/src/main.nub @@ -4,6 +4,7 @@ extern func puts(text: cstring) interface Printable { func print() + func test() } struct Human : Printable @@ -15,6 +16,11 @@ struct Human : Printable { puts(this.name) } + + func test() + { + puts("test") + } } func main(args: []cstring): i64 @@ -25,6 +31,7 @@ func main(args: []cstring): i64 } x.print() + x.test() return 0 } diff --git a/src/compiler/NubLang/Generation/QBE/QBEGenerator.cs b/src/compiler/NubLang/Generation/QBE/QBEGenerator.cs index ca3fa99..9541faf 100644 --- a/src/compiler/NubLang/Generation/QBE/QBEGenerator.cs +++ b/src/compiler/NubLang/Generation/QBE/QBEGenerator.cs @@ -559,12 +559,11 @@ public class QBEGenerator private void EmitVariableDeclaration(VariableDeclarationNode variableDeclaration) { var name = $"%{variableDeclaration.Name}"; - _writer.Indented($"{name} =l alloc8 8"); + _writer.Indented($"{name} =l alloc8 {SizeOf(variableDeclaration.Type)}"); if (variableDeclaration.Assignment.HasValue) { - var value = EmitCreateCopyOrInitialize(variableDeclaration.Assignment.Value); - EmitStore(variableDeclaration.Assignment.Value.Type, value, name); + EmitCopyIntoOrInitialize(variableDeclaration.Assignment.Value, name); } } @@ -697,11 +696,11 @@ public class QBEGenerator var elementType = ((ArrayTypeNode)arrayIndexAccess.Target.Type).ElementType; - var address = TmpName(); - _writer.Indented($"{address} =l mul {index}, {SizeOf(elementType)}"); - _writer.Indented($"{address} =l add {address}, 8"); - _writer.Indented($"{address} =l add {array}, {address}"); - return address; + var offset = TmpName(); + _writer.Indented($"{offset} =l mul {index}, {SizeOf(elementType)}"); + _writer.Indented($"{offset} =l add {offset}, 8"); + _writer.Indented($"{offset} =l add {array}, {offset}"); + return offset; } private string EmitAddressOfStructFieldAccess(StructFieldAccessNode structFieldAccess) @@ -840,7 +839,11 @@ public class QBEGenerator private string EmitVariableIdent(VariableIdentNode variableIdent) { - return EmitLoad(variableIdent.Type, EmitAddressOfVariableIdent(variableIdent)); + var address = EmitAddressOfVariableIdent(variableIdent); + + return variableIdent.Type.IsSimpleType(out _, out _) + ? EmitLoad(variableIdent.Type, address) + : address; } private string EmitFuncParameterIdent(FuncParameterIdentNode funcParameterIdent) @@ -1058,10 +1061,11 @@ public class QBEGenerator var func = TmpName(); _writer.Indented($"{func} =l loadl {funcOffset}"); - _writer.Indented($"{target} =l add {target}, 8"); - _writer.Indented($"{target} =l loadl {target}"); + var data = TmpName(); + _writer.Indented($"{data} =l add {target}, 8"); + _writer.Indented($"{data} =l loadl {data}"); - List parameterStrings = [$"l {target}"]; + List parameterStrings = [$"l {data}"]; foreach (var parameter in interfaceFuncCall.Parameters) {