implemented bitwise and, not, or, and xor

This commit is contained in:
Kyler Olsen 2025-11-29 15:15:24 -07:00
parent 2f36271439
commit 8a5e3494e6
1 changed files with 307 additions and 8 deletions

View File

@ -1094,23 +1094,322 @@ Boolean builtin_atan2(InterpreterState *interpreter_state) {
} }
Boolean builtin_bitand(InterpreterState *interpreter_state) { Boolean builtin_bitand(InterpreterState *interpreter_state) {
(void)interpreter_state; NUMERIC_TYPES;
(void)af;
(void)bf;
if (type & NUMERIC_FLOAT)
return FALSE; return FALSE;
StackItem *node = interpreter_state->stack;
interpreter_state->stack = interpreter_state->stack->next->next;
node->next->next = NULL;
clean_stack(node);
if (type & NUMERIC_SIGNED && type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I64,
.value = bi & ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I32,
.value = bi & ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I16,
.value = bi & ai,
},
});
} else if (type & NUMERIC_SIGNED) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I8,
.value = bi & ai,
},
});
} else if (type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U64,
.value = bi & ai,
},
});
} else if (type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U32,
.value = bi & ai,
},
});
} else if (type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U16,
.value = bi & ai,
},
});
} else {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U8,
.value = bi & ai,
},
});
}
} }
Boolean builtin_bitnot(InterpreterState *interpreter_state) { Boolean builtin_bitnot(InterpreterState *interpreter_state) {
(void)interpreter_state; NUMERIC_TYPE;
(void)af;
if (type & NUMERIC_FLOAT)
return FALSE; return FALSE;
StackItem *node = interpreter_state->stack;
interpreter_state->stack = interpreter_state->stack->next;
node->next = NULL;
clean_stack(node);
if (type & NUMERIC_SIGNED && type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I64,
.value = ~ ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I32,
.value = ~ ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I16,
.value = ~ ai,
},
});
} else if (type & NUMERIC_SIGNED) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I8,
.value = ~ ai,
},
});
} else if (type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U64,
.value = ~ ai,
},
});
} else if (type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U32,
.value = ~ ai,
},
});
} else if (type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U16,
.value = ~ ai,
},
});
} else {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U8,
.value = ~ ai,
},
});
}
} }
Boolean builtin_bitor(InterpreterState *interpreter_state) { Boolean builtin_bitor(InterpreterState *interpreter_state) {
(void)interpreter_state; NUMERIC_TYPES;
(void)af;
(void)bf;
if (type & NUMERIC_FLOAT)
return FALSE; return FALSE;
StackItem *node = interpreter_state->stack;
interpreter_state->stack = interpreter_state->stack->next->next;
node->next->next = NULL;
clean_stack(node);
if (type & NUMERIC_SIGNED && type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I64,
.value = bi | ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I32,
.value = bi | ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I16,
.value = bi | ai,
},
});
} else if (type & NUMERIC_SIGNED) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I8,
.value = bi | ai,
},
});
} else if (type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U64,
.value = bi | ai,
},
});
} else if (type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U32,
.value = bi | ai,
},
});
} else if (type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U16,
.value = bi | ai,
},
});
} else {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U8,
.value = bi | ai,
},
});
}
} }
Boolean builtin_bitxor(InterpreterState *interpreter_state) { Boolean builtin_bitxor(InterpreterState *interpreter_state) {
(void)interpreter_state; NUMERIC_TYPES;
(void)af;
(void)bf;
if (type & NUMERIC_FLOAT)
return FALSE; return FALSE;
StackItem *node = interpreter_state->stack;
interpreter_state->stack = interpreter_state->stack->next->next;
node->next->next = NULL;
clean_stack(node);
if (type & NUMERIC_SIGNED && type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I64,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I32,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_SIGNED && type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I16,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_SIGNED) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_I8,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_64) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U64,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_32) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U32,
.value = bi ^ ai,
},
});
} else if (type & NUMERIC_16) {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U16,
.value = bi ^ ai,
},
});
} else {
return push_token(interpreter_state, (Token){
.type = TOKEN_INTEGER,
.integer_literal = (IntegerLiteral){
.type = INTEGER_U8,
.value = bi ^ ai,
},
});
}
} }
Boolean builtin_ceil(InterpreterState *interpreter_state) { Boolean builtin_ceil(InterpreterState *interpreter_state) {