X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=intrin.h;h=0c0e861e364910f6956189c2789ab619af5a0d86;hp=4f672dd9c04e349d68cad54e7fd42e5a449352aa;hb=85ee52128c1a71908d75ea5b41de7201a33f964b;hpb=dc8523c6503e014a463df42520b48f597c7655be diff --git a/intrin.h b/intrin.h old mode 100755 new mode 100644 index 4f672dd..0c0e861 --- a/intrin.h +++ b/intrin.h @@ -36,7 +36,7 @@ typedef struct { const char *alias; } intrin_t; -ht intrin_intrinsics() { +static ht intrin_intrinsics(void) { static ht intrinsics = NULL; if (!intrinsics) intrinsics = util_htnew(PARSER_HT_SIZE); @@ -69,12 +69,10 @@ ht intrin_intrinsics() { vec_push(parser->globals, (ast_expression*)(VALUE)); \ } while (0) - -ast_expression *intrin_func (parser_t *parser, const char *name); - #define QC_M_E 2.71828182845905 -ast_expression *intrin_pow(parser_t *parser) { +static ast_expression *intrin_func(parser_t *parser, const char *name); +static ast_expression *intrin_pow (parser_t *parser) { /* * float pow(float x, float y) { * float local = 1.0f; @@ -117,7 +115,7 @@ ast_expression *intrin_pow(parser_t *parser) { parser_ctx(parser), INSTR_STORE_F, (ast_expression*)local, - (ast_expression*)parser_const_float_1(parser) + (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */ ) ); @@ -128,7 +126,7 @@ ast_expression *intrin_pow(parser_t *parser) { INSTR_STORE_F, INSTR_MUL_F, (ast_expression*)arg2, - (ast_expression*)parser_const_float(parser, 0.25f) + (ast_expression*)fold_constgen_float(parser->fold, 0.25f) ) ); @@ -151,7 +149,7 @@ ast_expression *intrin_pow(parser_t *parser) { parser_ctx(parser), INSTR_AND, (ast_expression*)arg2, - (ast_expression*)parser_const_float_1(parser) + (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */ ), true, /* ! not */ NULL, @@ -170,7 +168,7 @@ ast_expression *intrin_pow(parser_t *parser) { INSTR_STORE_F, INSTR_SUB_F, (ast_expression*)arg2, - (ast_expression*)parser_const_float_1(parser) + (ast_expression*)parser->fold->imm_float[1] /* 1 == 1.0f */ ) ); /* local *= x */ @@ -192,7 +190,7 @@ ast_expression *intrin_pow(parser_t *parser) { parser_ctx(parser), INSTR_GT, (ast_expression*)arg2, - (ast_expression*)parser_const_float_0(parser) + (ast_expression*)parser->fold->imm_float[0] /* 0 == 0.0f */ ), false, NULL, @@ -221,7 +219,7 @@ ast_expression *intrin_pow(parser_t *parser) { return (ast_expression*)value; } -ast_expression *intrin_mod(parser_t *parser) { +static ast_expression *intrin_mod(parser_t *parser) { /* * float mod(float x, float y) { * return x - y * floor(x / y); @@ -276,7 +274,7 @@ ast_expression *intrin_mod(parser_t *parser) { return (ast_expression*)value; } -ast_expression *intrin_exp(parser_t *parser) { +static ast_expression *intrin_exp(parser_t *parser) { /* * float exp(float x) { * return pow(QC_M_E, x); @@ -293,7 +291,7 @@ ast_expression *intrin_exp(parser_t *parser) { INTRIN_VAL(value, "exp", func, "", TYPE_FLOAT); /* push arguments for params to call */ - vec_push(call->params, (ast_expression*)parser_const_float(parser, QC_M_E)); + vec_push(call->params, (ast_expression*)fold_constgen_float(parser->fold, QC_M_E)); vec_push(call->params, (ast_expression*)arg1); /* return pow(QC_M_E, x) */ @@ -314,7 +312,7 @@ ast_expression *intrin_exp(parser_t *parser) { return (ast_expression*)value; } -ast_expression *intrin_isnan(parser_t *parser) { +static ast_expression *intrin_isnan(parser_t *parser) { /* * float isnan(float x) { * float local; @@ -326,7 +324,7 @@ ast_expression *intrin_isnan(parser_t *parser) { static ast_value *value = NULL; if (!value) { - ast_value *arg1 = ast_value_new (parser_ctx(parser), "x", TYPE_FLOAT); + ast_value *arg1 = ast_value_new (parser_ctx(parser), "x", TYPE_FLOAT); ast_value *local = ast_value_new (parser_ctx(parser), "local", TYPE_FLOAT); ast_block *body = ast_block_new (parser_ctx(parser)); ast_function *func = NULL; @@ -365,25 +363,27 @@ ast_expression *intrin_isnan(parser_t *parser) { return (ast_expression*)value; } +static ast_expression *intrin_debug_typestring(parser_t *parser) { + (void)parser; + return (ast_expression*)0x1; +} + static intrin_t intrinsics[] = { - {&intrin_exp, "__builtin_exp", "exp"}, - {&intrin_mod, "__builtin_mod", "mod"}, - {&intrin_pow, "__builtin_pow", "pow"}, - {&intrin_isnan, "__builtin_isnan", "isnan"} + {&intrin_exp, "__builtin_exp", "exp"}, + {&intrin_mod, "__builtin_mod", "mod"}, + {&intrin_pow, "__builtin_pow", "pow"}, + {&intrin_isnan, "__builtin_isnan", "isnan"}, + {&intrin_debug_typestring, "__builtin_debug_typestring", ""} }; void intrin_intrinsics_destroy(parser_t *parser) { /*size_t i;*/ (void)parser; util_htdel(intrin_intrinsics()); -#if 0 - for (i = 0; i < sizeof(intrinsics)/sizeof(intrin_t); i++) - ast_value_delete( (ast_value*) intrinsics[i].intrin(parser)); -#endif } -ast_expression *intrin_func(parser_t *parser, const char *name) { +static ast_expression *intrin_func(parser_t *parser, const char *name) { static bool init = false; size_t i = 0; void *find; @@ -391,7 +391,7 @@ ast_expression *intrin_func(parser_t *parser, const char *name) { /* register the intrinsics in the hashtable for O(1) lookup */ if (!init) { for (i = 0; i < sizeof(intrinsics)/sizeof(*intrinsics); i++) - util_htset(intrin_intrinsics(), intrinsics[i].alias, &intrinsics[i]); + util_htset(intrin_intrinsics(), intrinsics[i].name, &intrinsics[i]); init = true; /* only once */ } @@ -413,6 +413,13 @@ ast_expression *intrin_func(parser_t *parser, const char *name) { return ((intrin_t*)find)->intrin(parser); } + /* + * check aliases now to see if there is an implementation of it. + */ + for (i = 0; i < sizeof(intrinsics) / sizeof(*intrinsics); i++) + if (!strcmp(intrinsics[i].alias, name)) + return intrinsics[i].intrin(parser); + parseerror(parser, "need function: `%s` compiler depends on it", name); return NULL; }