This commit is contained in:
nub31
2025-07-02 19:02:33 +02:00
parent a29cb6d9db
commit 2b331e432a

View File

@@ -421,7 +421,7 @@ public static class QBEGenerator
}
}
parameterVars.Add(new Variable(parameter.Name, new Val(parameterName, parameter.Type, ValKind.Immediate)));
parameterVars.Add(new Variable(parameter.Name, new Val(parameterName, parameter.Type, ValKind.Value)));
}
EmitBlock(body, parameterVars);
@@ -509,11 +509,7 @@ public static class QBEGenerator
private static void EmitAssignment(BoundAssignmentNode assignment)
{
var expression = EmitExpression(assignment.Expression);
if (expression.Kind != ValKind.Pointer)
{
throw new UnreachableException();
}
Debug.Assert(expression.Kind == ValKind.LValue);
var value = EmitUnwrap(EmitExpression(assignment.Value));
EmitCopy(assignment.Value.Type, value, expression.Name);
}
@@ -596,7 +592,7 @@ public static class QBEGenerator
{
var tmp = VarName();
_builder.AppendLine($" {tmp} =l alloc8 {SizeOf(variableDeclaration.Type)}");
_variables.Push(new Variable(variableDeclaration.Name, new Val(tmp, variableDeclaration.Type, ValKind.Pointer)));
_variables.Push(new Variable(variableDeclaration.Name, new Val(tmp, variableDeclaration.Type, ValKind.LValue)));
}
private static void EmitWhile(BoundWhileNode whileStatement)
@@ -658,7 +654,7 @@ public static class QBEGenerator
_builder.AppendLine($" {pointer} =l mul {index}, {SizeOf(elementType)}");
_builder.AppendLine($" {pointer} =l add {pointer}, 8");
_builder.AppendLine($" {pointer} =l add {array}, {pointer}");
return new Val(pointer, arrayIndexAccess.Type, ValKind.Pointer);
return new Val(pointer, arrayIndexAccess.Type, ValKind.LValue);
}
private static void EmitArrayBoundsCheck(string array, string index)
@@ -703,7 +699,7 @@ public static class QBEGenerator
_builder.AppendLine($" {dataPointer} =l add {arrayPointer}, 8");
_builder.AppendLine($" call $nub_memset(l {dataPointer}, w 0, l {capacityInBytes})");
return new Val(arrayPointer, arrayInitializer.Type, ValKind.Immediate);
return new Val(arrayPointer, arrayInitializer.Type, ValKind.Value);
}
private static Val EmitDereference(BoundDereferenceNode dereference)
@@ -711,17 +707,13 @@ public static class QBEGenerator
var result = EmitUnwrap(EmitExpression(dereference.Expression));
var outputName = VarName();
_builder.AppendLine($" {outputName} {QBEAssign(dereference.Type)} {QBELoad(dereference.Type)} {result}");
return new Val(outputName, dereference.Type, ValKind.Immediate);
return new Val(outputName, dereference.Type, ValKind.Value);
}
private static Val EmitAddressOf(BoundAddressOfNode addressOf)
{
var value = EmitExpression(addressOf.Expression);
if (value.Kind != ValKind.Pointer)
{
throw new UnreachableException();
}
Debug.Assert(value.Kind == ValKind.LValue);
return value;
}
@@ -730,7 +722,7 @@ public static class QBEGenerator
var left = EmitUnwrap(EmitExpression(binaryExpression.Left));
var right = EmitUnwrap(EmitExpression(binaryExpression.Right));
var outputName = VarName();
var output = new Val(outputName, binaryExpression.Type, ValKind.Immediate);
var output = new Val(outputName, binaryExpression.Type, ValKind.Value);
switch (binaryExpression.Operator)
{
@@ -964,19 +956,19 @@ public static class QBEGenerator
{
var value = float.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.SingleToInt32Bits(value);
return new Val(bits.ToString(), literal.Type, ValKind.Immediate);
return new Val(bits.ToString(), literal.Type, ValKind.Value);
}
if (literal.Type.IsFloat64)
{
var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.DoubleToInt64Bits(value);
return new Val(bits.ToString(), literal.Type, ValKind.Immediate);
return new Val(bits.ToString(), literal.Type, ValKind.Value);
}
if (literal.Type.IsInteger)
{
return new Val(literal.Literal, literal.Type, ValKind.Immediate);
return new Val(literal.Literal, literal.Type, ValKind.Value);
}
break;
@@ -985,21 +977,21 @@ public static class QBEGenerator
{
if (literal.Type.IsInteger)
{
return new Val(literal.Literal.Split(".").First(), literal.Type, ValKind.Immediate);
return new Val(literal.Literal.Split(".").First(), literal.Type, ValKind.Value);
}
if (literal.Type.IsFloat32)
{
var value = float.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.SingleToInt32Bits(value);
return new Val(bits.ToString(), literal.Type, ValKind.Immediate);
return new Val(bits.ToString(), literal.Type, ValKind.Value);
}
if (literal.Type.IsFloat64)
{
var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.DoubleToInt64Bits(value);
return new Val(bits.ToString(), literal.Type, ValKind.Immediate);
return new Val(bits.ToString(), literal.Type, ValKind.Value);
}
break;
@@ -1010,14 +1002,14 @@ public static class QBEGenerator
{
var stringLiteral = new StringLiteral(literal.Literal, StringName());
_stringLiterals.Add(stringLiteral);
return new Val(stringLiteral.Name, literal.Type, ValKind.Immediate);
return new Val(stringLiteral.Name, literal.Type, ValKind.Value);
}
if (literal.Type.IsCString)
{
var cStringLiteral = new CStringLiteral(literal.Literal, CStringName());
_cStringLiterals.Add(cStringLiteral);
return new Val(cStringLiteral.Name, literal.Type, ValKind.Immediate);
return new Val(cStringLiteral.Name, literal.Type, ValKind.Value);
}
break;
@@ -1026,7 +1018,7 @@ public static class QBEGenerator
{
if (literal.Type.IsBool)
{
return new Val(bool.Parse(literal.Literal) ? "1" : "0", literal.Type, ValKind.Immediate);
return new Val(bool.Parse(literal.Literal) ? "1" : "0", literal.Type, ValKind.Value);
}
break;
@@ -1068,7 +1060,7 @@ public static class QBEGenerator
}
}
return new Val(output, structInitializer.StructType, ValKind.Immediate);
return new Val(output, structInitializer.StructType, ValKind.Value);
}
private static Val EmitUnaryExpression(BoundUnaryExpressionNode unaryExpression)
@@ -1084,16 +1076,16 @@ public static class QBEGenerator
{
case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }:
_builder.AppendLine($" {outputName} =l neg {operand}");
return new Val(outputName, unaryExpression.Type, ValKind.Immediate);
return new Val(outputName, unaryExpression.Type, ValKind.Value);
case NubPrimitiveType { Kind: PrimitiveTypeKind.I32 or PrimitiveTypeKind.I16 or PrimitiveTypeKind.I8 }:
_builder.AppendLine($" {outputName} =w neg {operand}");
return new Val(outputName, unaryExpression.Type, ValKind.Immediate);
return new Val(outputName, unaryExpression.Type, ValKind.Value);
case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }:
_builder.AppendLine($" {outputName} =d neg {operand}");
return new Val(outputName, unaryExpression.Type, ValKind.Immediate);
return new Val(outputName, unaryExpression.Type, ValKind.Value);
case NubPrimitiveType { Kind: PrimitiveTypeKind.F32 }:
_builder.AppendLine($" {outputName} =s neg {operand}");
return new Val(outputName, unaryExpression.Type, ValKind.Immediate);
return new Val(outputName, unaryExpression.Type, ValKind.Value);
}
break;
@@ -1104,7 +1096,7 @@ public static class QBEGenerator
{
case NubPrimitiveType { Kind: PrimitiveTypeKind.Bool }:
_builder.AppendLine($" {outputName} =w xor {operand}, 1");
return new Val(outputName, unaryExpression.Type, ValKind.Immediate);
return new Val(outputName, unaryExpression.Type, ValKind.Value);
}
break;
@@ -1130,7 +1122,7 @@ public static class QBEGenerator
if (memberAccess.Member == "count")
{
_builder.AppendLine($" {output} =l loadl {item}");
return new Val(output, memberAccess.Type, ValKind.Immediate);
return new Val(output, memberAccess.Type, ValKind.Value);
}
break;
@@ -1140,7 +1132,7 @@ public static class QBEGenerator
if (memberAccess.Member == "count")
{
_builder.AppendLine($" {output} =l call $nub_string_length(l {item})");
return new Val(output, memberAccess.Type, ValKind.Immediate);
return new Val(output, memberAccess.Type, ValKind.Value);
}
break;
}
@@ -1149,7 +1141,7 @@ public static class QBEGenerator
if (memberAccess.Member == "count")
{
_builder.AppendLine($" {output} =l call $nub_cstring_length(l {item})");
return new Val(output, memberAccess.Type, ValKind.Immediate);
return new Val(output, memberAccess.Type, ValKind.Value);
}
break;
}
@@ -1159,7 +1151,7 @@ public static class QBEGenerator
var offset = OffsetOf(structDefinition, memberAccess.Member);
_builder.AppendLine($" {output} =l add {item}, {offset}");
return new Val(output, memberAccess.Type, ValKind.Pointer);
return new Val(output, memberAccess.Type, ValKind.LValue);
}
}
@@ -1211,12 +1203,12 @@ public static class QBEGenerator
{
var outputName = VarName();
_builder.AppendLine($" {outputName} {QBEAssign(funcCall.Type)} call {funcPointer}({string.Join(", ", parameterStrings)})");
return new Val(outputName, funcCall.Type, ValKind.Immediate);
return new Val(outputName, funcCall.Type, ValKind.Value);
}
else
{
_builder.AppendLine($" call {funcPointer}({string.Join(", ", parameterStrings)})");
return new Val(string.Empty, funcCall.Type, ValKind.Immediate);
return new Val(string.Empty, funcCall.Type, ValKind.Value);
}
}
@@ -1242,11 +1234,11 @@ public static class QBEGenerator
switch (val.Kind)
{
case ValKind.Func:
case ValKind.Immediate:
case ValKind.Value:
{
return val.Name;
}
case ValKind.Pointer:
case ValKind.LValue:
{
if (val.Type is NubStructType)
{
@@ -1298,6 +1290,6 @@ internal class Val(string name, NubType type, ValKind kind)
internal enum ValKind
{
Func,
Pointer,
Immediate
LValue,
Value
}