]> git.xonotic.org Git - xonotic/gmqcc.git/blob - intrin.h
Stuff
[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     explicit intrin(parser_t &parser);
23
24     ast_expression *debug_typestring();
25     ast_expression *do_fold(ast_value *val, ast_expression **exprs);
26     ast_expression *func_try(size_t offset, const char *compare);
27     ast_expression *func_self(const char *name, const char *from);
28     ast_expression *func(const char *name);
29
30 protected:
31     lex_ctx_t ctx() const;
32     ast_function *value(ast_value **out, const char *name, qc_type vtype);
33     void reg(ast_value *const value, ast_function *const func);
34
35     ast_expression *nullfunc();
36     ast_expression *isfinite_();
37     ast_expression *isinf_();
38     ast_expression *isnan_();
39     ast_expression *isnormal_();
40     ast_expression *signbit_();
41     ast_expression *acosh_();
42     ast_expression *asinh_();
43     ast_expression *atanh_();
44     ast_expression *exp_();
45     ast_expression *exp2_();
46     ast_expression *expm1_();
47     ast_expression *pow_();
48     ast_expression *mod_();
49     ast_expression *fabs_();
50     ast_expression *epsilon_();
51     ast_expression *nan_();
52     ast_expression *inf_();
53     ast_expression *ln_();
54     ast_expression *log_variant(const char *name, float base);
55     ast_expression *log_();
56     ast_expression *log10_();
57     ast_expression *log2_();
58     ast_expression *logb_();
59     ast_expression *shift_variant(const char *name, size_t instr);
60     ast_expression *lshift();
61     ast_expression *rshift();
62
63     void error(const char *fmt, ...);
64
65 private:
66     parser_t &m_parser;
67     fold *m_fold;
68     std::vector<intrin_func_t> m_intrinsics;
69     std::vector<ast_expression*> m_generated;
70 };
71
72
73 #endif