]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Handling vector constants now too
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 14:20:53 +0000 (16:20 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 14:20:53 +0000 (16:20 +0200)
parser.c

index 3a99c37da7563fa7756a1a0f5c38a0a5b3e61f4c..942fd9c55da4ac1c0a0d60689518bf050c93b097 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -12,6 +12,7 @@ typedef struct {
     MEM_VECTOR_MAKE(ast_function*, functions);
     MEM_VECTOR_MAKE(ast_value*, imm_float);
     MEM_VECTOR_MAKE(ast_value*, imm_string);
+    MEM_VECTOR_MAKE(ast_value*, imm_vector);
 
     ast_function *function;
     MEM_VECTOR_MAKE(ast_value*, locals);
@@ -21,6 +22,7 @@ typedef struct {
 MEM_VEC_FUNCTIONS(parser_t, ast_value*, globals)
 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_float)
 MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_string)
+MEM_VEC_FUNCTIONS(parser_t, ast_value*, imm_vector)
 MEM_VEC_FUNCTIONS(parser_t, ast_value*, locals)
 MEM_VEC_FUNCTIONS(parser_t, ast_function*, functions)
 
@@ -97,6 +99,24 @@ ast_value* parser_const_string(parser_t *parser, const char *str)
     return out;
 }
 
+ast_value* parser_const_vector(parser_t *parser, vector v)
+{
+    size_t i;
+    ast_value *out;
+    for (i = 0; i < parser->imm_vector_count; ++i) {
+        if (!memcmp(&parser->imm_vector[i]->constval.vvec, &v, sizeof(v)))
+            return parser->imm_vector[i];
+    }
+    out = ast_value_new(parser_ctx(parser), "#IMMEDIATE", TYPE_VECTOR);
+    out->isconst = true;
+    out->constval.vvec = v;
+    if (!parser_t_imm_vector_add(parser, out)) {
+        ast_value_delete(out);
+        return NULL;
+    }
+    return out;
+}
+
 ast_value* parser_find_global(parser_t *parser, const char *name)
 {
     size_t i;
@@ -614,6 +634,15 @@ static ast_expression* parser_expression(parser_t *parser)
                     goto onerr;
                 }
             }
+            else if (parser->tok == TOKEN_VECTORCONST) {
+                ast_value *val = parser_const_vector(parser, parser_token(parser)->constval.v);
+                if (!val)
+                    return false;
+                if (!shunt_out_add(&sy, syexp(parser_ctx(parser), (ast_expression*)val))) {
+                    parseerror(parser, "out of memory");
+                    goto onerr;
+                }
+            }
             else if (parser->tok == '(') {
                 nextwant = false; /* not expecting an operator next */
                 if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), 1, 0))) {
@@ -1085,6 +1114,11 @@ bool parser_compile(const char *filename)
             printf("failed to generate global %s\n", parser->imm_string[i]->name);
         }
     }
+    for (i = 0; i < parser->imm_vector_count; ++i) {
+        if (!ast_global_codegen(parser->imm_vector[i], ir)) {
+            printf("failed to generate global %s\n", parser->imm_vector[i]->name);
+        }
+    }
     for (i = 0; i < parser->globals_count; ++i) {
         if (!ast_global_codegen(parser->globals[i], ir)) {
             printf("failed to generate global %s\n", parser->globals[i]->name);