fix for loops
[xonotic/gmqcc.git] / fold.h
1 #ifndef GMQCC_FOLD_HDR
2 #define GMQCC_FOLD_HDR
3 #include "lexer.h"
4 #include "gmqcc.h"
5
6 struct ir_builder;
7 struct ir_value;
8
9 struct ast_function;
10 struct ast_ifthen;
11 struct ast_ternary;
12 struct ast_expression;
13 struct ast_value;
14
15 struct parser_t;
16
17 struct fold {
18     fold();
19     fold(parser_t *parser);
20     ~fold();
21
22     bool generate(ir_builder *ir);
23     ast_expression *op(const oper_info *info, ast_expression **opexprs);
24     ast_expression *intrinsic(const char *intrinsic, ast_expression **arg);
25
26     static int cond_ternary(ir_value *condval, ast_function *func, ast_ternary *branch);
27     static int cond_ifthen(ir_value *condval, ast_function *func, ast_ifthen *branch);
28
29     static ast_expression *superfluous(ast_expression *left, ast_expression *right, int op);
30     static ast_expression *binary(lex_ctx_t ctx, int op, ast_expression *left, ast_expression *right);
31
32     ast_expression *constgen_float(qcfloat_t value, bool inexact);
33     ast_expression *constgen_vector(vec3_t value);
34     ast_expression *constgen_string(const char *str, bool translate);
35
36     ast_value *imm_float(size_t index) const { return m_imm_float[index]; }
37     ast_value *imm_vector(size_t index) const { return m_imm_vector[index]; }
38
39 protected:
40     static qcfloat_t immvalue_float(ast_value *value);
41     static vec3_t immvalue_vector(ast_value *value);
42     static const char *immvalue_string(ast_value *value);
43
44     lex_ctx_t ctx();
45
46     bool immediate_true(ast_value *v);
47
48     bool check_except_float_impl(void (*callback)(void), ast_value *a, ast_value *b);
49     bool check_inexact_float(ast_value *a, ast_value *b);
50
51     ast_expression *op_mul_vec(vec3_t vec, ast_value *sel, const char *set);
52     ast_expression *op_neg(ast_value *a);
53     ast_expression *op_not(ast_value *a);
54     ast_expression *op_add(ast_value *a, ast_value *b);
55     ast_expression *op_sub(ast_value *a, ast_value *b);
56     ast_expression *op_mul(ast_value *a, ast_value *b);
57     ast_expression *op_div(ast_value *a, ast_value *b);
58     ast_expression *op_mod(ast_value *a, ast_value *b);
59     ast_expression *op_bor(ast_value *a, ast_value *b);