irloop: remove get_loop_son, get_loop_node
[libfirm] / ir / ir / irmode.c
1 /*
2  * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Data modes of operations.
23  * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Mathias Heil
24  * @version  $Id$
25  */
26 #include "config.h"
27
28 #include <stdlib.h>
29 #include <string.h>
30 #include <stddef.h>
31 #include <stdbool.h>
32
33 #include "irprog_t.h"
34 #include "irmode_t.h"
35 #include "ident.h"
36 #include "tv_t.h"
37 #include "obst.h"
38 #include "irhooks.h"
39 #include "irtools.h"
40 #include "array.h"
41 #include "error.h"
42 #include "pattern_dmp.h"
43
44 /** Obstack to hold all modes. */
45 static struct obstack modes;
46
47 /** The list of all currently existing modes. */
48 static ir_mode **mode_list;
49
50 const char *get_mode_arithmetic_name(ir_mode_arithmetic ari)
51 {
52 #define X(a)    case a: return #a
53         switch (ari) {
54                 X(irma_uninitialized);
55                 X(irma_none);
56                 X(irma_twos_complement);
57                 X(irma_ieee754);
58                 X(irma_x86_extended_float);
59                 default: return "<unknown>";
60         }
61 #undef X
62 }
63
64 static bool modes_are_equal(const ir_mode *m, const ir_mode *n)
65 {
66         return m->sort         == n->sort &&
67                m->arithmetic   == n->arithmetic &&
68                m->size         == n->size &&
69                m->sign         == n->sign &&
70                m->modulo_shift == n->modulo_shift;
71 }
72
73 /**
74  * searches the modes obstack for the given mode and returns
75  * a pointer on an equal mode already in the array, NULL if
76  * none found
77  */
78 static ir_mode *find_mode(const ir_mode *m)
79 {
80         size_t i, n_modes;
81         for (i = 0, n_modes = ARR_LEN(mode_list); i < n_modes; ++i) {
82                 ir_mode *n = mode_list[i];
83                 if (modes_are_equal(n, m))
84                         return n;
85         }
86         return NULL;
87 }
88
89 /**
90  * sets special values of modes
91  */
92 static void set_mode_values(ir_mode* mode)
93 {
94         switch (get_mode_sort(mode))    {
95         case irms_reference:
96         case irms_int_number:
97         case irms_float_number:
98                 mode->min  = get_tarval_min(mode);
99                 mode->max  = get_tarval_max(mode);
100                 mode->null = get_tarval_null(mode);
101                 mode->one  = get_tarval_one(mode);
102                 mode->minus_one = get_tarval_minus_one(mode);
103                 if (get_mode_sort(mode) != irms_float_number) {
104                         mode->all_one = get_tarval_all_one(mode);
105                 } else {
106                         mode->all_one = tarval_bad;
107                 }
108                 break;
109
110         case irms_internal_boolean:
111                 mode->min  = tarval_b_false;
112                 mode->max  = tarval_b_true;
113                 mode->null = tarval_b_false;
114                 mode->one  = tarval_b_true;
115                 mode->minus_one = tarval_bad;
116                 mode->all_one = tarval_b_true;
117                 break;
118
119         case irms_control_flow:
120         case irms_block:
121         case irms_tuple:
122         case irms_any:
123         case irms_bad:
124         case irms_memory:
125                 mode->min  = tarval_bad;
126                 mode->max  = tarval_bad;
127                 mode->null = tarval_bad;
128                 mode->one  = tarval_bad;
129                 mode->minus_one = tarval_bad;
130                 break;
131         }
132 }
133
134 /* * *
135  * globals defined in irmode.h
136  * * */
137
138 /* --- Predefined modes --- */
139
140 /* FIRM internal modes: */
141 ir_mode *mode_T;
142 ir_mode *mode_X;
143 ir_mode *mode_M;
144 ir_mode *mode_BB;
145 ir_mode *mode_ANY;
146 ir_mode *mode_BAD;
147
148 /* predefined numerical modes: */
149 ir_mode *mode_F;
150 ir_mode *mode_D;
151 ir_mode *mode_Q;
152
153 ir_mode *mode_Bs;   /* integral values, signed and unsigned */
154 ir_mode *mode_Bu;   /* 8 bit */
155 ir_mode *mode_Hs;   /* 16 bit */
156 ir_mode *mode_Hu;
157 ir_mode *mode_Is;   /* 32 bit */
158 ir_mode *mode_Iu;
159 ir_mode *mode_Ls;   /* 64 bit */
160 ir_mode *mode_Lu;
161 ir_mode *mode_LLs;  /* 128 bit */
162 ir_mode *mode_LLu;
163
164 ir_mode *mode_b;
165 ir_mode *mode_P;
166
167 /* machine specific modes */
168 ir_mode *mode_P_code;   /**< machine specific pointer mode for code addresses */
169 ir_mode *mode_P_data;   /**< machine specific pointer mode for data addresses */
170
171 /* * *
172  * functions defined in irmode.h
173  * * */
174
175 ir_mode *get_modeT(void) { return mode_T; }
176 ir_mode *get_modeF(void) { return mode_F; }
177 ir_mode *get_modeD(void) { return mode_D; }
178 ir_mode *get_modeQ(void) { return mode_Q; }
179 ir_mode *get_modeBs(void) { return mode_Bs; }
180 ir_mode *get_modeBu(void) { return mode_Bu; }
181 ir_mode *get_modeHs(void) { return mode_Hs; }
182 ir_mode *get_modeHu(void) { return mode_Hu; }
183 ir_mode *get_modeIs(void) { return mode_Is; }
184 ir_mode *get_modeIu(void) { return mode_Iu; }
185 ir_mode *get_modeLs(void) { return mode_Ls; }
186 ir_mode *get_modeLu(void) { return mode_Lu; }
187 ir_mode *get_modeLLs(void){ return mode_LLs; }
188 ir_mode *get_modeLLu(void){ return mode_LLu; }
189 ir_mode *get_modeb(void) { return mode_b; }
190 ir_mode *get_modeP(void) { return mode_P; }
191 ir_mode *get_modeX(void) { return mode_X; }
192 ir_mode *get_modeM(void) { return mode_M; }
193 ir_mode *get_modeBB(void) { return mode_BB; }
194 ir_mode *get_modeANY(void) { return mode_ANY; }
195 ir_mode *get_modeBAD(void) { return mode_BAD; }
196
197
198 ir_mode *(get_modeP_code)(void)
199 {
200         return get_modeP_code_();
201 }
202
203 ir_mode *(get_modeP_data)(void)
204 {
205         return get_modeP_data_();
206 }
207
208 void set_modeP_code(ir_mode *p)
209 {
210         assert(mode_is_reference(p));
211         mode_P_code = p;
212 }
213
214 void set_modeP_data(ir_mode *p)
215 {
216         assert(mode_is_reference(p));
217         mode_P_data = p;
218         mode_P = p;
219 }
220
221 /*
222  * Creates a new mode.
223  */
224 static ir_mode *alloc_mode(const char *name, ir_mode_sort sort,
225                            ir_mode_arithmetic arithmetic, unsigned bit_size,
226                            int sign, unsigned modulo_shift)
227 {
228         ir_mode *mode_tmpl = OALLOCZ(&modes, ir_mode);
229
230         mode_tmpl->name         = new_id_from_str(name);
231         mode_tmpl->sort         = sort;
232         mode_tmpl->size         = bit_size;
233         mode_tmpl->sign         = sign ? 1 : 0;
234         mode_tmpl->modulo_shift = modulo_shift;
235         mode_tmpl->arithmetic   = arithmetic;
236         mode_tmpl->link         = NULL;
237         mode_tmpl->tv_priv      = NULL;
238         return mode_tmpl;
239 }
240
241 static ir_mode *register_mode(ir_mode *mode)
242 {
243         /* does any of the existing modes have the same properties? */
244         ir_mode *old = find_mode(mode);
245         if (old != NULL) {
246                 /* remove new mode from obstack */
247                 obstack_free(&modes, mode);
248                 return old;
249         }
250
251         mode->kind = k_ir_mode;
252         mode->type = new_type_primitive(mode);
253         ARR_APP1(ir_mode*, mode_list, mode);
254         add_irp_mode(mode);
255         set_mode_values(mode);
256         hook_new_mode(mode);
257         return mode;
258 }
259
260 ir_mode *new_int_mode(const char *name, ir_mode_arithmetic arithmetic,
261                       unsigned bit_size, int sign, unsigned modulo_shift)
262 {
263         ir_mode *result = alloc_mode(name, irms_int_number, arithmetic, bit_size,
264                                      sign, modulo_shift);
265         return register_mode(result);
266 }
267
268 ir_mode *new_reference_mode(const char *name, ir_mode_arithmetic arithmetic,
269                             unsigned bit_size, unsigned modulo_shift)
270 {
271         ir_mode *result = alloc_mode(name, irms_reference, arithmetic, bit_size,
272                                      0, modulo_shift);
273         return register_mode(result);
274 }
275
276 ir_mode *new_float_mode(const char *name, ir_mode_arithmetic arithmetic,
277                         unsigned exponent_size, unsigned mantissa_size)
278 {
279         bool     explicit_one = false;
280         unsigned bit_size     = exponent_size + mantissa_size + 1;
281         ir_mode *result;
282
283         if (arithmetic == irma_x86_extended_float) {
284                 explicit_one = true;
285                 bit_size++;
286         } else if (arithmetic != irma_ieee754) {
287                 panic("Arithmetic %s invalid for float");
288         }
289         if (exponent_size >= 256)
290                 panic("Exponents >= 256 bits not supported");
291         if (mantissa_size >= 256)
292                 panic("Mantissa >= 256 bits not supported");
293
294         result = alloc_mode(name, irms_float_number, irma_ieee754, bit_size, 1, 0);
295         result->float_desc.exponent_size = exponent_size;
296         result->float_desc.mantissa_size = mantissa_size;
297         result->float_desc.explicit_one  = explicit_one;
298         return register_mode(result);
299 }
300
301 /* Functions for the direct access to all attributes of an ir_mode */
302 ident *(get_mode_ident)(const ir_mode *mode)
303 {
304         return get_mode_ident_(mode);
305 }
306
307 const char *get_mode_name(const ir_mode *mode)
308 {
309         return get_id_str(mode->name);
310 }
311
312 unsigned (get_mode_size_bits)(const ir_mode *mode)
313 {
314         return get_mode_size_bits_(mode);
315 }
316
317 unsigned (get_mode_size_bytes)(const ir_mode *mode)
318 {
319         return get_mode_size_bytes_(mode);
320 }
321
322 int (get_mode_sign)(const ir_mode *mode)
323 {
324         return get_mode_sign_(mode);
325 }
326
327 ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode)
328 {
329         return get_mode_arithmetic_(mode);
330 }
331
332
333 /* Attribute modulo shift specifies for modes of kind irms_int_number
334  *  whether shift applies modulo to value of bits to shift.  Asserts
335  *  if mode is not irms_int_number.
336  */
337 unsigned int (get_mode_modulo_shift)(const ir_mode *mode)
338 {
339         return get_mode_modulo_shift_(mode);
340 }
341
342 void *(get_mode_link)(const ir_mode *mode)
343 {
344         return get_mode_link_(mode);
345 }
346
347 void (set_mode_link)(ir_mode *mode, void *l)
348 {
349         set_mode_link_(mode, l);
350 }
351
352 ir_tarval *get_mode_min(ir_mode *mode)
353 {
354         assert(mode);
355         assert(mode_is_data(mode));
356
357         return mode->min;
358 }
359
360 ir_tarval *get_mode_max(ir_mode *mode)
361 {
362         assert(mode);
363         assert(mode_is_data(mode));
364
365         return mode->max;
366 }
367
368 ir_tarval *get_mode_null(ir_mode *mode)
369 {
370         assert(mode);
371         assert(mode_is_datab(mode));
372
373         return mode->null;
374 }
375
376 ir_tarval *get_mode_one(ir_mode *mode)
377 {
378         assert(mode);
379         assert(mode_is_datab(mode));
380
381         return mode->one;
382 }
383
384 ir_tarval *get_mode_minus_one(ir_mode *mode)
385 {
386         assert(mode);
387         assert(mode_is_data(mode));
388
389         return mode->minus_one;
390 }
391
392 ir_tarval *get_mode_all_one(ir_mode *mode)
393 {
394         assert(mode);
395         assert(mode_is_datab(mode));
396         return mode->all_one;
397 }
398
399 ir_tarval *get_mode_infinite(ir_mode *mode)
400 {
401         assert(mode);
402         assert(mode_is_float(mode));
403
404         return get_tarval_plus_inf(mode);
405 }
406
407 ir_tarval *get_mode_NAN(ir_mode *mode)
408 {
409         assert(mode);
410         assert(mode_is_float(mode));
411
412         return get_tarval_nan(mode);
413 }
414
415 int is_mode(const void *thing)
416 {
417         return get_kind(thing) == k_ir_mode;
418 }
419
420 int (mode_is_signed)(const ir_mode *mode)
421 {
422         return mode_is_signed_(mode);
423 }
424
425 int (mode_is_float)(const ir_mode *mode)
426 {
427         return mode_is_float_(mode);
428 }
429
430 int (mode_is_int)(const ir_mode *mode)
431 {
432         return mode_is_int_(mode);
433 }
434
435 int (mode_is_reference)(const ir_mode *mode)
436 {
437         return mode_is_reference_(mode);
438 }
439
440 int (mode_is_num)(const ir_mode *mode)
441 {
442         return mode_is_num_(mode);
443 }
444
445 int (mode_is_data)(const ir_mode *mode)
446 {
447         return mode_is_data_(mode);
448 }
449
450 int (mode_is_datab)(const ir_mode *mode)
451 {
452         return mode_is_datab_(mode);
453 }
454
455 int (mode_is_dataM)(const ir_mode *mode)
456 {
457         return mode_is_dataM_(mode);
458 }
459
460 unsigned (get_mode_mantissa_size)(const ir_mode *mode)
461 {
462         return get_mode_mantissa_size_(mode);
463 }
464
465 unsigned (get_mode_exponent_size)(const ir_mode *mode)
466 {
467         return get_mode_exponent_size_(mode);
468 }
469
470 /* Returns true if sm can be converted to lm without loss. */
471 int smaller_mode(const ir_mode *sm, const ir_mode *lm)
472 {
473         int sm_bits, lm_bits;
474
475         assert(sm);
476         assert(lm);
477
478         if (sm == lm) return 1;
479
480         sm_bits = get_mode_size_bits(sm);
481         lm_bits = get_mode_size_bits(lm);
482
483         switch (get_mode_sort(sm)) {
484         case irms_int_number:
485                 switch (get_mode_sort(lm)) {
486                 case irms_int_number:
487                         if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
488                                 return 0;
489
490                         /* only two complement implemented */
491                         assert(get_mode_arithmetic(sm) == irma_twos_complement);
492
493                         /* integers are convertable if
494                          *   - both have the same sign and lm is the larger one
495                          *   - lm is the signed one and is at least two bits larger
496                          *     (one for the sign, one for the highest bit of sm)
497                          *   - sm & lm are two_complement and lm has greater or equal number of bits
498                          */
499                         if (mode_is_signed(sm)) {
500                                 if (!mode_is_signed(lm))
501                                         return 0;
502                                 return sm_bits <= lm_bits;
503                         } else {
504                                 if (mode_is_signed(lm)) {
505                                         return sm_bits < lm_bits;
506                                 }
507                                 return sm_bits <= lm_bits;
508                         }
509
510                 case irms_float_number:
511                         /* int to float works if the float is large enough */
512                         return 0;
513
514                 default:
515                         break;
516                 }
517                 break;
518
519         case irms_float_number:
520                 if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
521                         if ( (get_mode_sort(lm) == irms_float_number)
522                                 && (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
523                                 return 1;
524                 }
525                 break;
526
527         case irms_reference:
528                 /* do exist machines out there with different pointer lengths ?*/
529                 return 0;
530
531         case irms_internal_boolean:
532                 return mode_is_int(lm);
533
534         default:
535                 break;
536         }
537
538         /* else */
539         return 0;
540 }
541
542 /* Returns true if a value of mode sm can be converted into mode lm
543    and backwards without loss. */
544 int values_in_mode(const ir_mode *sm, const ir_mode *lm)
545 {
546         ir_mode_arithmetic arith;
547
548         assert(sm);
549         assert(lm);
550
551         if (sm == lm) return 1;
552
553         if (sm == mode_b)
554                 return mode_is_int(lm);
555
556         arith = get_mode_arithmetic(sm);
557         if (arith != get_mode_arithmetic(lm))
558                 return 0;
559
560         switch (arith) {
561                 case irma_twos_complement:
562                 case irma_ieee754:
563                         return get_mode_size_bits(sm) <= get_mode_size_bits(lm);
564
565                 default:
566                         return 0;
567         }
568 }
569
570 /* Return the signed integer equivalent mode for an reference mode. */
571 ir_mode *get_reference_mode_signed_eq(ir_mode *mode)
572 {
573         assert(mode_is_reference(mode));
574         return mode->eq_signed;
575 }
576
577 /* Sets the signed integer equivalent mode for an reference mode. */
578 void set_reference_mode_signed_eq(ir_mode *ref_mode, ir_mode *int_mode)
579 {
580         assert(mode_is_reference(ref_mode));
581         assert(mode_is_int(int_mode));
582         ref_mode->eq_signed = int_mode;
583 }
584
585 /* Return the unsigned integer equivalent mode for an reference mode. */
586 ir_mode *get_reference_mode_unsigned_eq(ir_mode *mode)
587 {
588         assert(mode_is_reference(mode));
589         return mode->eq_unsigned;
590 }
591
592 /* Sets the unsigned integer equivalent mode for an reference mode. */
593 void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode)
594 {
595         assert(mode_is_reference(ref_mode));
596         assert(mode_is_int(int_mode));
597         ref_mode->eq_unsigned = int_mode;
598 }
599
600 static ir_mode *new_internal_mode(const char *name, ir_mode_sort sort)
601 {
602         ir_mode *mode = alloc_mode(name, sort, irma_none, 0, 0, 0);
603         return register_mode(mode);
604 }
605
606 /* initialization, build the default modes */
607 void init_mode(void)
608 {
609         obstack_init(&modes);
610         mode_list = NEW_ARR_F(ir_mode*, 0);
611
612         /* initialize predefined modes */
613         mode_BB  = new_internal_mode("BB",  irms_block);
614         mode_X   = new_internal_mode("X",   irms_control_flow);
615         mode_M   = new_internal_mode("M",   irms_memory);
616         mode_T   = new_internal_mode("T",   irms_tuple);
617         mode_ANY = new_internal_mode("ANY", irms_any);
618         mode_BAD = new_internal_mode("BAD", irms_bad);
619         mode_b   = new_internal_mode("b",   irms_internal_boolean);
620
621         mode_F   = new_float_mode("F", irma_ieee754,  8, 23);
622         mode_D   = new_float_mode("D", irma_ieee754, 11, 52);
623         mode_Q   = new_float_mode("Q", irma_ieee754, 15, 112);
624
625         mode_Bs  = new_int_mode("Bs",  irma_twos_complement, 8,   1, 32);
626         mode_Bu  = new_int_mode("Bu",  irma_twos_complement, 8,   0, 32);
627         mode_Hs  = new_int_mode("Hs",  irma_twos_complement, 16,  1, 32);
628         mode_Hu  = new_int_mode("Hu",  irma_twos_complement, 16,  0, 32);
629         mode_Is  = new_int_mode("Is",  irma_twos_complement, 32,  1, 32);
630         mode_Iu  = new_int_mode("Iu",  irma_twos_complement, 32,  0, 32);
631         mode_Ls  = new_int_mode("Ls",  irma_twos_complement, 64,  1, 64);
632         mode_Lu  = new_int_mode("Lu",  irma_twos_complement, 64,  0, 64);
633         mode_LLs = new_int_mode("LLs", irma_twos_complement, 128, 1, 128);
634         mode_LLu = new_int_mode("LLu", irma_twos_complement, 128, 0, 128);
635
636         mode_P   = new_reference_mode("P", irma_twos_complement, 32, 32);
637         set_reference_mode_signed_eq(mode_P, mode_Is);
638         set_reference_mode_unsigned_eq(mode_P, mode_Iu);
639
640         /* set the machine specific modes to the predefined ones */
641         mode_P_code = mode_P;
642         mode_P_data = mode_P;
643 }
644
645 /* find a signed mode for an unsigned integer mode */
646 ir_mode *find_unsigned_mode(const ir_mode *mode)
647 {
648         ir_mode n = *mode;
649
650         /* allowed for reference mode */
651         if (mode->sort == irms_reference)
652                 n.sort = irms_int_number;
653
654         assert(n.sort == irms_int_number);
655         n.sign = 0;
656         return find_mode(&n);
657 }
658
659 /* find an unsigned mode for a signed integer mode */
660 ir_mode *find_signed_mode(const ir_mode *mode)
661 {
662         ir_mode n = *mode;
663
664         assert(mode->sort == irms_int_number);
665         n.sign = 1;
666         return find_mode(&n);
667 }
668
669 /* finds a integer mode with 2*n bits for an integer mode with n bits. */
670 ir_mode *find_double_bits_int_mode(const ir_mode *mode)
671 {
672         ir_mode n = *mode;
673
674         assert(mode->sort == irms_int_number && mode->arithmetic == irma_twos_complement);
675
676         n.size = 2*mode->size;
677         return find_mode(&n);
678 }
679
680 /*
681  * Returns non-zero if the given mode honors signed zero's, i.e.,
682  * a +0 and a -0 exists and handled differently.
683  */
684 int mode_honor_signed_zeros(const ir_mode *mode)
685 {
686         /* for floating point, we know that IEEE 754 has +0 and -0,
687          * but always handles it identical.
688          */
689         return
690                 mode->sort == irms_float_number &&
691                 mode->arithmetic != irma_ieee754;
692 }
693
694 /*
695  * Returns non-zero if the given mode might overflow on unary Minus.
696  *
697  * This does NOT happen on IEEE 754.
698  */
699 int mode_overflow_on_unary_Minus(const ir_mode *mode)
700 {
701         if (mode->sort == irms_float_number)
702                 return mode->arithmetic == irma_ieee754 ? 0 : 1;
703         return 1;
704 }
705
706 /*
707  * Returns non-zero if the mode has a reversed wrap-around
708  * logic, especially (a + x) - x == a.
709  *
710  * This is normally true for integer modes, not for floating
711  * point modes.
712  */
713 int mode_wrap_around(const ir_mode *mode)
714 {
715         /* FIXME: better would be an extra mode property */
716         return mode_is_int(mode);
717 }
718
719 /*
720  * Returns non-zero if the cast from mode src to mode dst is a
721  * reinterpret cast (ie. only the bit pattern is reinterpreted,
722  * no conversion is done)
723  */
724 int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst)
725 {
726         ir_mode_arithmetic ma;
727
728         if (src == dst)
729                 return 1;
730         if (get_mode_size_bits(src) != get_mode_size_bits(dst))
731                 return 0;
732         ma = get_mode_arithmetic(src);
733         if (ma != get_mode_arithmetic(dst))
734                 return 0;
735
736         return ma == irma_twos_complement;
737 }
738
739 ir_type *(get_type_for_mode) (const ir_mode *mode)
740 {
741         return get_type_for_mode_(mode);
742 }
743
744 void finish_mode(void)
745 {
746         obstack_free(&modes, 0);
747         DEL_ARR_F(mode_list);
748
749         mode_T   = NULL;
750         mode_X   = NULL;
751         mode_M   = NULL;
752         mode_BB  = NULL;
753         mode_ANY = NULL;
754         mode_BAD = NULL;
755
756         mode_F   = NULL;
757         mode_D   = NULL;
758
759         mode_Bs  = NULL;
760         mode_Bu  = NULL;
761         mode_Hs  = NULL;
762         mode_Hu  = NULL;
763         mode_Is  = NULL;
764         mode_Iu  = NULL;
765         mode_Ls  = NULL;
766         mode_Lu  = NULL;
767
768         mode_b   = NULL;
769
770         mode_P      = NULL;
771         mode_P_code = NULL;
772         mode_P_data = NULL;
773 }