]> git.xonotic.org Git - xonotic/gmqcc.git/blob - execloop.h
Merge branch 'master' into blub/bc3
[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 printf
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 + 3 >= 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", PRVM_NAME);
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                                 break;
361
362                         case INSTR_DONE:
363                         case INSTR_RETURN:
364                             /* add instruction count to function profile count */
365                             GLOBAL(OFS_RETURN)->ivector[0] = OPA->ivector[0];
366                             GLOBAL(OFS_RETURN)->ivector[1] = OPA->ivector[1];
367                             GLOBAL(OFS_RETURN)->ivector[2] = OPA->ivector[2];
368
369                 st = prog->code + PROG_LEAVEFUNCTION();
370                 if (!prog->stack_count)
371                     goto cleanup;
372
373                 break;
374
375                         case INSTR_STATE:
376                                 break;
377
378 /* LordHavoc: to be enabled when Progs version 7 (or whatever it will be numbered) is finalized */
379 /*
380                         case INSTR_ADD_I:
381                                 OPC->_int = OPA->_int + OPB->_int;
382                                 break;
383                         case INSTR_ADD_IF:
384                                 OPC->_int = OPA->_int + (int) OPB->_float;
385                                 break;
386                         case INSTR_ADD_FI:
387                                 OPC->_float = OPA->_float + (float) OPB->_int;
388                                 break;
389                         case INSTR_SUB_I:
390                                 OPC->_int = OPA->_int - OPB->_int;
391                                 break;
392                         case INSTR_SUB_IF:
393                                 OPC->_int = OPA->_int - (int) OPB->_float;
394                                 break;
395                         case INSTR_SUB_FI:
396                                 OPC->_float = OPA->_float - (float) OPB->_int;
397                                 break;
398                         case INSTR_MUL_I:
399                                 OPC->_int = OPA->_int * OPB->_int;
400                                 break;
401                         case INSTR_MUL_IF:
402                                 OPC->_int = OPA->_int * (int) OPB->_float;
403                                 break;
404                         case INSTR_MUL_FI:
405                                 OPC->_float = OPA->_float * (float) OPB->_int;
406                                 break;
407                         case INSTR_MUL_VI:
408                                 OPC->vector[0] = (float) OPB->_int * OPA->vector[0];
409                                 OPC->vector[1] = (float) OPB->_int * OPA->vector[1];
410                                 OPC->vector[2] = (float) OPB->_int * OPA->vector[2];
411                                 break;
412                         case INSTR_DIV_VF:
413                                 {
414                                         float temp = 1.0f / OPB->_float;
415                                         OPC->vector[0] = temp * OPA->vector[0];
416                                         OPC->vector[1] = temp * OPA->vector[1];
417                                         OPC->vector[2] = temp * OPA->vector[2];
418                                 }
419                                 break;
420                         case INSTR_DIV_I:
421                                 OPC->_int = OPA->_int / OPB->_int;
422                                 break;
423                         case INSTR_DIV_IF:
424                                 OPC->_int = OPA->_int / (int) OPB->_float;
425                                 break;
426                         case INSTR_DIV_FI:
427                                 OPC->_float = OPA->_float / (float) OPB->_int;
428                                 break;
429                         case INSTR_CONV_IF:
430                                 OPC->_float = OPA->_int;
431                                 break;
432                         case INSTR_CONV_FI:
433                                 OPC->_int = OPA->_float;
434                                 break;
435                         case INSTR_BITAND_I:
436                                 OPC->_int = OPA->_int & OPB->_int;
437                                 break;
438                         case INSTR_BITOR_I:
439                                 OPC->_int = OPA->_int | OPB->_int;
440                                 break;
441                         case INSTR_BITAND_IF:
442                                 OPC->_int = OPA->_int & (int)OPB->_float;
443                                 break;
444                         case INSTR_BITOR_IF:
445                                 OPC->_int = OPA->_int | (int)OPB->_float;
446                                 break;
447                         case INSTR_BITAND_FI:
448                                 OPC->_float = (int)OPA->_float & OPB->_int;
449                                 break;
450                         case INSTR_BITOR_FI:
451                                 OPC->_float = (int)OPA->_float | OPB->_int;
452                                 break;
453                         case INSTR_GE_I:
454                                 OPC->_float = OPA->_int >= OPB->_int;
455                                 break;
456                         case INSTR_LE_I:
457                                 OPC->_float = OPA->_int <= OPB->_int;
458                                 break;
459                         case INSTR_GT_I:
460                                 OPC->_float = OPA->_int > OPB->_int;
461                                 break;
462                         case INSTR_LT_I:
463                                 OPC->_float = OPA->_int < OPB->_int;
464                                 break;
465                         case INSTR_AND_I:
466                                 OPC->_float = OPA->_int && OPB->_int;
467                                 break;
468                         case INSTR_OR_I:
469                                 OPC->_float = OPA->_int || OPB->_int;
470                                 break;
471                         case INSTR_GE_IF:
472                                 OPC->_float = (float)OPA->_int >= OPB->_float;
473                                 break;
474                         case INSTR_LE_IF:
475                                 OPC->_float = (float)OPA->_int <= OPB->_float;
476                                 break;
477                         case INSTR_GT_IF:
478                                 OPC->_float = (float)OPA->_int > OPB->_float;
479                                 break;
480                         case INSTR_LT_IF:
481                                 OPC->_float = (float)OPA->_int < OPB->_float;
482                                 break;
483                         case INSTR_AND_IF:
484                                 OPC->_float = (float)OPA->_int && OPB->_float;
485                                 break;
486                         case INSTR_OR_IF:
487                                 OPC->_float = (float)OPA->_int || OPB->_float;
488                                 break;
489                         case INSTR_GE_FI:
490                                 OPC->_float = OPA->_float >= (float)OPB->_int;
491                                 break;
492                         case INSTR_LE_FI:
493                                 OPC->_float = OPA->_float <= (float)OPB->_int;
494                                 break;
495                         case INSTR_GT_FI:
496                                 OPC->_float = OPA->_float > (float)OPB->_int;
497                                 break;
498                         case INSTR_LT_FI:
499                                 OPC->_float = OPA->_float < (float)OPB->_int;
500                                 break;
501                         case INSTR_AND_FI:
502                                 OPC->_float = OPA->_float && (float)OPB->_int;
503                                 break;
504                         case INSTR_OR_FI:
505                                 OPC->_float = OPA->_float || (float)OPB->_int;
506                                 break;
507                         case INSTR_NOT_I:
508                                 OPC->_float = !OPA->_int;
509                                 break;
510                         case INSTR_EQ_I:
511                                 OPC->_float = OPA->_int == OPB->_int;
512                                 break;
513                         case INSTR_EQ_IF:
514                                 OPC->_float = (float)OPA->_int == OPB->_float;
515                                 break;
516                         case INSTR_EQ_FI:
517                                 OPC->_float = OPA->_float == (float)OPB->_int;
518                                 break;
519                         case INSTR_NE_I:
520                                 OPC->_float = OPA->_int != OPB->_int;
521                                 break;
522                         case INSTR_NE_IF:
523                                 OPC->_float = (float)OPA->_int != OPB->_float;
524                                 break;
525                         case INSTR_NE_FI:
526                                 OPC->_float = OPA->_float != (float)OPB->_int;
527                                 break;
528                         case INSTR_STORE_I:
529                                 OPB->_int = OPA->_int;
530                                 break;
531                         case INSTR_STOREP_I:
532 #if PRBOUNDSCHECK
533                                 if (OPB->_int < 0 || OPB->_int + 4 > pr_edictareasize)
534                                 {
535                                         PRVM_ERROR ("%s Progs attempted to write to an out of bounds edict", PRVM_NAME);
536                                         goto cleanup;
537                                 }
538 #endif
539                                 ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int);
540                                 ptr->_int = OPA->_int;
541                                 break;
542                         case INSTR_LOAD_I:
543 #if PRBOUNDSCHECK
544                                 if (OPA->edict < 0 || OPA->edict >= prog->max_edicts)
545                                 {
546                                         PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
547                                         goto cleanup;
548                                 }
549                                 if (OPB->_int < 0 || OPB->_int >= progs->entityfields)
550                                 {
551                                         PRVM_ERROR ("%s Progs attempted to read an invalid field in an edict", PRVM_NAME);
552                                         goto cleanup;
553                                 }
554 #endif
555                                 ed = PRVM_PROG_TO_EDICT(OPA->edict);
556                                 OPC->_int = ((prvm_eval_t *)((int *)ed->v + OPB->_int))->_int;
557                                 break;
558                         }
559                         */
560
561                         default:
562                             PRVM_ERROR("Illegal instruction in %s\n", PRVM_NAME);
563                             goto cleanup;
564                         }
565                 }
566
567 #undef QCVM_PROFILE
568 #undef QCVM_TRACE