diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-29 22:03:17 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-29 22:03:17 +0330 |
commit | 3a4fa4b89280046885dc044ce4f9761f5eeaa9e1 (patch) | |
tree | 4fe36236a33349c034e44f455c1dca90703c5842 /src/runner | |
parent | e6e44774556bf6172c1577268cf9f013a4157ae2 (diff) |
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 640 |
1 files changed, 638 insertions, 2 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index dc3e655..81e4f83 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -3,6 +3,7 @@ #include "utils/log.h" #include "utils/memory.h" #include "utils/string.h" +#include <math.h> #include <stdatomic.h> #include <stdio.h> @@ -381,10 +382,621 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, ret = copyAstTree(variable->type); } goto RETURN; + case AST_TREE_TOKEN_BUILTIN_NEG: { + AstTree *value = args.data[0]; + bool shouldRet = false; + ret = runExpression(value, scope, &shouldRet, false, isComptime); + switch (value->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = -*(i8 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = -*(u8 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = -*(i16 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = -*(u16 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = -*(i32 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = -*(u32 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = -*(i64 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = -*(u64 *)ret->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = -*(f16 *)ret->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = -*(f32 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = -*(f64 *)ret->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = -*(f128 *)ret->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_ADD: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata + *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata + *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata + *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata + *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata + *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata + *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata + *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata + *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata + *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata + *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata + *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata + *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_SUB: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata - *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata - *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata - *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata - *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata - *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata - *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata - *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata - *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata - *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata - *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata - *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata - *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_MUL: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata * *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata * *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata * *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata * *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata * *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata * *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata * *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata * *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata * *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata * *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata * *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata * *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_DIV: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata / *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata / *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata / *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata / *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata / *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata / *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata / *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata / *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata / *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata / *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata / *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata / *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_MOD: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata % *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata % *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata % *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata % *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata % *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata % *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata % *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata % *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = + fmodf(*(f16 *)ret->metadata, *(f16 *)right->metadata); + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = + fmodf(*(f32 *)ret->metadata, *(f32 *)right->metadata); + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = + fmod(*(f64 *)ret->metadata, *(f64 *)right->metadata); + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + fmodl(*(f128 *)ret->metadata, *(f128 *)right->metadata); + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_EQUAL: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata == *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata == *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata == *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata == *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata == *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata == *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata == *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata == *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata == *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata == *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata == *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata == *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_NOT_EQUAL: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata != *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata != *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata != *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata != *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata != *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata != *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata != *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata != *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata != *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata != *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata != *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata != *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_GREATER: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata > *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata > *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata > *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata > *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata > *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata > *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata > *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata > *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata > *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata > *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata > *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata > *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_SMALLER: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata < *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata < *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata < *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata < *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata < *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata < *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata < *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata < *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata < *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata < *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata < *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata < *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_GREATER_OR_EQUAL: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata >= *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata >= *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata >= *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata >= *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata >= *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata >= *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata >= *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata >= *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata >= *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata >= *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata >= *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata >= *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; + case AST_TREE_TOKEN_BUILTIN_SMALLER_OR_EQUAL: { + bool shouldRet = false; + ret = runExpression(args.data[0], scope, &shouldRet, false, isComptime); + AstTree *right = + runExpression(args.data[1], scope, &shouldRet, false, isComptime); + + switch (ret->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret->metadata = *(i8 *)ret->metadata <= *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret->metadata = *(u8 *)ret->metadata <= *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret->metadata = *(i16 *)ret->metadata <= *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret->metadata = *(u16 *)ret->metadata <= *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret->metadata = *(i32 *)ret->metadata <= *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret->metadata = *(u32 *)ret->metadata <= *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret->metadata = *(i64 *)ret->metadata <= *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret->metadata = *(u64 *)ret->metadata <= *(u64 *)right->metadata; + break; +#ifdef FLOAT_16_SUPPORT + case AST_TREE_TOKEN_TYPE_F16: + *(f16 *)ret->metadata = *(f16 *)ret->metadata <= *(f16 *)right->metadata; + break; +#endif + case AST_TREE_TOKEN_TYPE_F32: + *(f32 *)ret->metadata = *(f32 *)ret->metadata <= *(f32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F64: + *(f64 *)ret->metadata = *(f64 *)ret->metadata <= *(f64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_F128: + *(f128 *)ret->metadata = + *(f128 *)ret->metadata <= *(f128 *)right->metadata; + break; + default: + UNREACHABLE; + } + } + goto RETURN; case AST_TREE_TOKEN_BUILTIN_IMPORT: default: } - printLog("Bad builtin"); UNREACHABLE; RETURN: @@ -417,7 +1029,19 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, metadata->parameters_size, isComptime); } else if (function->token == AST_TREE_TOKEN_BUILTIN_CAST || function->token == AST_TREE_TOKEN_BUILTIN_TYPE_OF || - function->token == AST_TREE_TOKEN_BUILTIN_IMPORT) { + function->token == AST_TREE_TOKEN_BUILTIN_IMPORT || + function->token == AST_TREE_TOKEN_BUILTIN_NEG || + function->token == AST_TREE_TOKEN_BUILTIN_ADD || + function->token == AST_TREE_TOKEN_BUILTIN_SUB || + function->token == AST_TREE_TOKEN_BUILTIN_MUL || + function->token == AST_TREE_TOKEN_BUILTIN_DIV || + function->token == AST_TREE_TOKEN_BUILTIN_MOD || + function->token == AST_TREE_TOKEN_BUILTIN_EQUAL || + function->token == AST_TREE_TOKEN_BUILTIN_NOT_EQUAL || + function->token == AST_TREE_TOKEN_BUILTIN_GREATER || + function->token == AST_TREE_TOKEN_BUILTIN_SMALLER || + function->token == AST_TREE_TOKEN_BUILTIN_GREATER_OR_EQUAL || + function->token == AST_TREE_TOKEN_BUILTIN_SMALLER_OR_EQUAL) { result = runAstTreeBuiltin(function, scope, metadata->parameters, metadata->parameters_size, isComptime); } else { @@ -590,6 +1214,18 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, case AST_TREE_TOKEN_BUILTIN_IMPORT: case AST_TREE_TOKEN_BUILTIN_STACK_ALLOC: case AST_TREE_TOKEN_BUILTIN_HEAP_ALLOC: + case AST_TREE_TOKEN_BUILTIN_NEG: + case AST_TREE_TOKEN_BUILTIN_ADD: + case AST_TREE_TOKEN_BUILTIN_SUB: + case AST_TREE_TOKEN_BUILTIN_MUL: + case AST_TREE_TOKEN_BUILTIN_DIV: + case AST_TREE_TOKEN_BUILTIN_MOD: + case AST_TREE_TOKEN_BUILTIN_EQUAL: + case AST_TREE_TOKEN_BUILTIN_NOT_EQUAL: + case AST_TREE_TOKEN_BUILTIN_GREATER: + case AST_TREE_TOKEN_BUILTIN_SMALLER: + case AST_TREE_TOKEN_BUILTIN_GREATER_OR_EQUAL: + case AST_TREE_TOKEN_BUILTIN_SMALLER_OR_EQUAL: return copyAstTree(expr); case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME: { AstTreeBool *metadata = a404m_malloc(sizeof(*metadata)); |