- fixed iterator handling
[libfirm] / ir / ir / irmode.c
1 /*
2  * Copyright (C) 1995-2008 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 #ifdef HAVE_STDLIB_H
29 # include <stdlib.h>
30 #endif
31 #ifdef HAVE_STRING_H
32 # include <string.h>
33 #endif
34
35 # include <stddef.h>
36
37 # include "irprog_t.h"
38 # include "irmode_t.h"
39 # include "ident.h"
40 # include "tv_t.h"
41 # include "obst.h"
42 # include "irhooks.h"
43 # include "irtools.h"
44 # include "array.h"
45
46 /** Obstack to hold all modes. */
47 static struct obstack modes;
48
49 /** Number of defined modes. */
50 static int num_modes = 0;
51
52 /** The list of all currently existing modes. */
53 static ir_mode **mode_list;
54
55 /**
56  * Compare modes that don't need to have their code field
57  * correctly set
58  *
59  * TODO: Add other fields
60  **/
61 static INLINE int modes_are_equal(const ir_mode *m, const ir_mode *n) {
62         if (m == n) return 1;
63         if (m->sort         == n->sort &&
64                 m->arithmetic   == n->arithmetic &&
65                 m->size         == n->size &&
66                 m->sign         == n->sign  &&
67                 m->modulo_shift == n->modulo_shift &&
68                 m->vector_elem  == n->vector_elem)
69                 return 1;
70
71         return 0;
72 }
73
74 /**
75  * searches the modes obstack for the given mode and returns
76  * a pointer on an equal mode already in the array, NULL if
77  * none found
78  */
79 static ir_mode *find_mode(const ir_mode *m) {
80         int i;
81         for (i = ARR_LEN(mode_list) - 1; i >= 0; --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 #ifdef FIRM_STATISTICS
90 /* return the mode index, only needed for statistics */
91 int stat_find_mode_index(const ir_mode *m) {
92         int i;
93         for (i = ARR_LEN(mode_list) - 1; i >= 0; --i) {
94                 ir_mode *n = mode_list[i];
95                 if (modes_are_equal(n, m))
96                         return i;
97         }
98         return -1;
99 }
100
101 /* return the mode for a given index, only needed for statistics */
102 ir_mode *stat_mode_for_index(int idx) {
103         if (0 <= idx  && idx < ARR_LEN(mode_list))
104                 return mode_list[idx];
105         return NULL;
106 }
107 #endif
108
109 /**
110  * sets special values of modes
111  */
112 static void set_mode_values(ir_mode* mode) {
113         switch (get_mode_sort(mode))    {
114         case irms_reference:
115         case irms_int_number:
116         case irms_float_number:
117                 mode->min  = get_tarval_min(mode);
118                 mode->max  = get_tarval_max(mode);
119                 mode->null = get_tarval_null(mode);
120                 mode->one  = get_tarval_one(mode);
121                 mode->minus_one = get_tarval_minus_one(mode);
122                 if(get_mode_sort(mode) != irms_float_number) {
123                         mode->all_one = get_tarval_all_one(mode);
124                 } else {
125                         mode->all_one = tarval_bad;
126                 }
127                 break;
128
129         case irms_internal_boolean:
130                 mode->min  = tarval_b_false;
131                 mode->max  = tarval_b_true;
132                 mode->null = tarval_b_false;
133                 mode->one  = tarval_b_true;
134                 mode->minus_one = tarval_bad;
135                 mode->all_one = tarval_b_true;
136                 break;
137
138         case irms_auxiliary:
139         case irms_memory:
140         case irms_control_flow:
141                 mode->min  = tarval_bad;
142                 mode->max  = tarval_bad;
143                 mode->null = tarval_bad;
144                 mode->one  = tarval_bad;
145                 mode->minus_one = tarval_bad;
146                 break;
147         }
148 }
149
150 /* * *
151  * globals defined in irmode.h
152  * * */
153
154 /* --- Predefined modes --- */
155
156 /* FIRM internal modes: */
157 ir_mode *mode_T;
158 ir_mode *mode_X;
159 ir_mode *mode_M;
160 ir_mode *mode_BB;
161 ir_mode *mode_ANY;
162 ir_mode *mode_BAD;
163
164 /* predefined numerical modes: */
165 ir_mode *mode_F;    /* float */
166 ir_mode *mode_D;    /* double */
167 ir_mode *mode_E;    /* long double */
168
169 ir_mode *mode_Bs;   /* integral values, signed and unsigned */
170 ir_mode *mode_Bu;   /* 8 bit */
171 ir_mode *mode_Hs;   /* 16 bit */
172 ir_mode *mode_Hu;
173 ir_mode *mode_Is;   /* 32 bit */
174 ir_mode *mode_Iu;
175 ir_mode *mode_Ls;   /* 64 bit */
176 ir_mode *mode_Lu;
177 ir_mode *mode_LLs;  /* 128 bit */
178 ir_mode *mode_LLu;
179
180 ir_mode *mode_b;
181 ir_mode *mode_P;
182
183 /* machine specific modes */
184 ir_mode *mode_P_code;   /**< machine specific pointer mode for code addresses */
185 ir_mode *mode_P_data;   /**< machine specific pointer mode for data addresses */
186
187 /* * *
188  * functions defined in irmode.h
189  * * */
190
191 /* JNI access functions */
192 ir_mode *get_modeT(void) { return mode_T; }
193 ir_mode *get_modeF(void) { return mode_F; }
194 ir_mode *get_modeD(void) { return mode_D; }
195 ir_mode *get_modeE(void) { return mode_E; }
196 ir_mode *get_modeBs(void) { return mode_Bs; }
197 ir_mode *get_modeBu(void) { return mode_Bu; }
198 ir_mode *get_modeHs(void) { return mode_Hs; }
199 ir_mode *get_modeHu(void) { return mode_Hu; }
200 ir_mode *get_modeIs(void) { return mode_Is; }
201 ir_mode *get_modeIu(void) { return mode_Iu; }
202 ir_mode *get_modeLs(void) { return mode_Ls; }
203 ir_mode *get_modeLu(void) { return mode_Lu; }
204 ir_mode *get_modeLLs(void){ return mode_LLs; }
205 ir_mode *get_modeLLu(void){ return mode_LLu; }
206 ir_mode *get_modeb(void) { return mode_b; }
207 ir_mode *get_modeP(void) { return mode_P; }
208 ir_mode *get_modeX(void) { return mode_X; }
209 ir_mode *get_modeM(void) { return mode_M; }
210 ir_mode *get_modeBB(void) { return mode_BB; }
211 ir_mode *get_modeANY(void) { return mode_ANY; }
212 ir_mode *get_modeBAD(void) { return mode_BAD; }
213
214
215 ir_mode *(get_modeP_code)(void) {
216         return _get_modeP_code();
217 }
218
219 ir_mode *(get_modeP_data)(void) {
220         return _get_modeP_data();
221 }
222
223 void set_modeP_code(ir_mode *p) {
224         assert(mode_is_reference(p));
225         mode_P_code = p;
226 }
227
228 void set_modeP_data(ir_mode *p) {
229         assert(mode_is_reference(p));
230         mode_P_data = p;
231 }
232
233 /**
234  * Registers a new mode.
235  *
236  * @param new_mode  The new mode template.
237  */
238 static ir_mode *register_mode(const ir_mode *new_mode) {
239         ir_mode *mode = NULL;
240
241         assert(new_mode);
242
243         /* copy mode struct to modes array */
244         mode = (ir_mode *)obstack_copy(&modes, new_mode, sizeof(*mode));
245         ARR_APP1(ir_mode*, mode_list, mode);
246
247         mode->kind = k_ir_mode;
248         if (num_modes >= irm_max)  {
249                 mode->code = num_modes;
250         }
251         num_modes++;
252
253         /* add the new mode to the irp list of modes */
254         add_irp_mode(mode);
255
256         set_mode_values(mode);
257
258         hook_new_mode(new_mode, mode);
259         return mode;
260 }
261
262 /*
263  * Creates a new mode.
264  */
265 ir_mode *new_ir_mode(const char *name, ir_mode_sort sort, int bit_size, int sign,
266                      ir_mode_arithmetic arithmetic, unsigned int modulo_shift)
267 {
268         ir_mode mode_tmpl;
269         ir_mode *mode = NULL;
270
271         mode_tmpl.name         = new_id_from_str(name);
272         mode_tmpl.sort         = sort;
273         mode_tmpl.size         = bit_size;
274         mode_tmpl.sign         = sign ? 1 : 0;
275         mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
276         mode_tmpl.vector_elem  = 1;
277         mode_tmpl.arithmetic   = arithmetic;
278         mode_tmpl.link         = NULL;
279         mode_tmpl.tv_priv      = NULL;
280
281         mode = find_mode(&mode_tmpl);
282         if (mode) {
283                 hook_new_mode(&mode_tmpl, mode);
284                 return mode;
285         }
286
287         /* sanity checks */
288         switch (sort) {
289         case irms_auxiliary:
290         case irms_control_flow:
291         case irms_memory:
292         case irms_internal_boolean:
293                 assert(0 && "internal modes cannot be user defined");
294                 break;
295
296         case irms_float_number:
297         case irms_int_number:
298         case irms_reference:
299                 mode = register_mode(&mode_tmpl);
300         }
301         return mode;
302 }
303
304 /*
305  * Creates a new vector mode.
306  */
307 ir_mode *new_ir_vector_mode(const char *name, ir_mode_sort sort, int bit_size, unsigned num_of_elem, int sign,
308                             ir_mode_arithmetic arithmetic, unsigned int modulo_shift)
309 {
310         ir_mode mode_tmpl;
311         ir_mode *mode = NULL;
312
313         mode_tmpl.name         = new_id_from_str(name);
314         mode_tmpl.sort         = sort;
315         mode_tmpl.size         = bit_size * num_of_elem;
316         mode_tmpl.sign         = sign ? 1 : 0;
317         mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
318         mode_tmpl.vector_elem  = num_of_elem;
319         mode_tmpl.arithmetic   = arithmetic;
320         mode_tmpl.link         = NULL;
321         mode_tmpl.tv_priv      = NULL;
322
323         mode = find_mode(&mode_tmpl);
324         if (mode) {
325                 hook_new_mode(&mode_tmpl, mode);
326                 return mode;
327         }
328
329         if (num_of_elem <= 1) {
330                 assert(0 && "vector modes should have at least 2 elements");
331                 return NULL;
332         }
333
334         /* sanity checks */
335         switch (sort) {
336         case irms_auxiliary:
337         case irms_control_flow:
338         case irms_memory:
339         case irms_internal_boolean:
340                 assert(0 && "internal modes cannot be user defined");
341                 break;
342
343         case irms_reference:
344                 assert(0 && "only integer and floating point modes can be vectorized");
345                 break;
346
347         case irms_float_number:
348                 assert(0 && "not yet implemented");
349                 break;
350
351         case irms_int_number:
352                 mode = register_mode(&mode_tmpl);
353         }
354         return mode;
355 }
356
357 /* Functions for the direct access to all attributes of an ir_mode */
358 ir_modecode (get_mode_modecode)(const ir_mode *mode) {
359         return _get_mode_modecode(mode);
360 }
361
362 ident *(get_mode_ident)(const ir_mode *mode) {
363         return _get_mode_ident(mode);
364 }
365
366 const char *get_mode_name(const ir_mode *mode) {
367         return get_id_str(mode->name);
368 }
369
370 ir_mode_sort (get_mode_sort)(const ir_mode* mode) {
371         return _get_mode_sort(mode);
372 }
373
374 unsigned (get_mode_size_bits)(const ir_mode *mode) {
375         return _get_mode_size_bits(mode);
376 }
377
378 unsigned (get_mode_size_bytes)(const ir_mode *mode) {
379         return _get_mode_size_bytes(mode);
380 }
381
382 int (get_mode_sign)(const ir_mode *mode) {
383         return _get_mode_sign(mode);
384 }
385
386 ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) {
387         return get_mode_arithmetic(mode);
388 }
389
390
391 /* Attribute modulo shift specifies for modes of kind irms_int_number
392  *  whether shift applies modulo to value of bits to shift.  Asserts
393  *  if mode is not irms_int_number.
394  */
395 unsigned int (get_mode_modulo_shift)(const ir_mode *mode) {
396         return _get_mode_modulo_shift(mode);
397 }
398
399 unsigned int (get_mode_n_vector_elems)(const ir_mode *mode) {
400         return _get_mode_vector_elems(mode);
401 }
402
403 void *(get_mode_link)(const ir_mode *mode) {
404         return _get_mode_link(mode);
405 }
406
407 void (set_mode_link)(ir_mode *mode, void *l) {
408         _set_mode_link(mode, l);
409 }
410
411 tarval *get_mode_min(ir_mode *mode) {
412         assert(mode);
413         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
414         assert(mode_is_data(mode));
415
416         return mode->min;
417 }
418
419 tarval *get_mode_max(ir_mode *mode) {
420         assert(mode);
421         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
422         assert(mode_is_data(mode));
423
424         return mode->max;
425 }
426
427 tarval *get_mode_null(ir_mode *mode) {
428         assert(mode);
429         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
430         assert(mode_is_datab(mode));
431
432         return mode->null;
433 }
434
435 tarval *get_mode_one(ir_mode *mode) {
436         assert(mode);
437         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
438         assert(mode_is_datab(mode));
439
440         return mode->one;
441 }
442
443 tarval *get_mode_minus_one(ir_mode *mode) {
444         assert(mode);
445         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
446         assert(mode_is_data(mode));
447
448         return mode->minus_one;
449 }
450
451 tarval *get_mode_all_one(ir_mode *mode) {
452         assert(mode);
453         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
454         assert(mode_is_datab(mode));
455         return mode->all_one;
456 }
457
458 tarval *get_mode_infinite(ir_mode *mode) {
459         assert(mode);
460         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
461         assert(mode_is_float(mode));
462
463         return get_tarval_plus_inf(mode);
464 }
465
466 tarval *get_mode_NAN(ir_mode *mode) {
467         assert(mode);
468         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
469         assert(mode_is_float(mode));
470
471         return get_tarval_nan(mode);
472 }
473
474 int is_mode(void *thing) {
475         if (get_kind(thing) == k_ir_mode)
476                 return 1;
477         else
478                 return 0;
479 }
480
481 int (mode_is_signed)(const ir_mode *mode) {
482         return _mode_is_signed(mode);
483 }
484
485 int (mode_is_float)(const ir_mode *mode) {
486         return _mode_is_float(mode);
487 }
488
489 int (mode_is_int)(const ir_mode *mode) {
490         return _mode_is_int(mode);
491 }
492
493 int (mode_is_reference)(const ir_mode *mode) {
494         return _mode_is_reference(mode);
495 }
496
497 int (mode_is_num)(const ir_mode *mode) {
498         return _mode_is_num(mode);
499 }
500
501 int (mode_is_data)(const ir_mode *mode) {
502         return _mode_is_data(mode);
503 }
504
505 int (mode_is_datab)(const ir_mode *mode) {
506         return _mode_is_datab(mode);
507 }
508
509 int (mode_is_dataM)(const ir_mode *mode) {
510         return _mode_is_dataM(mode);
511 }
512
513 int (mode_is_float_vector)(const ir_mode *mode) {
514         return _mode_is_float_vector(mode);
515 }
516
517 int (mode_is_int_vector)(const ir_mode *mode) {
518         return _mode_is_int_vector(mode);
519 }
520
521 /* Returns true if sm can be converted to lm without loss. */
522 int smaller_mode(const ir_mode *sm, const ir_mode *lm) {
523         int sm_bits, lm_bits;
524
525         assert(sm);
526         assert(lm);
527
528         if (sm == lm) return 1;
529
530         sm_bits = get_mode_size_bits(sm);
531         lm_bits = get_mode_size_bits(lm);
532
533         switch (get_mode_sort(sm)) {
534         case irms_int_number:
535                 switch (get_mode_sort(lm)) {
536                 case irms_int_number:
537                         if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
538                                 return 0;
539
540                         /* only two complement implemented */
541                         assert(get_mode_arithmetic(sm) == irma_twos_complement);
542
543                         /* integers are convertable if
544                          *   - both have the same sign and lm is the larger one
545                          *   - lm is the signed one and is at least two bits larger
546                          *     (one for the sign, one for the highest bit of sm)
547                          *   - sm & lm are two_complement and lm has greater or equal number of bits
548                          */
549                         if (mode_is_signed(sm)) {
550                                 if (!mode_is_signed(lm))
551                                         return 0;
552                                 return sm_bits <= lm_bits;
553                         } else {
554                                 if (mode_is_signed(lm)) {
555                                         return sm_bits < lm_bits;
556                                 }
557                                 return sm_bits <= lm_bits;
558                         }
559                         break;
560
561                 case irms_float_number:
562                         /* int to float works if the float is large enough */
563                         return 0;
564
565                 default:
566                         break;
567                 }
568                 break;
569
570         case irms_float_number:
571                 if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
572                         if ( (get_mode_sort(lm) == irms_float_number)
573                                 && (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
574                                 return 1;
575                 }
576                 break;
577
578         case irms_reference:
579                 /* do exist machines out there with different pointer lenghts ?*/
580                 return 0;
581
582         case irms_internal_boolean:
583                 return mode_is_int(lm);
584
585         default:
586                 break;
587         }
588
589         /* else */
590         return 0;
591 }
592
593 /* Returns true if a value of mode sm can be converted into mode lm
594    and backwards without loss. */
595 int values_in_mode(const ir_mode *sm, const ir_mode *lm) {
596         int sm_bits, lm_bits;
597         ir_mode_arithmetic arith;
598
599         assert(sm);
600         assert(lm);
601
602         if (sm == lm) return 1;
603
604         if (sm == mode_b)
605                 return mode_is_int(lm);
606
607         sm_bits = get_mode_size_bits(sm);
608         lm_bits = get_mode_size_bits(lm);
609
610         arith = get_mode_arithmetic(sm);
611         if (arith != get_mode_arithmetic(lm))
612                 return 0;
613
614         switch (arith) {
615                 case irma_twos_complement:
616                 case irma_ieee754:
617                         return get_mode_size_bits(sm) <= get_mode_size_bits(lm);
618
619                 default:
620                         return 0;
621         }
622 }
623
624 /* Return the signed integer equivalent mode for an reference mode. */
625 ir_mode *get_reference_mode_signed_eq(ir_mode *mode) {
626         assert(mode_is_reference(mode));
627         return mode->eq_signed;
628 }
629
630 /* Sets the signed integer equivalent mode for an reference mode. */
631 void set_reference_mode_signed_eq(ir_mode *ref_mode, ir_mode *int_mode) {
632         assert(mode_is_reference(ref_mode));
633         assert(mode_is_int(int_mode));
634         ref_mode->eq_signed = int_mode;
635 }
636
637 /* Return the unsigned integer equivalent mode for an reference mode. */
638 ir_mode *get_reference_mode_unsigned_eq(ir_mode *mode) {
639         assert(mode_is_reference(mode));
640         return mode->eq_unsigned;
641 }
642
643 /* Sets the unsigned integer equivalent mode for an reference mode. */
644 void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode) {
645         assert(mode_is_reference(ref_mode));
646         assert(mode_is_int(int_mode));
647         ref_mode->eq_unsigned = int_mode;
648 }
649
650 /* initialization, build the default modes */
651 void init_mode(void) {
652         ir_mode newmode;
653
654         obstack_init(&modes);
655         mode_list = NEW_ARR_F(ir_mode*, 0);
656
657         num_modes  =  0;
658         /* initialize predefined modes */
659
660         /* Internal Modes */
661         newmode.arithmetic   = irma_none;
662         newmode.size         = 0;
663         newmode.sign         = 0;
664         newmode.modulo_shift = 0;
665         newmode.vector_elem  = 0;
666         newmode.eq_signed    = NULL;
667         newmode.eq_unsigned  = NULL;
668         newmode.link         = NULL;
669         newmode.tv_priv      = NULL;
670
671         /* Control Flow Modes*/
672         newmode.sort    = irms_control_flow;
673
674         /* Basic Block */
675         newmode.name    = new_id_from_chars("BB", 2);
676         newmode.code    = irm_BB;
677
678         mode_BB = register_mode(&newmode);
679
680         /* eXecution */
681         newmode.name    = new_id_from_chars("X", 1);
682         newmode.code    = irm_X;
683
684         mode_X = register_mode(&newmode);
685
686         /* Memory Modes */
687         newmode.sort    = irms_memory;
688
689         /* Memory */
690         newmode.name    = new_id_from_chars("M", 1);
691         newmode.code    = irm_M;
692
693         mode_M = register_mode(&newmode);
694
695         /* Auxiliary Modes */
696         newmode.sort    = irms_auxiliary,
697
698         /* Tuple */
699         newmode.name    = new_id_from_chars("T", 1);
700         newmode.code    = irm_T;
701
702         mode_T = register_mode(&newmode);
703
704         /* ANY */
705         newmode.name    = new_id_from_chars("ANY", 3);
706         newmode.code    = irm_ANY;
707
708         mode_ANY = register_mode(&newmode);
709
710         /* BAD */
711         newmode.name    = new_id_from_chars("BAD", 3);
712         newmode.code    = irm_BAD;
713
714         mode_BAD = register_mode(&newmode);
715
716         /* Internal Boolean Modes */
717         newmode.sort    = irms_internal_boolean;
718
719         /* boolean */
720         newmode.name    = new_id_from_chars("b", 1);
721         newmode.code    = irm_b;
722
723         mode_b = register_mode(&newmode);
724
725         /* Data Modes */
726         newmode.vector_elem = 1;
727
728         /* Float Number Modes */
729         newmode.sort       = irms_float_number;
730         newmode.arithmetic = irma_ieee754;
731
732         /* float */
733         newmode.name    = new_id_from_chars("F", 1);
734         newmode.code    = irm_F;
735         newmode.sign    = 1;
736         newmode.size    = 32;
737
738         mode_F = register_mode(&newmode);
739
740         /* double */
741         newmode.name    = new_id_from_chars("D", 1);
742         newmode.code    = irm_D;
743         newmode.sign    = 1;
744         newmode.size    = 64;
745
746         mode_D = register_mode(&newmode);
747
748         /* extended */
749         newmode.name    = new_id_from_chars("E", 1);
750         newmode.code    = irm_E;
751         newmode.sign    = 1;
752         newmode.size    = 80;
753
754         mode_E = register_mode(&newmode);
755
756         /* Integer Number Modes */
757         newmode.sort         = irms_int_number;
758         newmode.arithmetic   = irma_twos_complement;
759
760         /* signed byte */
761         newmode.name         = new_id_from_chars("Bs", 2);
762         newmode.code         = irm_Bs;
763         newmode.sign         = 1;
764         newmode.size         = 8;
765         newmode.modulo_shift = 32;
766
767         mode_Bs = register_mode(&newmode);
768
769         /* unsigned byte */
770         newmode.name         = new_id_from_chars("Bu", 2);
771         newmode.code         = irm_Bu;
772         newmode.arithmetic   = irma_twos_complement;
773         newmode.sign         = 0;
774         newmode.size         = 8;
775         newmode.modulo_shift = 32;
776
777         mode_Bu = register_mode(&newmode);
778
779         /* signed short integer */
780         newmode.name         = new_id_from_chars("Hs", 2);
781         newmode.code         = irm_Hs;
782         newmode.sign         = 1;
783         newmode.size         = 16;
784         newmode.modulo_shift = 32;
785
786         mode_Hs = register_mode(&newmode);
787
788         /* unsigned short integer */
789         newmode.name         = new_id_from_chars("Hu", 2);
790         newmode.code         = irm_Hu;
791         newmode.sign         = 0;
792         newmode.size         = 16;
793         newmode.modulo_shift = 32;
794
795         mode_Hu = register_mode(&newmode);
796
797         /* signed integer */
798         newmode.name         = new_id_from_chars("Is", 2);
799         newmode.code         = irm_Is;
800         newmode.sign         = 1;
801         newmode.size         = 32;
802         newmode.modulo_shift = 32;
803
804         mode_Is = register_mode(&newmode);
805
806         /* unsigned integer */
807         newmode.name         = new_id_from_chars("Iu", 2);
808         newmode.code         = irm_Iu;
809         newmode.sign         = 0;
810         newmode.size         = 32;
811         newmode.modulo_shift = 32;
812
813         mode_Iu = register_mode(&newmode);
814
815         /* signed long integer */
816         newmode.name         = new_id_from_chars("Ls", 2);
817         newmode.code         = irm_Ls;
818         newmode.sign         = 1;
819         newmode.size         = 64;
820         newmode.modulo_shift = 64;
821
822         mode_Ls = register_mode(&newmode);
823
824         /* unsigned long integer */
825         newmode.name         = new_id_from_chars("Lu", 2);
826         newmode.code         = irm_Lu;
827         newmode.sign         = 0;
828         newmode.size         = 64;
829         newmode.modulo_shift = 64;
830
831         mode_Lu = register_mode(&newmode);
832
833         /* signed long long integer */
834         newmode.name         = new_id_from_chars("LLs", 3);
835         newmode.code         = irm_LLs;
836         newmode.sign         = 1;
837         newmode.size         = 128;
838         newmode.modulo_shift = 128;
839
840         mode_LLs = register_mode(&newmode);
841
842         /* unsigned long long integer */
843         newmode.name         = new_id_from_chars("LLu", 3);
844         newmode.code         = irm_LLu;
845         newmode.sign         = 0;
846         newmode.size         = 128;
847         newmode.modulo_shift = 128;
848
849         mode_LLu = register_mode(&newmode);
850
851         /* Reference Mode */
852         newmode.sort       = irms_reference;
853         newmode.arithmetic = irma_twos_complement;
854
855         /* pointer */
856         newmode.name         = new_id_from_chars("P", 1);
857         newmode.code         = irm_P;
858         newmode.sign         = 0;
859         newmode.size         = 32;
860         newmode.modulo_shift = 0;
861         newmode.eq_signed    = mode_Is;
862         newmode.eq_unsigned  = mode_Iu;
863
864         mode_P = register_mode(&newmode);
865
866         /* set the machine specific modes to the predefined ones */
867         mode_P_code = mode_P;
868         mode_P_data = mode_P;
869 }
870
871 /* find a signed mode for an unsigned integer mode */
872 ir_mode *find_unsigned_mode(const ir_mode *mode) {
873         ir_mode n = *mode;
874
875         /* allowed for reference mode */
876         if (mode->sort == irms_reference)
877                 n.sort = irms_int_number;
878
879         assert(n.sort == irms_int_number);
880         n.sign = 0;
881         return find_mode(&n);
882 }
883
884 /* find an unsigned mode for a signed integer mode */
885 ir_mode *find_signed_mode(const ir_mode *mode) {
886         ir_mode n = *mode;
887
888         assert(mode->sort == irms_int_number);
889         n.sign = 1;
890         return find_mode(&n);
891 }
892
893 /* finds a integer mode with 2*n bits for an integer mode with n bits. */
894 ir_mode *find_double_bits_int_mode(const ir_mode *mode) {
895         ir_mode n = *mode;
896
897         assert(mode->sort == irms_int_number && mode->arithmetic == irma_twos_complement);
898
899         n.size = 2*mode->size;
900         return find_mode(&n);
901 }
902
903 /*
904  * Returns non-zero if the given mode honors signed zero's, i.e.,
905  * a +0 and a -0 exists and handled differently.
906  */
907 int mode_honor_signed_zeros(const ir_mode *mode) {
908         /* for floating point, we know that IEEE 754 has +0 and -0,
909          * but always handles it identical.
910          */
911         return
912                 mode->sort == irms_float_number &&
913                 mode->arithmetic != irma_ieee754;
914 }
915
916 /*
917  * Returns non-zero if the given mode might overflow on unary Minus.
918  *
919  * This does NOT happen on IEEE 754.
920  */
921 int mode_overflow_on_unary_Minus(const ir_mode *mode) {
922         if (mode->sort == irms_float_number)
923                 return mode->arithmetic == irma_ieee754 ? 0 : 1;
924         return 1;
925 }
926
927 /*
928  * Returns non-zero if the mode has a reversed wrap-around
929  * logic, especially (a + x) - x == a.
930  *
931  * This is normally true for integer modes, not for floating
932  * point modes.
933  */
934 int mode_wrap_around(const ir_mode *mode) {
935         /* FIXME: better would be an extra mode property */
936         return mode_is_int(mode);
937 }
938
939 /*
940  * Returns non-zero if the cast from mode src to mode dst is a
941  * reinterpret cast (ie. only the bit pattern is reinterpreted,
942  * no conversion is done)
943  */
944 int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst) {
945         ir_mode_arithmetic ma;
946
947         if (src == dst)
948                 return 1;
949         if (get_mode_size_bits(src) != get_mode_size_bits(dst))
950                 return 0;
951         ma = get_mode_arithmetic(src);
952         if (ma != get_mode_arithmetic(dst))
953                 return 0;
954
955         return ma == irma_twos_complement || ma == irma_ones_complement;
956 }
957
958 void finish_mode(void) {
959         obstack_free(&modes, 0);
960         DEL_ARR_F(mode_list);
961
962         mode_T   = NULL;
963         mode_X   = NULL;
964         mode_M   = NULL;
965         mode_BB  = NULL;
966         mode_ANY = NULL;
967         mode_BAD = NULL;
968
969         mode_F   = NULL;
970         mode_D   = NULL;
971         mode_E   = NULL;
972
973         mode_Bs  = NULL;
974         mode_Bu  = NULL;
975         mode_Hs  = NULL;
976         mode_Hu  = NULL;
977         mode_Is  = NULL;
978         mode_Iu  = NULL;
979         mode_Ls  = NULL;
980         mode_Lu  = NULL;
981
982         mode_b   = NULL;
983
984         mode_P      = NULL;
985         mode_P_code = NULL;
986         mode_P_data = NULL;
987 }