diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-26 01:24:56 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-26 01:24:56 +0330 |
commit | afa78451df1e9fb2810d4ae8cb697b1b2071ff9c (patch) | |
tree | 9b0ad12b58522cc0f99832253b1948fdebc1158c /src/runner/runner.c | |
parent | e55d45bac0bbd3039118bffa7e6aaf01c04b991a (diff) |
add shift
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r-- | src/runner/runner.c | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 926380a..923f9af 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -1075,6 +1075,78 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type), NULL, NULL); } + case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: { + AstTree *left = arguments[0]; + AstTree *right = arguments[1]; + AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type)); + + switch (left->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret = *(i8 *)left->metadata << *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret = *(u8 *)left->metadata << *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret = *(i16 *)left->metadata << *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret = *(u16 *)left->metadata << *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret = *(i32 *)left->metadata << *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret = *(u32 *)left->metadata << *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret = *(i64 *)left->metadata << *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret = *(u64 *)left->metadata << *(u64 *)right->metadata; + break; + default: + UNREACHABLE; + } + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type), + NULL, NULL); + } + case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: { + AstTree *left = arguments[0]; + AstTree *right = arguments[1]; + AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type)); + + switch (left->type->token) { + case AST_TREE_TOKEN_TYPE_I8: + *(i8 *)ret = *(i8 *)left->metadata >> *(i8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U8: + *(u8 *)ret = *(u8 *)left->metadata >> *(u8 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I16: + *(i16 *)ret = *(i16 *)left->metadata >> *(i16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U16: + *(u16 *)ret = *(u16 *)left->metadata >> *(u16 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I32: + *(i32 *)ret = *(i32 *)left->metadata >> *(i32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U32: + *(u32 *)ret = *(u32 *)left->metadata >> *(u32 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_I64: + *(i64 *)ret = *(i64 *)left->metadata >> *(i64 *)right->metadata; + break; + case AST_TREE_TOKEN_TYPE_U64: + *(u64 *)ret = *(u64 *)left->metadata >> *(u64 *)right->metadata; + break; + default: + UNREACHABLE; + } + return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type), + NULL, NULL); + } case AST_TREE_TOKEN_BUILTIN_PUTC: { putchar(*(u8 *)arguments[0]->metadata); return copyAstTree(&AST_TREE_VOID_VALUE); @@ -1447,7 +1519,9 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: - case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: { + case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: + case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT: + case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: { AstTreeInfix *metadata = expr->metadata; AstTree *function = runExpression(metadata->function->value, scope, shouldRet, false, @@ -1541,6 +1615,8 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: + case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: + case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: return copyAstTree(expr); case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME: { AstTreeBool *metadata = a404m_malloc(sizeof(*metadata)); @@ -2030,6 +2106,8 @@ AstTree *toRawValue(AstTree *value) { case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: + case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: + case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -2068,6 +2146,8 @@ AstTree *toRawValue(AstTree *value) { case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: + case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT: + case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: @@ -2205,6 +2285,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) { case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: + case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: + case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -2253,6 +2335,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) { case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: + case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT: + case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: @@ -2331,6 +2415,8 @@ ffi_type *toFFIType(AstTree *type) { case AST_TREE_TOKEN_BUILTIN_BITWISE_AND: case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR: case AST_TREE_TOKEN_BUILTIN_BITWISE_OR: + case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: + case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_KEYWORD_RETURN: case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: @@ -2379,6 +2465,8 @@ ffi_type *toFFIType(AstTree *type) { case AST_TREE_TOKEN_OPERATOR_BITWISE_AND: case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR: case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: + case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT: + case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: |