]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - intrin.h
Cleanups
[xonotic/gmqcc.git] / intrin.h
index 4b4c9478afa3cb760b1c7ed216ebe86377a3d22f..0c0e861e364910f6956189c2789ab619af5a0d86 100644 (file)
--- 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, "<float>", 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 */
     }
@@ -404,7 +404,7 @@ ast_expression *intrin_func(parser_t *parser, const char *name) {
     if ((find = (void*)parser_find_global(parser, name)) && ((ast_value*)find)->expression.vtype == TYPE_FUNCTION)
         for (i = 0; i < vec_size(parser->functions); ++i)
             if (((ast_value*)find)->name && !strcmp(parser->functions[i]->name, ((ast_value*)find)->name) && parser->functions[i]->builtin < 0)
-                return find;
+                return (ast_expression*)find;
 
     if ((find = util_htget(intrin_intrinsics(), name))) {
         /* intrinsic is in table. This will "generate the function" so
@@ -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;
 }