From 2159a731dd1262951c62165cb360d54f03e325a5 Mon Sep 17 00:00:00 2001 From: nub31 Date: Thu, 3 Jul 2025 00:49:16 +0200 Subject: [PATCH] ... --- example/src/main.nub | 13 +- src/compiler/CLI/assets/libruntime_x64.a | Bin 8044 -> 7550 bytes src/compiler/Generation/QBE/QBEGenerator.cs | 262 ++++++-------------- src/compiler/Syntax/Typing/NubType.cs | 82 ++---- src/runtime/targets/x64.s | 1 + 5 files changed, 119 insertions(+), 239 deletions(-) diff --git a/example/src/main.nub b/example/src/main.nub index 03b53d0..20a3676 100644 --- a/example/src/main.nub +++ b/example/src/main.nub @@ -8,7 +8,18 @@ struct Human export func main(args: []cstring): i64 { - c::puts("john") + let x: i64 + + x = 23 + + if (x == 23) + { + c::printf("true\n") + } + else + { + c::printf("false\n") + } return 0 } diff --git a/src/compiler/CLI/assets/libruntime_x64.a b/src/compiler/CLI/assets/libruntime_x64.a index dfd438dd9229c449d0cd4653cf98566d0d95aaff..d43a5680dbe79e118fb2c5f907a572b0754c015a 100644 GIT binary patch literal 7550 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 X)_6bKYac2h3<}YrDk@JMw+8+PkmNx} diff --git a/src/compiler/Generation/QBE/QBEGenerator.cs b/src/compiler/Generation/QBE/QBEGenerator.cs index ab2ccd0..b2bff8c 100644 --- a/src/compiler/Generation/QBE/QBEGenerator.cs +++ b/src/compiler/Generation/QBE/QBEGenerator.cs @@ -264,7 +264,7 @@ public static class QBEGenerator throw new ArgumentOutOfRangeException(nameof(type)); } } - + private static string EmitCopy(NubType type, string source) { var destination = VarName(); @@ -301,8 +301,7 @@ public static class QBEGenerator case NubPointerType: case NubPrimitiveType: { - _builder.AppendLine($" {destination} {QBEAssign(type)} {source}"); - break; + return source; } case NubVoidType: case NubFuncType: @@ -311,7 +310,7 @@ public static class QBEGenerator default: throw new ArgumentOutOfRangeException(nameof(type)); } - + return destination; } @@ -649,7 +648,7 @@ public static class QBEGenerator { var destination = EmitExpression(assignment.Expression); Debug.Assert(destination.Kind == ValKind.Pointer); - + var source = EmitUnwrap(EmitExpression(assignment.Value)); EmitCopyInto(assignment.Value.Type, source, destination.Name); } @@ -857,214 +856,117 @@ 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.Direct); - switch (binaryExpression.Operator) + var instruction = EmitBinaryInstructionFor(binaryExpression.Operator, binaryExpression.Left.Type, left, right); + + _builder.AppendLine($" {outputName} {QBEAssign(binaryExpression.Left.Type)} {instruction} {left}, {right}"); + return new Val(outputName, binaryExpression.Type, ValKind.Direct); + } + + private static string EmitBinaryInstructionFor(BinaryExpressionOperator op, NubType type, string left, string right) + { + if (op is + BinaryExpressionOperator.Equal or + BinaryExpressionOperator.NotEqual or + BinaryExpressionOperator.GreaterThan or + BinaryExpressionOperator.GreaterThanOrEqual or + BinaryExpressionOperator.LessThan or + BinaryExpressionOperator.LessThanOrEqual) { - case BinaryExpressionOperator.Equal: + char suffix; + + if (type.Is8BitInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) + if (type.IsSignedInteger) { - _builder.AppendLine($" {outputName} =w ceql {left}, {right}"); - return output; + _builder.AppendLine($" {left} =w extsb {left}"); + _builder.AppendLine($" {right} =w extsb {right}"); + } + else + { + _builder.AppendLine($" {left} =w extub {left}"); + _builder.AppendLine($" {right} =w extub {right}"); } - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w ceqw {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w ceqw {left}, {right}"); - return output; - } - - break; + suffix = 'w'; } - case BinaryExpressionOperator.NotEqual: + else if (type.Is16BitInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) + if (type.IsSignedInteger) { - _builder.AppendLine($" {outputName} =w cnel {left}, {right}"); - return output; + _builder.AppendLine($" {left} =w extsh {left}"); + _builder.AppendLine($" {right} =w extsh {right}"); + } + else + { + _builder.AppendLine($" {left} =w extuh {left}"); + _builder.AppendLine($" {right} =w extuh {right}"); } - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w cnew {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w cnew {left}, {right}"); - return output; - } - - break; + suffix = 'w'; } - case BinaryExpressionOperator.GreaterThan: + else if (type.Is32BitInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =w csgtl {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w csgtw {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w csgtw {left}, {right}"); - return output; - } - - break; + suffix = 'w'; } - case BinaryExpressionOperator.GreaterThanOrEqual: + else if (type.Is64BitInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =w csgel {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w csgew {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w csgew {left}, {right}"); - return output; - } - - break; + suffix = 'l'; } - case BinaryExpressionOperator.LessThan: + else { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =w csltl {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w csltw {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w csltw {left}, {right}"); - return output; - } - - break; + throw new NotSupportedException($"Unsupported type '{type}' for binary operator '{op}'"); } - case BinaryExpressionOperator.LessThanOrEqual: + + if (op is BinaryExpressionOperator.Equal) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =w cslel {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w cslew {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) - { - _builder.AppendLine($" {outputName} =w cslew {left}, {right}"); - return output; - } - - break; + return "ceq" + suffix; } - case BinaryExpressionOperator.Plus: + + if (op is BinaryExpressionOperator.NotEqual) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =l add {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w add {left}, {right}"); - return output; - } - - break; + return "cne" + suffix; } - case BinaryExpressionOperator.Minus: + + string sign; + + if (type.IsSignedInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =l sub {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w sub {left}, {right}"); - return output; - } - - break; + sign = "s"; } - case BinaryExpressionOperator.Multiply: + else if (type.IsUnsignedInteger) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =l mul {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w mul {left}, {right}"); - return output; - } - - break; + sign = "u"; } - case BinaryExpressionOperator.Divide: + else if (type.IsFloat) { - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I64)) - { - _builder.AppendLine($" {outputName} =l div {left}, {right}"); - return output; - } - - if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) - { - _builder.AppendLine($" {outputName} =w div {left}, {right}"); - return output; - } - - break; + sign = ""; } - default: + else { - throw new ArgumentOutOfRangeException(); + throw new NotSupportedException($"Unsupported type '{type}' for binary operator '{op}'"); } + + return op switch + { + BinaryExpressionOperator.GreaterThan => 'c' + sign + "gt" + suffix, + BinaryExpressionOperator.GreaterThanOrEqual => 'c' + sign + "ge" + suffix, + BinaryExpressionOperator.LessThan => 'c' + sign + "lt" + suffix, + BinaryExpressionOperator.LessThanOrEqual => 'c' + sign + "le" + suffix, + _ => throw new ArgumentOutOfRangeException(nameof(op), op, null) + }; } - throw new NotSupportedException($"Binary operator {binaryExpression.Operator} for types {binaryExpression.Left.Type} and {binaryExpression.Right.Type} not supported"); + return op switch + { + BinaryExpressionOperator.Plus => "add", + BinaryExpressionOperator.Minus => "sub", + BinaryExpressionOperator.Multiply => "mul", + BinaryExpressionOperator.Divide => "div", + _ => throw new ArgumentOutOfRangeException(nameof(op)) + }; } private static Val EmitIdentifier(BoundIdentifierNode identifier) diff --git a/src/compiler/Syntax/Typing/NubType.cs b/src/compiler/Syntax/Typing/NubType.cs index 48a5e9c..5cd508a 100644 --- a/src/compiler/Syntax/Typing/NubType.cs +++ b/src/compiler/Syntax/Typing/NubType.cs @@ -4,42 +4,25 @@ namespace Syntax.Typing; public abstract class NubType { - public abstract bool ValueIsPointer { get; } - - public bool IsInteger => this is NubPrimitiveType - { - Kind: PrimitiveTypeKind.I8 - or PrimitiveTypeKind.I16 - or PrimitiveTypeKind.I32 - or PrimitiveTypeKind.I64 - or PrimitiveTypeKind.U8 - or PrimitiveTypeKind.U16 - or PrimitiveTypeKind.U32 - or PrimitiveTypeKind.U64 - }; - - public bool IsFloat32 => this is NubPrimitiveType - { - Kind: PrimitiveTypeKind.F32 - }; - - public bool IsFloat64 => this is NubPrimitiveType - { - Kind: PrimitiveTypeKind.F64 - }; + public bool Is8BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I8 or PrimitiveTypeKind.U8 }; + public bool Is16BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I16 or PrimitiveTypeKind.U16 }; + public bool Is32BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I32 or PrimitiveTypeKind.U32 }; + public bool Is64BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I64 or PrimitiveTypeKind.U64 }; - public bool IsNumber => IsFloat32 || IsFloat64 || IsInteger; + public bool IsSignedInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I8 or PrimitiveTypeKind.I16 or PrimitiveTypeKind.I32 or PrimitiveTypeKind.I64 }; + public bool IsUnsignedInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.U8 or PrimitiveTypeKind.U16 or PrimitiveTypeKind.U32 or PrimitiveTypeKind.U64 }; + public bool IsInteger => IsSignedInteger || IsUnsignedInteger; + + public bool IsFloat32 => this is NubPrimitiveType { Kind: PrimitiveTypeKind.F32 }; + public bool IsFloat64 => this is NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }; + public bool IsFloat => IsFloat32 || IsFloat64; + + public bool IsNumber => IsFloat || IsInteger; public bool IsVoid => this is NubVoidType; - public bool IsString => this is NubStringType; - public bool IsCString => this is NubCStringType; - - public bool IsBool => this is NubPrimitiveType - { - Kind: PrimitiveTypeKind.Bool - }; + public bool IsBool => this is NubPrimitiveType { Kind: PrimitiveTypeKind.Bool }; public abstract override bool Equals(object? obj); public abstract override int GetHashCode(); @@ -48,8 +31,6 @@ public abstract class NubType public class NubCStringType : NubType { - public override bool ValueIsPointer => true; - public override bool Equals(object? obj) { return obj is NubCStringType; @@ -68,8 +49,6 @@ public class NubCStringType : NubType public class NubStringType : NubType { - public override bool ValueIsPointer => true; - public override bool Equals(object? obj) { return obj is NubStringType; @@ -88,8 +67,6 @@ public class NubStringType : NubType public class NubFuncType(NubType returnType, List parameters) : NubType { - public override bool ValueIsPointer => false; - public NubType ReturnType { get; } = returnType; public List Parameters { get; } = parameters; @@ -111,8 +88,6 @@ public class NubFuncType(NubType returnType, List parameters) : NubType public class NubStructType(string @namespace, string name) : NubType { - public override bool ValueIsPointer => true; - public string Namespace { get; } = @namespace; public string Name { get; } = name; @@ -134,10 +109,8 @@ public class NubStructType(string @namespace, string name) : NubType public class NubPointerType(NubType baseType) : NubType { - public override bool ValueIsPointer => false; - public NubType BaseType { get; } = baseType; - + public override bool Equals(object? obj) { return obj is NubPointerType other && BaseType.Equals(other.BaseType); @@ -156,8 +129,6 @@ public class NubPointerType(NubType baseType) : NubType public class NubArrayType(NubType elementType) : NubType { - public override bool ValueIsPointer => true; - public NubType ElementType { get; } = elementType; public override bool Equals(object? obj) @@ -166,6 +137,7 @@ public class NubArrayType(NubType elementType) : NubType { return ElementType.Equals(other.ElementType); } + return false; } @@ -182,10 +154,8 @@ public class NubArrayType(NubType elementType) : NubType public class NubAnyType : NubType { - public override bool ValueIsPointer => false; - public override string ToString() => "any"; - + public override bool Equals(object? obj) { return obj is NubAnyType; @@ -199,10 +169,8 @@ public class NubAnyType : NubType public class NubVoidType : NubType { - public override bool ValueIsPointer => false; - public override string ToString() => "void"; - + public override bool Equals(object? obj) { return obj is NubVoidType; @@ -216,23 +184,21 @@ public class NubVoidType : NubType public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType { - public override bool ValueIsPointer => false; - public PrimitiveTypeKind Kind { get; } = kind; public static NubPrimitiveType I64 => new(PrimitiveTypeKind.I64); public static NubPrimitiveType I32 => new(PrimitiveTypeKind.I32); public static NubPrimitiveType I16 => new(PrimitiveTypeKind.I16); public static NubPrimitiveType I8 => new(PrimitiveTypeKind.I8); - + public static NubPrimitiveType U64 => new(PrimitiveTypeKind.U64); public static NubPrimitiveType U32 => new(PrimitiveTypeKind.U32); public static NubPrimitiveType U16 => new(PrimitiveTypeKind.U16); public static NubPrimitiveType U8 => new(PrimitiveTypeKind.U8); - + public static NubPrimitiveType F64 => new(PrimitiveTypeKind.F64); public static NubPrimitiveType F32 => new(PrimitiveTypeKind.F32); - + public static NubPrimitiveType Bool => new(PrimitiveTypeKind.Bool); public static bool TryParse(string s, [NotNullWhen(true)] out PrimitiveTypeKind? kind) @@ -274,15 +240,15 @@ public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType PrimitiveTypeKind.I16 => "i16", PrimitiveTypeKind.I32 => "i32", PrimitiveTypeKind.I64 => "i64", - + PrimitiveTypeKind.U8 => "u8", PrimitiveTypeKind.U16 => "u16", PrimitiveTypeKind.U32 => "u32", PrimitiveTypeKind.U64 => "u64", - + PrimitiveTypeKind.F32 => "f32", PrimitiveTypeKind.F64 => "f64", - + PrimitiveTypeKind.Bool => "bool", _ => throw new ArgumentOutOfRangeException(nameof(kind), Kind, null) }; diff --git a/src/runtime/targets/x64.s b/src/runtime/targets/x64.s index 4e6cd53..f55a1d0 100644 --- a/src/runtime/targets/x64.s +++ b/src/runtime/targets/x64.s @@ -5,5 +5,6 @@ _start: mov rdi, rsp call main + mov rdi, rax mov rax, 60 syscall