...
This commit is contained in:
@@ -76,6 +76,16 @@ public static class QBEGenerator
|
||||
return _builder.ToString();
|
||||
}
|
||||
|
||||
private static string VarName()
|
||||
{
|
||||
return $"%v{++_variableIndex}";
|
||||
}
|
||||
|
||||
private static string LabelName()
|
||||
{
|
||||
return $"@l{++_labelIndex}";
|
||||
}
|
||||
|
||||
private static string FuncName(IFuncSignature func)
|
||||
{
|
||||
return func switch
|
||||
@@ -393,19 +403,19 @@ public static class QBEGenerator
|
||||
switch (primitiveType.Kind)
|
||||
{
|
||||
case PrimitiveTypeKind.I16:
|
||||
parameterName = GenVarName();
|
||||
parameterName = VarName();
|
||||
_builder.AppendLine($" {parameterName} =w extsh %{parameter.Name}");
|
||||
break;
|
||||
case PrimitiveTypeKind.I8:
|
||||
parameterName = GenVarName();
|
||||
parameterName = VarName();
|
||||
_builder.AppendLine($" {parameterName} =w extsb %{parameter.Name}");
|
||||
break;
|
||||
case PrimitiveTypeKind.U16:
|
||||
parameterName = GenVarName();
|
||||
parameterName = VarName();
|
||||
_builder.AppendLine($" {parameterName} =w extuh %{parameter.Name}");
|
||||
break;
|
||||
case PrimitiveTypeKind.U8:
|
||||
parameterName = GenVarName();
|
||||
parameterName = VarName();
|
||||
_builder.AppendLine($" {parameterName} =w extub %{parameter.Name}");
|
||||
break;
|
||||
}
|
||||
@@ -514,13 +524,13 @@ public static class QBEGenerator
|
||||
{
|
||||
case NubArrayType arrayType:
|
||||
{
|
||||
var startName = GenVarName();
|
||||
var startName = VarName();
|
||||
_builder.AppendLine($" {startName} =l add {array}, 8");
|
||||
|
||||
var adjustedIndex = GenVarName();
|
||||
var adjustedIndex = VarName();
|
||||
_builder.AppendLine($" {adjustedIndex} =l mul {index}, {SizeOf(arrayType.ElementType)}");
|
||||
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l add {startName}, {adjustedIndex}");
|
||||
|
||||
GenerateCopy(arrayType.ElementType, value, pointer);
|
||||
@@ -528,13 +538,13 @@ public static class QBEGenerator
|
||||
}
|
||||
case NubFixedArrayType fixedArrayType:
|
||||
{
|
||||
var startName = GenVarName();
|
||||
var startName = VarName();
|
||||
_builder.AppendLine($" {startName} =l add {array}, 8");
|
||||
|
||||
var adjustedIndex = GenVarName();
|
||||
var adjustedIndex = VarName();
|
||||
_builder.AppendLine($" {adjustedIndex} =l mul {index}, {SizeOf(fixedArrayType.ElementType)}");
|
||||
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l add {startName}, {adjustedIndex}");
|
||||
|
||||
GenerateCopy(fixedArrayType.ElementType, value, pointer);
|
||||
@@ -593,9 +603,9 @@ public static class QBEGenerator
|
||||
|
||||
private static void GenerateIf(IfNode ifStatement)
|
||||
{
|
||||
var trueLabel = GenLabelName();
|
||||
var falseLabel = GenLabelName();
|
||||
var endLabel = GenLabelName();
|
||||
var trueLabel = LabelName();
|
||||
var falseLabel = LabelName();
|
||||
var endLabel = LabelName();
|
||||
|
||||
var result = GenerateExpression(ifStatement.Condition);
|
||||
_builder.AppendLine($" jnz {result}, {trueLabel}, {falseLabel}");
|
||||
@@ -624,7 +634,7 @@ public static class QBEGenerator
|
||||
var offset = LookupMemberOffset(structDefinition, memberAssignment.MemberAccess.Member);
|
||||
|
||||
var item = GenerateExpression(memberAssignment.MemberAccess.Expression);
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
|
||||
_builder.AppendLine($" {pointer} =l add {item}, {offset}");
|
||||
|
||||
@@ -649,7 +659,7 @@ public static class QBEGenerator
|
||||
private static void GenerateVariableDeclaration(VariableDeclarationNode variableDeclaration)
|
||||
{
|
||||
var type = variableDeclaration.ExplicitType.Value ?? variableDeclaration.Value.Value!.Type;
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l alloc8 {SizeOf(type)}");
|
||||
|
||||
if (variableDeclaration.Value.HasValue)
|
||||
@@ -659,7 +669,7 @@ public static class QBEGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
var pointerName = GenVarName();
|
||||
var pointerName = VarName();
|
||||
_variables.Push((variableDeclaration.Name, pointerName));
|
||||
}
|
||||
|
||||
@@ -675,9 +685,9 @@ public static class QBEGenerator
|
||||
|
||||
private static void GenerateWhile(WhileNode whileStatement)
|
||||
{
|
||||
var conditionLabel = GenLabelName();
|
||||
var iterationLabel = GenLabelName();
|
||||
var endLabel = GenLabelName();
|
||||
var conditionLabel = LabelName();
|
||||
var iterationLabel = LabelName();
|
||||
var endLabel = LabelName();
|
||||
|
||||
_breakLabels.Push(endLabel);
|
||||
_continueLabels.Push(conditionLabel);
|
||||
@@ -719,7 +729,7 @@ public static class QBEGenerator
|
||||
{
|
||||
var name = $"$anon_func{++_anonymousFuncIndex}";
|
||||
_anonymousFunctions.Enqueue((anonymousFunc, name));
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l alloc8 8");
|
||||
_builder.AppendLine($" storel {name}, {pointer}");
|
||||
return pointer;
|
||||
@@ -735,21 +745,21 @@ public static class QBEGenerator
|
||||
{
|
||||
case NubArrayType arrayType:
|
||||
{
|
||||
var firstItemPointerName = GenVarName();
|
||||
var firstItemPointerName = VarName();
|
||||
_builder.AppendLine($" {firstItemPointerName} =l add {array}, 8");
|
||||
var offsetPointerName = GenVarName();
|
||||
var offsetPointerName = VarName();
|
||||
_builder.AppendLine($" {offsetPointerName} =l mul {index}, {SizeOf(arrayType.ElementType)}");
|
||||
var resultPointerName = GenVarName();
|
||||
var resultPointerName = VarName();
|
||||
_builder.AppendLine($" {resultPointerName} =l add {firstItemPointerName}, {offsetPointerName}");
|
||||
return resultPointerName;
|
||||
}
|
||||
case NubFixedArrayType fixedArrayType:
|
||||
{
|
||||
var firstItemPointerName = GenVarName();
|
||||
var firstItemPointerName = VarName();
|
||||
_builder.AppendLine($" {firstItemPointerName} =l add {array}, 8");
|
||||
var offsetPointerName = GenVarName();
|
||||
var offsetPointerName = VarName();
|
||||
_builder.AppendLine($" {offsetPointerName} =l mul {index}, {SizeOf(fixedArrayType.ElementType)}");
|
||||
var resultPointerName = GenVarName();
|
||||
var resultPointerName = VarName();
|
||||
_builder.AppendLine($" {resultPointerName} =l add {firstItemPointerName}, {offsetPointerName}");
|
||||
return resultPointerName;
|
||||
}
|
||||
@@ -770,7 +780,7 @@ public static class QBEGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} {QBEAssign(arrayIndexAccess.Type)} {QBELoad(arrayIndexAccess.Type)} {pointerName}");
|
||||
return outputName;
|
||||
}
|
||||
@@ -778,20 +788,20 @@ public static class QBEGenerator
|
||||
|
||||
private static void GenerateArrayBoundsCheck(string array, string index)
|
||||
{
|
||||
var countName = GenVarName();
|
||||
var countName = VarName();
|
||||
_builder.AppendLine($" {countName} =l loadl {array}");
|
||||
|
||||
var isNegativeName = GenVarName();
|
||||
var isNegativeName = VarName();
|
||||
_builder.AppendLine($" {isNegativeName} =w csltl {index}, 0");
|
||||
|
||||
var isOobName = GenVarName();
|
||||
var isOobName = VarName();
|
||||
_builder.AppendLine($" {isOobName} =w csgel {index}, {countName}");
|
||||
|
||||
var anyOobName = GenVarName();
|
||||
var anyOobName = VarName();
|
||||
_builder.AppendLine($" {anyOobName} =w or {isNegativeName}, {isOobName}");
|
||||
|
||||
var oobLabel = GenLabelName();
|
||||
var notOobLabel = GenLabelName();
|
||||
var oobLabel = LabelName();
|
||||
var notOobLabel = LabelName();
|
||||
_builder.AppendLine($" jnz {anyOobName}, {oobLabel}, {notOobLabel}");
|
||||
|
||||
_builder.AppendLine(oobLabel);
|
||||
@@ -804,15 +814,15 @@ public static class QBEGenerator
|
||||
{
|
||||
var capacity = GenerateExpression(arrayInitializer.Capacity);
|
||||
var elementSize = SizeOf(arrayInitializer.ElementType);
|
||||
var capacityInBytes = GenVarName();
|
||||
var capacityInBytes = VarName();
|
||||
_builder.AppendLine($" {capacityInBytes} =l mul {capacity}, {elementSize}");
|
||||
var totalArraySize = GenVarName();
|
||||
var totalArraySize = VarName();
|
||||
_builder.AppendLine($" {totalArraySize} =l add {capacityInBytes}, 8");
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} =l alloc8 {totalArraySize}");
|
||||
_builder.AppendLine($" storel {capacity}, {outputName}");
|
||||
|
||||
var dataPtr = GenVarName();
|
||||
var dataPtr = VarName();
|
||||
_builder.AppendLine($" {dataPtr} =l add {outputName}, 8");
|
||||
_builder.AppendLine($" call $nub_memset(l {dataPtr}, w 0, l {capacityInBytes})");
|
||||
|
||||
@@ -822,7 +832,7 @@ public static class QBEGenerator
|
||||
private static string GenerateDereference(DereferenceNode dereference)
|
||||
{
|
||||
var result = GenerateExpression(dereference.Expression);
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} {QBEAssign(dereference.Type)} {QBELoad(dereference.Type)} {result}");
|
||||
return outputName;
|
||||
}
|
||||
@@ -852,7 +862,7 @@ public static class QBEGenerator
|
||||
{
|
||||
var left = GenerateExpression(binaryExpression.Left);
|
||||
var right = GenerateExpression(binaryExpression.Right);
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
|
||||
switch (binaryExpression.Operator)
|
||||
{
|
||||
@@ -1078,7 +1088,7 @@ public static class QBEGenerator
|
||||
{
|
||||
if (_definitionTable.LookupFunc(identifier.Namespace.Or(_compilationUnit.Namespace), identifier.Name).TryGetValue(out var func))
|
||||
{
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l alloc8 8");
|
||||
_builder.AppendLine($" storel {FuncName(func)}, {pointer}");
|
||||
return pointer;
|
||||
@@ -1139,7 +1149,7 @@ public static class QBEGenerator
|
||||
{
|
||||
var structDefinition = _definitionTable.LookupStruct(structInitializer.StructType.Namespace, structInitializer.StructType.Name).GetValue();
|
||||
|
||||
var structVar = GenVarName();
|
||||
var structVar = VarName();
|
||||
var size = SizeOf(structInitializer.StructType);
|
||||
_builder.AppendLine($" {structVar} =l alloc8 {size}");
|
||||
|
||||
@@ -1150,14 +1160,14 @@ public static class QBEGenerator
|
||||
if (structInitializer.Initializers.TryGetValue(field.Name, out var fieldValue))
|
||||
{
|
||||
var value = GenerateExpression(fieldValue);
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l add {structVar}, {offset}");
|
||||
GenerateCopy(field.Type, value, pointer);
|
||||
}
|
||||
else if (field.Value.HasValue)
|
||||
{
|
||||
var value = GenerateExpression(field.Value.Value);
|
||||
var pointer = GenVarName();
|
||||
var pointer = VarName();
|
||||
_builder.AppendLine($" {pointer} =l add {structVar}, {offset}");
|
||||
GenerateCopy(field.Type, value, pointer);
|
||||
}
|
||||
@@ -1173,7 +1183,7 @@ public static class QBEGenerator
|
||||
private static string GenerateUnaryExpression(UnaryExpressionNode unaryExpression)
|
||||
{
|
||||
var operand = GenerateExpression(unaryExpression.Operand);
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
|
||||
switch (unaryExpression.Operator)
|
||||
{
|
||||
@@ -1236,7 +1246,7 @@ public static class QBEGenerator
|
||||
var structDefinition = _definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue();
|
||||
var offset = LookupMemberOffset(structDefinition, memberAccess.Member);
|
||||
|
||||
var offsetName = GenVarName();
|
||||
var offsetName = VarName();
|
||||
_builder.AppendLine($" {offsetName} =l add {item}, {offset}");
|
||||
return offsetName;
|
||||
}
|
||||
@@ -1257,7 +1267,7 @@ public static class QBEGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} {QBEAssign(memberAccess.Type)} {QBELoad(memberAccess.Type)} {pointer}");
|
||||
return outputName;
|
||||
}
|
||||
@@ -1266,12 +1276,12 @@ public static class QBEGenerator
|
||||
private static string GenerateFixedArrayInitializer(FixedArrayInitializerNode fixedArrayInitializer)
|
||||
{
|
||||
var totalSize = SizeOf(fixedArrayInitializer.Type);
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} =l alloc8 {totalSize}");
|
||||
|
||||
_builder.AppendLine($" storel {fixedArrayInitializer.Capacity}, {outputName}");
|
||||
|
||||
var dataPtr = GenVarName();
|
||||
var dataPtr = VarName();
|
||||
_builder.AppendLine($" {dataPtr} =l add {outputName}, 8");
|
||||
|
||||
var dataSize = totalSize - 8;
|
||||
@@ -1326,14 +1336,14 @@ public static class QBEGenerator
|
||||
else
|
||||
{
|
||||
var funcPointerPointer = GenerateExpression(funcCall.Expression);
|
||||
var funcPointer = GenVarName();
|
||||
var funcPointer = VarName();
|
||||
_builder.AppendLine($" {funcPointer} =l loadl {funcPointerPointer}");
|
||||
funcTarget = funcPointer;
|
||||
}
|
||||
|
||||
if (funcType.ReturnType is not NubVoidType)
|
||||
{
|
||||
var outputName = GenVarName();
|
||||
var outputName = VarName();
|
||||
_builder.AppendLine($" {outputName} {QBEAssign(funcCall.Type)} call {funcTarget}({string.Join(", ", parameterStrings)})");
|
||||
return outputName;
|
||||
}
|
||||
@@ -1364,22 +1374,12 @@ public static class QBEGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
var result = GenVarName();
|
||||
var result = VarName();
|
||||
_builder.AppendLine($" {result} {QBEAssign(type)} {QBELoad(type)} {pointer}");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GenVarName()
|
||||
{
|
||||
return $"%v{++_variableIndex}";
|
||||
}
|
||||
|
||||
private static string GenLabelName()
|
||||
{
|
||||
return $"@l{++_labelIndex}";
|
||||
}
|
||||
|
||||
private static int LookupMemberOffset(StructDefinitionNode structDefinition, string member)
|
||||
{
|
||||
var offset = 0;
|
||||
|
||||
Reference in New Issue
Block a user