BROKEN: more ast nodes converted
[xonotic/gmqcc.git] / intrin.h
1 #ifndef GMQCC_INTRIN_HDR
2 #define GMQCC_INTRIN_HDR
3 #include "gmqcc.h"
4
5 struct fold;
6 struct parser_t;
7
8 struct ast_function;
9 struct ast_expression;
10 struct ast_value;
11
12 struct intrin;
13
14 struct intrin_func_t {
15     ast_expression *(intrin::*function)();
16     const char *name;
17     const char *alias;
18     size_t args;
19 };
20
21 struct intrin {
22     intrin() = default;
23     intrin(parser_t *parser);
24
25     ast_expression *debug_typestring();
26     ast_expression *do_fold(ast_value *val, ast_expression **exprs);
27     ast_expression *func_try(size_t offset, const char *compare);
28     ast_expression *func_self(const char *name, const char *from);
29     ast_expression *func(const char *name);
30
31 protected:
32     lex_ctx_t ctx() const;
33     ast_function *value(ast_value **out, const char *name, qc_type vtype);
34     void reg(ast_value *const value, ast_function *const func);
35
36     ast_expression *nullfunc();
37     ast_expression *isfinite_();
38     ast_expression *isinf_();
39     ast_expression *isnan_();
40     ast_expression *isnormal_();
41     ast_expression *signbit_();
42     ast_expression *acosh_();
43     ast_expression *asinh_();
44     ast_expression *atanh_();
45     ast_expression *exp_();
46     ast_expression *exp2_();
47     ast_expression *expm1_();
48     ast_expression *pow_();
49     ast_expression *mod_();
50     ast_expression *fabs_();
51     ast_expression *epsilon_();
52     ast_expression *nan_();
53     ast_expression *inf_();
54     ast_expression *ln_();
55     ast_expression *log_variant(const char *name, float base);
56     ast_expression *log_();
57     ast_expression *log10_();
58     ast_expression *log2_();
59     ast_expression *logb_();
60     ast_expression *shift_variant(const char *name, size_t instr);
61     ast_expression *lshift();
62     ast_expression *rshift();
63
64     void error(const char *fmt, ...);
65
66 private:
67     parser_t *m_parser;
68     fold *m_fold;
69     std::vector<intrin_func_t> m_intrinsics;
70     std::vector<ast_expression*> m_generated;
71 };
72
73
74 #endif