]> git.xonotic.org Git - xonotic/gmqcc.git/blob - execloop.h
Merge branch 'master' into blub/parser
[xonotic/gmqcc.git] / execloop.h
1 #if 0
2     /* Expected variables */
3     qc_program     *prog;
4 #endif
5
6 #if !defined(QCVM_PROFILE)
7 #   define   QCVM_PROFILE 0
8 #endif
9
10 #if !defined(QCVM_TRACE)
11 #   define   QCVM_TRACE 0
12 #endif
13
14 #if !defined(FLOAT_IS_TRUE_FOR_INT)
15 #   define FLOAT_IS_TRUE_FOR_INT(x) ( (x) & 0x7FFFFFFF )
16 #endif
17
18 #if !defined(PRVM_ERROR)
19 #   define PRVM_ERROR prog->vmerror++, printvmerr
20 #endif
21
22 #if !defined(PRVM_NAME)
23 #   define PRVM_NAME (prog->filename)
24 #endif
25
26 #if !defined(PROG_GETSTRING)
27 #   define PROG_GETSTRING(x) prog_getstring(prog, (x))
28 #endif
29
30 #if !defined(PROG_ENTFIELD)
31 #   define PROG_ENTFIELD(x) prog_entfield(prog, (x))
32 #endif
33
34 #if !defined(PROG_GETEDICT)
35 #   define PROG_GETEDICT(x) prog_getedict(prog, (x))
36 #endif
37
38 #if !defined(PROG_ENTERFUNCTION)
39 #   define PROG_ENTERFUNCTION(x) prog_enterfunction(prog, (x))
40 #endif
41
42 #if !defined(PROG_LEAVEFUNCTION)
43 #   define PROG_LEAVEFUNCTION() prog_leavefunction(prog)
44 #endif
45
46 #define OPA ( (qcany*) (prog->globals + st->o1.u1) )
47 #define OPB ( (qcany*) (prog->globals + st->o2.u1) )
48 #define OPC ( (qcany*) (prog->globals + st->o3.u1) )
49 #define GLOBAL(x) ( (qcany*) (prog->globals + (x)) )
50
51                 while (1)
52                 {
53                     prog_section_function  *newf;
54                     qcany          *ed;
55                     qcany          *ptr;
56
57             ++st;
58             /*
59                         prog->ip++;
60                     st = prog->code + prog->ip;
61                     */
62
63 #if QCVM_PROFILE
64             prog->profile[st - prog->code]++;
65 #endif
66
67 #if QCVM_TRACE
68             prog_print_statement(prog, st);
69 #endif
70
71                         switch (st->opcode)
72                         {
73                         case INSTR_ADD_F:
74                                 OPC->_float = OPA->_float + OPB->_float;
75                                 break;
76                         case INSTR_ADD_V:
77                                 OPC->vector[0] = OPA->vector[0] + OPB->vector[0];
78                                 OPC->vector[1] = OPA->vector[1] + OPB->vector[1];
79                                 OPC->vector[2] = OPA->vector[2] + OPB->vector[2];
80                                 break;
81                         case INSTR_SUB_F:
82                                 OPC->_float = OPA->_float - OPB->_float;
83                                 break;
84                         case INSTR_SUB_V:
85                                 OPC->vector[0] = OPA->vector[0] - OPB->vector[0];
86                                 OPC->vector[1] = OPA->vector[1] - OPB->vector[1];
87                                 OPC->vector[2] = OPA->vector[2] - OPB->vector[2];
88                                 break;
89                         case INSTR_MUL_F:
90                                 OPC->_float = OPA->_float * OPB->_float;
91                                 break;
92                         case INSTR_MUL_V:
93                                 OPC->_float = OPA->vector[0]*OPB->vector[0] + OPA->vector[1]*OPB->vector[1] + OPA->vector[2]*OPB->vector[2];
94                                 break;
95                         case INSTR_MUL_FV:
96                                 OPC->vector[0] = OPA->_float * OPB->vector[0];
97                                 OPC->vector[1] = OPA->_float * OPB->vector[1];
98                                 OPC->vector[2] = OPA->_float * OPB->vector[2];
99                                 break;
100                         case INSTR_MUL_VF:
101                                 OPC->vector[0] = OPB->_float * OPA->vector[0];
102                                 OPC->vector[1] = OPB->_float * OPA->vector[1];
103                                 OPC->vector[2] = OPB->_float * OPA->vector[2];
104                                 break;
105                         case INSTR_DIV_F:
106                                 if( OPB->_float != 0.0f )
107                                 {
108                                         OPC->_float = OPA->_float / OPB->_float;
109                                 }
110                                 else
111                                 {
112                                         OPC->_float = 0.0f;
113                                 }
114                                 break;
115                         case INSTR_BITAND:
116                                 OPC->_float = (int)OPA->_float & (int)OPB->_float;
117                                 break;
118                         case INSTR_BITOR:
119                                 OPC->_float = (int)OPA->_float | (int)OPB->_float;
120                                 break;
121                         case INSTR_GE:
122                                 OPC->_float = OPA->_float >= OPB->_float;
123                                 break;
124                         case INSTR_LE:
125                                 OPC->_float = OPA->_float <= OPB->_float;
126                                 break;
127                         case INSTR_GT:
128                                 OPC->_float = OPA->_float > OPB->_float;
129                                 break;
130                         case INSTR_LT:
131                                 OPC->_float = OPA->_float < OPB->_float;
132                                 break;
133                         case INSTR_AND:
134 /* TODO change this back to float, and add AND_I to be used by fteqcc for anything not a float */
135                                 OPC->_float = FLOAT_IS_TRUE_FOR_INT(OPA->_int) && FLOAT_IS_TRUE_FOR_INT(OPB->_int);
136                                 break;
137                         case INSTR_OR:
138 /* TODO change this back to float, and add AND_I to be used by fteqcc for anything not a float */
139                                 OPC->_float = FLOAT_IS_TRUE_FOR_INT(OPA->_int) || FLOAT_IS_TRUE_FOR_INT(OPB->_int);
140                                 break;
141                         case INSTR_NOT_F:
142                                 OPC->_float = !FLOAT_IS_TRUE_FOR_INT(OPA->_int);
143                                 break;
144                         case INSTR_NOT_V:
145                                 OPC->_float = !OPA->vector[0] && !OPA->vector[1] && !OPA->vector[2];
146                                 break;
147                         case INSTR_NOT_S:
148                                 OPC->_float = !OPA->string || !*PROG_GETSTRING(OPA->string);
149                                 break;
150                         case INSTR_NOT_FNC:
151                                 OPC->_float = !OPA->function;
152                                 break;
153                         case INSTR_NOT_ENT:
154                                 OPC->_float = (OPA->edict == 0);
155                                 break;
156                         case INSTR_EQ_F:
157                                 OPC->_float = OPA->_float == OPB->_float;
158                                 break;
159                         case INSTR_EQ_V:
160                                 OPC->_float = (OPA->vector[0] == OPB->vector[0]) &&
161                                               (OPA->vector[1] == OPB->vector[1]) &&
162                                               (OPA->vector[2] == OPB->vector[2]);
163                                 break;
164                         case INSTR_EQ_S:
165                                 OPC->_float = !strcmp(PROG_GETSTRING(OPA->string),PROG_GETSTRING(OPB->string));
166                                 break;
167                         case INSTR_EQ_E:
168                                 OPC->_float = OPA->_int == OPB->_int;
169                                 break;
170                         case INSTR_EQ_FNC:
171                                 OPC->_float = OPA->function == OPB->function;
172                                 break;
173                         case INSTR_NE_F:
174                                 OPC->_float = OPA->_float != OPB->_float;
175                                 break;
176                         case INSTR_NE_V:
177                                 OPC->_float = (OPA->vector[0] != OPB->vector[0]) || (OPA->vector[1] != OPB->vector[1]) || (OPA->vector[2] != OPB->vector[2]);
178                                 break;
179                         case INSTR_NE_S:
180                                 OPC->_float = strcmp(PROG_GETSTRING(OPA->string),PROG_GETSTRING(OPB->string));
181                                 break;
182                         case INSTR_NE_E:
183                                 OPC->_float = OPA->_int != OPB->_int;
184                                 break;
185                         case INSTR_NE_FNC:
186                                 OPC->_float = OPA->function != OPB->function;
187                                 break;
188
189                 /*==================*/
190                         case INSTR_STORE_F:
191                         case INSTR_STORE_ENT:
192                         case INSTR_STORE_FLD:
193                         case INSTR_STORE_S:
194                         case INSTR_STORE_FNC:
195                                 OPB->_int = OPA->_int;
196                                 break;
197                         case INSTR_STORE_V:
198                                 OPB->ivector[0] = OPA->ivector[0];
199                                 OPB->ivector[1] = OPA->ivector[1];
200                                 OPB->ivector[2] = OPA->ivector[2];
201                                 break;
202
203                         case INSTR_STOREP_F:
204                         case INSTR_STOREP_ENT:
205                         case INSTR_STOREP_FLD:
206                         case INSTR_STOREP_S:
207                         case INSTR_STOREP_FNC:
208                                 if (OPB->_int < 0 || OPB->_int >= prog->entitydata_count)
209                                 {
210                                         PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int);
211                                         goto cleanup;
212                                 }
213                                 if (OPB->_int < prog->entityfields && !prog->allowworldwrites)
214                                         PRVM_ERROR("ERROR: assignment to world.%s (field %i) in %s\n", PROG_GETSTRING(PROG_ENTFIELD(OPB->_int)->name), OPB->_int, PRVM_NAME);
215                                 ptr = (qcany*)(prog->entitydata + OPB->_int);
216                                 ptr->_int = OPA->_int;
217                                 break;
218                         case INSTR_STOREP_V:
219                                 if (OPB->_int < 0 || OPB->_int + 2 >= prog->entitydata_count)
220                                 {
221                                         PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int);
222                                         goto cleanup;
223                                 }
224                                 if (OPB->_int < prog->entityfields && !prog->allowworldwrites)
225                                         PRVM_ERROR("ERROR: assignment to world.%s (field %i) in %s\n", PROG_GETSTRING(PROG_ENTFIELD(OPB->_int)->name), OPB->_int, PRVM_NAME);
226                                 ptr = (qcany*)(prog->entitydata + OPB->_int);
227                                 ptr->ivector[0] = OPA->ivector[0];
228                                 ptr->ivector[1] = OPA->ivector[1];
229                                 ptr->ivector[2] = OPA->ivector[2];
230                                 break;
231
232                         case INSTR_ADDRESS:
233                                 if (OPA->edict < 0 || OPA->edict >= prog->entities)
234                                 {
235                                         PRVM_ERROR ("%s Progs attempted to address an out of bounds edict number %i", PRVM_NAME, OPA->edict);
236                                         goto cleanup;
237                                 }
238                                 if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->entityfields))
239                                 {
240                                         PRVM_ERROR("%s attempted to address an invalid field (%i) in an edict", PRVM_NAME, OPB->_int);
241                                         goto cleanup;
242                                 }
243
244                                 ed = PROG_GETEDICT(OPA->edict);
245                                 OPC->_int = ((qcint*)ed) - prog->entitydata;
246                                 OPC->_int += OPB->_int;
247                                 break;
248
249                         case INSTR_LOAD_F:
250                         case INSTR_LOAD_FLD:
251                         case INSTR_LOAD_ENT:
252                         case INSTR_LOAD_S:
253                         case INSTR_LOAD_FNC:
254                                 if (OPA->edict < 0 || OPA->edict >= prog->entities)
255                                 {
256                                         PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
257                                         goto cleanup;
258                                 }
259                                 if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->entityfields))
260                                 {
261                                         PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int);
262                                         goto cleanup;
263                                 }
264                                 ed = PROG_GETEDICT(OPA->edict);
265                                 OPC->_int = ((qcany*)( ((qcint*)ed) + OPB->_int ))->_int;
266                                 break;
267
268                         case INSTR_LOAD_V:
269                                 if (OPA->edict < 0 || OPA->edict >= prog->entities)
270                                 {
271                                         PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
272                                         goto cleanup;
273                                 }
274                                 if (OPB->_int < 0 || OPB->_int + 3 > prog->entityfields)
275                                 {
276                                         PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int);
277                                         goto cleanup;
278                                 }
279                                 ed = PROG_GETEDICT(OPA->edict);
280                                 OPC->ivector[0] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[0];
281                                 OPC->ivector[1] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[1];
282                                 OPC->ivector[2] = ((qcany*)( ((qcint*)ed) + OPB->_int ))->ivector[2];
283                                 break;
284
285                 /*==================*/
286
287                         case INSTR_IFNOT:
288                                 if(!FLOAT_IS_TRUE_FOR_INT(OPA->_int))
289                                 /* TODO add an "int-if", and change this one to OPA->_float
290                                    although mostly unneeded, thanks to the only float being false being 0x0 and 0x80000000 (negative zero)
291                                    and entity, string, field values can never have that value
292                                  */
293                                 {
294                                         st += st->o2.s1 - 1;    /* offset the s++ */
295                                         if (++jumpcount >= maxjumps)
296                                         {
297                                                 PRVM_ERROR("%s runaway loop counter hit limit of %li jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount);
298                                         }
299                                 }
300                                 break;
301
302                         case INSTR_IF:
303                                 if(FLOAT_IS_TRUE_FOR_INT(OPA->_int))
304                                 {
305                                         st += st->o2.s1 - 1;    /* offset the s++ */
306                                         /* no bounds check needed, it is done when loading progs */
307                                         if (++jumpcount >= maxjumps)
308                                         {
309                                                 PRVM_ERROR("%s runaway loop counter hit limit of %li jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount);
310                                         }
311                                 }
312                                 break;
313
314                         case INSTR_GOTO:
315                                 st += st->o1.s1 - 1;    /* offset the s++ */
316                                 /* no bounds check needed, it is done when loading progs */
317                                 if (++jumpcount == 10000000)
318                                 {
319                                         PRVM_ERROR("%s runaway loop counter hit limit of %li jumps\ntip: read above for list of most-executed functions", PRVM_NAME, jumpcount);
320                                 }
321                                 break;
322
323                         case INSTR_CALL0:
324                         case INSTR_CALL1:
325                         case INSTR_CALL2:
326                         case INSTR_CALL3:
327                         case INSTR_CALL4:
328                         case INSTR_CALL5:
329                         case INSTR_CALL6:
330                         case INSTR_CALL7:
331                         case INSTR_CALL8:
332                                 prog->argc = st->opcode - INSTR_CALL0;
333                                 if (!OPA->function)
334                                         PRVM_ERROR("NULL function in %s", PRVM_NAME);
335
336                                 if(!OPA->function || OPA->function >= (unsigned int)prog->functions_count)
337                                 {
338                                         PRVM_ERROR("%s CALL outside the program", PRVM_NAME);
339                                         goto cleanup;
340                                 }
341
342                                 newf = &prog->functions[OPA->function];
343                                 newf->profile++;
344
345                                 prog->statement = (st - prog->code) + 1;
346
347                                 if (newf->entry < 0)
348                                 {
349                                         /* negative statements are built in functions */
350                                         int builtinnumber = -newf->entry;
351                                         if (builtinnumber < prog->builtins_count && prog->builtins[builtinnumber])
352                                         {
353                                                 prog->builtins[builtinnumber](prog);
354                                         }
355                                         else
356                                                 PRVM_ERROR("No such builtin #%i in %s; most likely cause: outdated engine build. Try updating!", builtinnumber, PRVM_NAME);
357                                 }
358                                 else
359                                         st = prog->code + PROG_ENTERFUNCTION(newf);
360                                 if (prog->vmerror)
361                                     goto cleanup;
362                                 break;
363
364                         case INSTR_DONE:
365                         case INSTR_RETURN:
366                             /* add instruction count to function profile count */
367                             GLOBAL(OFS_RETURN)->ivector[0] = OPA->ivector[0];
368                             GLOBAL(OFS_RETURN)->ivector[1] = OPA->ivector[1];
369                             GLOBAL(OFS_RETURN)->ivector[2] = OPA->ivector[2];
370
371                 st = prog->code + PROG_LEAVEFUNCTION();
372                 if (!prog->stack_count)
373                     goto cleanup;
374
375                 break;
376
377                         case INSTR_STATE:
378                                 break;
379
380 /* LordHavoc: to be enabled when Progs version 7 (or whatever it will be numbered) is finalized */
381 /*
382                         case INSTR_ADD_I:
383                                 OPC->_int = OPA->_int + OPB->_int;
384                                 break;
385                         case INSTR_ADD_IF:
386                                 OPC->_int = OPA->_int + (int) OPB->_float;
387                                 break;
388                         case INSTR_ADD_FI:
389                                 OPC->_float = OPA->_float + (float) OPB->_int;
390                                 break;
391                         case INSTR_SUB_I:
392                                 OPC->_int = OPA->_int - OPB->_int;
393                                 break;
394                         case INSTR_SUB_IF:
395                                 OPC->_int = OPA->_int - (int) OPB->_float;
396                                 break;
397                         case INSTR_SUB_FI:
398                                 OPC->_float = OPA->_float - (float) OPB->_int;
399                                 break;
400                         case INSTR_MUL_I:
401                                 OPC->_int = OPA->_int * OPB->_int;
402                                 break;
403                         case INSTR_MUL_IF:
404                                 OPC->_int = OPA->_int * (int) OPB->_float;
405                                 break;
406                         case INSTR_MUL_FI:
407                                 OPC->_float = OPA->_float * (float) OPB->_int;
408                                 break;
409                         case INSTR_MUL_VI:
410                                 OPC->vector[0] = (float) OPB->_int * OPA->vector[0];
411                                 OPC->vector[1] = (float) OPB->_int * OPA->vector[1];
412                                 OPC->vector[2] = (float) OPB->_int * OPA->vector[2];
413                                 break;
414                         case INSTR_DIV_VF:
415                                 {
416                                         float temp = 1.0f / OPB->_float;
417                                         OPC->vector[0] = temp * OPA->vector[0];
418                                         OPC->vector[1] = temp * OPA->vector[1];
419                                         OPC->vector[2] = temp * OPA->vector[2];
420                                 }
421                                 break;
422                         case INSTR_DIV_I:
423                                 OPC->_int = OPA->_int / OPB->_int;
424                                 break;
425                         case INSTR_DIV_IF:
426                                 OPC->_int = OPA->_int / (int) OPB->_float;
427                                 break;
428                         case INSTR_DIV_FI:
429                                 OPC->_float = OPA->_float / (float) OPB->_int;
430                                 break;
431                         case INSTR_CONV_IF:
432                                 OPC->_float = OPA->_int;
433                                 break;
434                         case INSTR_CONV_FI:
435                                 OPC->_int = OPA->_float;
436                                 break;
437                         case INSTR_BITAND_I:
438                                 OPC->_int = OPA->_int & OPB->_int;
439                                 break;
440                         case INSTR_BITOR_I:
441                                 OPC->_int = OPA->_int | OPB->_int;
442                                 break;
443                         case INSTR_BITAND_IF:
444                                 OPC->_int = OPA->_int & (int)OPB->_float;
445                                 break;
446                         case INSTR_BITOR_IF:
447                                 OPC->_int = OPA->_int | (int)OPB->_float;
448                                 break;
449                         case INSTR_BITAND_FI:
450                                 OPC->_float = (int)OPA->_float & OPB->_int;
451                                 break;
452                         case INSTR_BITOR_FI:
453                                 OPC->_float = (int)OPA->_float | OPB->_int;
454                                 break;
455                         case INSTR_GE_I:
456                                 OPC->_float = OPA->_int >= OPB->_int;
457                                 break;
458                         case INSTR_LE_I:
459                                 OPC->_float = OPA->_int <= OPB->_int;
460                                 break;
461                         case INSTR_GT_I:
462                                 OPC->_float = OPA->_int > OPB->_int;
463                                 break;
464                         case INSTR_LT_I:
465                                 OPC->_float = OPA->_int < OPB->_int;
466                                 break;
467                         case INSTR_AND_I:
468                                 OPC->_float = OPA->_int && OPB->_int;
469                                 break;
470                         case INSTR_OR_I:
471                                 OPC->_float = OPA->_int || OPB->_int;
472                                 break;
473                         case INSTR_GE_IF:
474                                 OPC->_float = (float)OPA->_int >= OPB->_float;
475                                 break;
476                         case INSTR_LE_IF:
477                                 OPC->_float = (float)OPA->_int <= OPB->_float;
478                                 break;
479                         case INSTR_GT_IF:
480                                 OPC->_float = (float)OPA->_int > OPB->_float;
481                                 break;
482                         case INSTR_LT_IF:
483                                 OPC->_float = (float)OPA->_int < OPB->_float;
484                                 break;
485                         case INSTR_AND_IF:
486                                 OPC->_float = (float)OPA->_int && OPB->_float;
487                                 break;
488                         case INSTR_OR_IF:
489                                 OPC->_float = (float)OPA->_int || OPB->_float;
490                                 break;
491                         case INSTR_GE_FI:
492                                 OPC->_float = OPA->_float >= (float)OPB->_int;
493                                 break;
494                         case INSTR_LE_FI:
495                                 OPC->_float = OPA->_float <= (float)OPB->_int;
496                                 break;
497                         case INSTR_GT_FI:
498                                 OPC->_float = OPA->_float > (float)OPB->_int;
499                                 break;
500                         case INSTR_LT_FI:
501                                 OPC->_float = OPA->_float < (float)OPB->_int;
502                                 break;
503                         case INSTR_AND_FI:
504                                 OPC->_float = OPA->_float && (float)OPB->_int;
505                                 break;
506                         case INSTR_OR_FI:
507                                 OPC->_float = OPA->_float || (float)OPB->_int;
508                                 break;
509                         case INSTR_NOT_I:
510                                 OPC->_float = !OPA->_int;
511                                 break;
512                         case INSTR_EQ_I:
513                                 OPC->_float = OPA->_int == OPB->_int;
514                                 break;
515                         case INSTR_EQ_IF:
516                                 OPC->_float = (float)OPA->_int == OPB->_float;
517                                 break;
518                         case INSTR_EQ_FI:
519                                 OPC->_float = OPA->_float == (float)OPB->_int;
520                                 break;
521                         case INSTR_NE_I:
522                                 OPC->_float = OPA->_int != OPB->_int;
523                                 break;
524                         case INSTR_NE_IF:
525                                 OPC->_float = (float)OPA->_int != OPB->_float;
526                                 break;
527                         case INSTR_NE_FI:
528                                 OPC->_float = OPA->_float != (float)OPB->_int;
529                                 break;
530                         case INSTR_STORE_I:
531                                 OPB->_int = OPA->_int;
532                                 break;
533                         case INSTR_STOREP_I:
534 #if PRBOUNDSCHECK
535                                 if (OPB->_int < 0 || OPB->_int + 4 > pr_edictareasize)
536                                 {
537                                         PRVM_ERROR ("%s Progs attempted to write to an out of bounds edict", PRVM_NAME);
538                                         goto cleanup;
539                                 }
540 #endif
541                                 ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int);
542                                 ptr->_int = OPA->_int;
543                                 break;
544                         case INSTR_LOAD_I:
545 #if PRBOUNDSCHECK
546                                 if (OPA->edict < 0 || OPA->edict >= prog->max_edicts)
547                                 {
548                                         PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
549                                         goto cleanup;
550                                 }
551                                 if (OPB->_int < 0 || OPB->_int >= progs->entityfields)
552                                 {
553                                         PRVM_ERROR ("%s Progs attempted to read an invalid field in an edict", PRVM_NAME);
554                                         goto cleanup;
555                                 }
556 #endif
557                                 ed = PRVM_PROG_TO_EDICT(OPA->edict);
558                                 OPC->_int = ((prvm_eval_t *)((int *)ed->v + OPB->_int))->_int;
559                                 break;
560                         }
561                         */
562
563                         default:
564                             PRVM_ERROR("Illegal instruction in %s\n", PRVM_NAME);
565                             goto cleanup;
566                         }
567                 }
568
569 #undef QCVM_PROFILE
570 #undef QCVM_TRACE