]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
ir_value now checks if a name was specified
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 787fb1dfab9ec7d49507808204093b8a44e5facf..158463332e78a31ca40ab91d91f67336c2d574c0 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -390,6 +390,10 @@ typedef struct {
 typedef prog_section_both prog_section_def;
 typedef prog_section_both prog_section_field;
 
+/* this is ORed to the type */
+#define DEF_SAVEGLOBAL (1<<15)
+#define DEF_TYPEMASK   ((1<<15)-1)
+
 typedef struct {
     int32_t   entry;      /* in statement table for instructions  */
     uint32_t  firstlocal; /* First local in local table           */
@@ -410,8 +414,8 @@ enum {
     INSTR_DONE,
     INSTR_MUL_F,
     INSTR_MUL_V,
-    INSTR_MUL_FV,
-    INSTR_MUL_VF,
+    INSTR_MUL_FV, /* NOTE: the float operands must NOT be at the same locations: A != C */
+    INSTR_MUL_VF, /* and here: B != C */
     INSTR_DIV_F,
     INSTR_ADD_F,
     INSTR_ADD_V,
@@ -686,22 +690,23 @@ bool GMQCC_WARN Tself##_##mem##_find(Tself *self, Twhat obj, size_t *idx) \
 bool GMQCC_WARN Tself##_##mem##_append(Tself *s, Twhat *p, size_t c) \
 {                                                                    \
     Twhat *reall;                                                    \
-    if (s->mem##_count+c >= s->mem##_alloc) {                        \
+    if (s->mem##_count+c > s->mem##_alloc) {                         \
         if (!s->mem##_alloc) {                                       \
             s->mem##_alloc = c < 16 ? 16 : c;                        \
+            s->mem = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc);  \
         } else {                                                     \
             s->mem##_alloc *= 2;                                     \
             if (s->mem##_count+c >= s->mem##_alloc) {                \
                 s->mem##_alloc = s->mem##_count+c;                   \
             }                                                        \
+            reall = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc);   \
+            if (!reall) {                                            \
+                return false;                                        \
+            }                                                        \
+            memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count);   \
+            mem_d(s->mem);                                           \
+            s->mem = reall;                                          \
         }                                                            \
-        reall = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc);       \
-        if (!reall) {                                                \
-            return false;                                            \
-        }                                                            \
-        memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count);       \
-        mem_d(s->mem);                                               \
-        s->mem = reall;                                              \
     }                                                                \
     memcpy(&s->mem[s->mem##_count], p, c*sizeof(*p));                \
     s->mem##_count += c;                                             \