implemented bitwise and, not, or, and xor
This commit is contained in:
parent
2f36271439
commit
8a5e3494e6
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue