]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
In this situation the values don't need to be in parameter order; fix: call-stores...
authorWolfgang Bumiller <blub@speed.at>
Fri, 25 Jan 2013 15:25:23 +0000 (16:25 +0100)
committerWolfgang Bumiller <blub@speed.at>
Fri, 25 Jan 2013 15:25:23 +0000 (16:25 +0100)
ir.c

diff --git a/ir.c b/ir.c
index 38882ec85ebf24617fd2fa483427931728cf8d79..ad86914e5feb6144876c31be9062f663e00d998b 100644 (file)
--- a/ir.c
+++ b/ir.c
@@ -2257,18 +2257,22 @@ bool ir_function_allocate_locals(ir_function *self)
                     irerror(call->context, "internal error: unlocked parameter %s not found", v->name);
                     goto error;
                 }
-
                 ++opts_optimizationcount[OPTIM_CALL_STORES];
                 v->callparam = true;
                 if (param < 8)
                     ir_value_code_setaddr(v, OFS_PARM0 + 3*param);
                 else {
+                    size_t nprotos = vec_size(self->owner->extparam_protos);
                     ir_value *ep;
                     param -= 8;
-                    if (vec_size(self->owner->extparam_protos) <= param)
-                        ep = ir_gen_extparam_proto(self->owner);
-                    else
+                    if (nprotos > param)
                         ep = self->owner->extparam_protos[param];
+                    else
+                    {
+                        ep = ir_gen_extparam_proto(self->owner);
+                        while (++nprotos <= param)
+                            ep = ir_gen_extparam_proto(self->owner);
+                    }
                     ir_instr_op(v->writes[0], 0, ep, true);
                     call->params[param+8] = ep;
                 }