add some asserts/switch to panics
[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                 panic("internal modes cannot be user defined");
294
295         case irms_float_number:
296         case irms_int_number:
297         case irms_reference:
298                 mode = register_mode(&mode_tmpl);
299                 break;
300         }
301         assert(mode != NULL);
302         return mode;
303 }
304
305 /*
306  * Creates a new vector mode.
307  */
308 ir_mode *new_ir_vector_mode(const char *name, ir_mode_sort sort, int bit_size, unsigned num_of_elem, int sign,
309                             ir_mode_arithmetic arithmetic, unsigned int modulo_shift)
310 {
311         ir_mode mode_tmpl;
312         ir_mode *mode = NULL;
313
314         mode_tmpl.name         = new_id_from_str(name);
315         mode_tmpl.sort         = sort;
316         mode_tmpl.size         = bit_size * num_of_elem;
317         mode_tmpl.sign         = sign ? 1 : 0;
318         mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
319         mode_tmpl.vector_elem  = num_of_elem;
320         mode_tmpl.arithmetic   = arithmetic;
321         mode_tmpl.link         = NULL;
322         mode_tmpl.tv_priv      = NULL;
323
324         mode = find_mode(&mode_tmpl);
325         if (mode) {
326                 hook_new_mode(&mode_tmpl, mode);
327                 return mode;
328         }
329
330         if (num_of_elem <= 1) {
331                 assert(0 && "vector modes should have at least 2 elements");
332                 return NULL;
333         }
334
335         /* sanity checks */
336         switch (sort) {
337         case irms_auxiliary:
338         case irms_control_flow:
339         case irms_memory:
340         case irms_internal_boolean:
341                 panic("internal modes cannot be user defined");
342
343         case irms_reference:
344                 panic("only integer and floating point modes can be vectorized");
345
346         case irms_float_number:
347                 panic("not yet implemented");
348
349         case irms_int_number:
350                 mode = register_mode(&mode_tmpl);
351         }
352         assert(mode != NULL);
353         return mode;
354 }
355
356 /* Functions for the direct access to all attributes of an ir_mode */
357 ir_modecode (get_mode_modecode)(const ir_mode *mode) {
358         return _get_mode_modecode(mode);
359 }
360
361 ident *(get_mode_ident)(const ir_mode *mode) {
362         return _get_mode_ident(mode);
363 }
364
365 const char *get_mode_name(const ir_mode *mode) {
366         return get_id_str(mode->name);
367 }
368
369 ir_mode_sort (get_mode_sort)(const ir_mode* mode) {
370         return _get_mode_sort(mode);
371 }
372
373 unsigned (get_mode_size_bits)(const ir_mode *mode) {
374         return _get_mode_size_bits(mode);
375 }
376
377 unsigned (get_mode_size_bytes)(const ir_mode *mode) {
378         return _get_mode_size_bytes(mode);
379 }
380
381 int (get_mode_sign)(const ir_mode *mode) {
382         return _get_mode_sign(mode);
383 }
384
385 ir_mode_arithmetic (get_mode_arithmetic)(const ir_mode *mode) {
386         return get_mode_arithmetic(mode);
387 }
388
389
390 /* Attribute modulo shift specifies for modes of kind irms_int_number
391  *  whether shift applies modulo to value of bits to shift.  Asserts
392  *  if mode is not irms_int_number.
393  */
394 unsigned int (get_mode_modulo_shift)(const ir_mode *mode) {
395         return _get_mode_modulo_shift(mode);
396 }
397
398 unsigned int (get_mode_n_vector_elems)(const ir_mode *mode) {
399         return _get_mode_vector_elems(mode);
400 }
401
402 void *(get_mode_link)(const ir_mode *mode) {
403         return _get_mode_link(mode);
404 }
405
406 void (set_mode_link)(ir_mode *mode, void *l) {
407         _set_mode_link(mode, l);
408 }
409
410 tarval *get_mode_min(ir_mode *mode) {
411         assert(mode);
412         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
413         assert(mode_is_data(mode));
414
415         return mode->min;
416 }
417
418 tarval *get_mode_max(ir_mode *mode) {
419         assert(mode);
420         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
421         assert(mode_is_data(mode));
422
423         return mode->max;
424 }
425
426 tarval *get_mode_null(ir_mode *mode) {
427         assert(mode);
428         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
429         assert(mode_is_datab(mode));
430
431         return mode->null;
432 }
433
434 tarval *get_mode_one(ir_mode *mode) {
435         assert(mode);
436         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
437         assert(mode_is_datab(mode));
438
439         return mode->one;
440 }
441
442 tarval *get_mode_minus_one(ir_mode *mode) {
443         assert(mode);
444         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
445         assert(mode_is_data(mode));
446
447         return mode->minus_one;
448 }
449
450 tarval *get_mode_all_one(ir_mode *mode) {
451         assert(mode);
452         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
453         assert(mode_is_datab(mode));
454         return mode->all_one;
455 }
456
457 tarval *get_mode_infinite(ir_mode *mode) {
458         assert(mode);
459         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
460         assert(mode_is_float(mode));
461
462         return get_tarval_plus_inf(mode);
463 }
464
465 tarval *get_mode_NAN(ir_mode *mode) {
466         assert(mode);
467         assert(get_mode_modecode(mode) < (ir_modecode) num_modes);
468         assert(mode_is_float(mode));
469
470         return get_tarval_nan(mode);
471 }
472
473 int is_mode(void *thing) {
474         if (get_kind(thing) == k_ir_mode)
475                 return 1;
476         else
477                 return 0;
478 }
479
480 int (mode_is_signed)(const ir_mode *mode) {
481         return _mode_is_signed(mode);
482 }
483
484 int (mode_is_float)(const ir_mode *mode) {
485         return _mode_is_float(mode);
486 }
487
488 int (mode_is_int)(const ir_mode *mode) {
489         return _mode_is_int(mode);
490 }
491
492 int (mode_is_reference)(const ir_mode *mode) {
493         return _mode_is_reference(mode);
494 }
495
496 int (mode_is_num)(const ir_mode *mode) {
497         return _mode_is_num(mode);
498 }
499
500 int (mode_is_data)(const ir_mode *mode) {
501         return _mode_is_data(mode);
502 }
503
504 int (mode_is_datab)(const ir_mode *mode) {
505         return _mode_is_datab(mode);
506 }
507
508 int (mode_is_dataM)(const ir_mode *mode) {
509         return _mode_is_dataM(mode);
510 }
511
512 int (mode_is_float_vector)(const ir_mode *mode) {
513         return _mode_is_float_vector(mode);
514 }
515
516 int (mode_is_int_vector)(const ir_mode *mode) {
517         return _mode_is_int_vector(mode);
518 }
519
520 /* Returns true if sm can be converted to lm without loss. */
521 int smaller_mode(const ir_mode *sm, const ir_mode *lm) {
522         int sm_bits, lm_bits;
523
524         assert(sm);
525         assert(lm);
526
527         if (sm == lm) return 1;
528
529         sm_bits = get_mode_size_bits(sm);
530         lm_bits = get_mode_size_bits(lm);
531
532         switch (get_mode_sort(sm)) {
533         case irms_int_number:
534                 switch (get_mode_sort(lm)) {
535                 case irms_int_number:
536                         if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
537                                 return 0;
538
539                         /* only two complement implemented */
540                         assert(get_mode_arithmetic(sm) == irma_twos_complement);
541
542                         /* integers are convertable if
543                          *   - both have the same sign and lm is the larger one
544                          *   - lm is the signed one and is at least two bits larger
545                          *     (one for the sign, one for the highest bit of sm)
546                          *   - sm & lm are two_complement and lm has greater or equal number of bits
547                          */
548                         if (mode_is_signed(sm)) {
549                                 if (!mode_is_signed(lm))
550                                         return 0;
551                                 return sm_bits <= lm_bits;
552                         } else {
553                                 if (mode_is_signed(lm)) {
554                                         return sm_bits < lm_bits;
555                                 }
556                                 return sm_bits <= lm_bits;
557                         }
558                         break;
559
560                 case irms_float_number:
561                         /* int to float works if the float is large enough */
562                         return 0;
563
564                 default:
565                         break;
566                 }
567                 break;
568
569         case irms_float_number:
570                 if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
571                         if ( (get_mode_sort(lm) == irms_float_number)
572                                 && (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
573                                 return 1;
574                 }
575                 break;
576
577         case irms_reference:
578                 /* do exist machines out there with different pointer lenghts ?*/
579                 return 0;
580
581         case irms_internal_boolean:
582                 return mode_is_int(lm);
583
584         default:
585                 break;
586         }
587
588         /* else */
589         return 0;
590 }
591
592 /* Returns true if a value of mode sm can be converted into mode lm
593    and backwards without loss. */
594 int values_in_mode(const ir_mode *sm, const ir_mode *lm) {
595         int sm_bits, lm_bits;
596         ir_mode_arithmetic arith;
597
598         assert(sm);
599         assert(lm);
600
601         if (sm == lm) return 1;
602
603         if (sm == mode_b)
604                 return mode_is_int(lm);
605
606         sm_bits = get_mode_size_bits(sm);
607         lm_bits = get_mode_size_bits(lm);
608
609         arith = get_mode_arithmetic(sm);
610         if (arith != get_mode_arithmetic(lm))
611                 return 0;
612
613         switch (arith) {
614                 case irma_twos_complement:
615                 case irma_ieee754:
616                         return get_mode_size_bits(sm) <= get_mode_size_bits(lm);
617
618                 default:
619                         return 0;
620         }
621 }
622
623 /* Return the signed integer equivalent mode for an reference mode. */
624 ir_mode *get_reference_mode_signed_eq(ir_mode *mode) {
625         assert(mode_is_reference(mode));
626         return mode->eq_signed;
627 }
628
629 /* Sets the signed integer equivalent mode for an reference mode. */
630 void set_reference_mode_signed_eq(ir_mode *ref_mode, ir_mode *int_mode) {
631         assert(mode_is_reference(ref_mode));
632         assert(mode_is_int(int_mode));
633         ref_mode->eq_signed = int_mode;
634 }
635
636 /* Return the unsigned integer equivalent mode for an reference mode. */
637 ir_mode *get_reference_mode_unsigned_eq(ir_mode *mode) {
638         assert(mode_is_reference(mode));
639         return mode->eq_unsigned;
640 }
641
642 /* Sets the unsigned integer equivalent mode for an reference mode. */
643 void set_reference_mode_unsigned_eq(ir_mode *ref_mode, ir_mode *int_mode) {
644         assert(mode_is_reference(ref_mode));
645         assert(mode_is_int(int_mode));
646         ref_mode->eq_unsigned = int_mode;
647 }
648
649 /* initialization, build the default modes */
650 void init_mode(void) {
651         ir_mode newmode;
652
653         obstack_init(&modes);
654         mode_list = NEW_ARR_F(ir_mode*, 0);
655
656         num_modes  =  0;
657         /* initialize predefined modes */
658
659         /* Internal Modes */
660         newmode.arithmetic   = irma_none;
661         newmode.size         = 0;
662         newmode.sign         = 0;
663         newmode.modulo_shift = 0;
664         newmode.vector_elem  = 0;
665         newmode.eq_signed    = NULL;
666         newmode.eq_unsigned  = NULL;
667         newmode.link         = NULL;
668         newmode.tv_priv      = NULL;
669
670         /* Control Flow Modes*/
671         newmode.sort    = irms_control_flow;
672
673         /* Basic Block */
674         newmode.name    = new_id_from_chars("BB", 2);
675         newmode.code    = irm_BB;
676
677         mode_BB = register_mode(&newmode);
678
679         /* eXecution */
680         newmode.name    = new_id_from_chars("X", 1);
681         newmode.code    = irm_X;
682
683         mode_X = register_mode(&newmode);
684
685         /* Memory Modes */
686         newmode.sort    = irms_memory;
687
688         /* Memory */
689         newmode.name    = new_id_from_chars("M", 1);
690         newmode.code    = irm_M;
691
692         mode_M = register_mode(&newmode);
693
694         /* Auxiliary Modes */
695         newmode.sort    = irms_auxiliary,
696
697         /* Tuple */
698         newmode.name    = new_id_from_chars("T", 1);
699         newmode.code    = irm_T;
700
701         mode_T = register_mode(&newmode);
702
703         /* ANY */
704         newmode.name    = new_id_from_chars("ANY", 3);
705         newmode.code    = irm_ANY;
706
707         mode_ANY = register_mode(&newmode);
708
709         /* BAD */
710         newmode.name    = new_id_from_chars("BAD", 3);
711         newmode.code    = irm_BAD;
712
713         mode_BAD = register_mode(&newmode);
714
715         /* Internal Boolean Modes */
716         newmode.sort    = irms_internal_boolean;
717
718         /* boolean */
719         newmode.name    = new_id_from_chars("b", 1);
720         newmode.code    = irm_b;
721
722         mode_b = register_mode(&newmode);
723
724         /* Data Modes */
725         newmode.vector_elem = 1;
726
727         /* Float Number Modes */
728         newmode.sort       = irms_float_number;
729         newmode.arithmetic = irma_ieee754;
730
731         /* float */
732         newmode.name    = new_id_from_chars("F", 1);
733         newmode.code    = irm_F;
734         newmode.sign    = 1;
735         newmode.size    = 32;
736
737         mode_F = register_mode(&newmode);
738
739         /* double */
740         newmode.name    = new_id_from_chars("D", 1);
741         newmode.code    = irm_D;
742         newmode.sign    = 1;
743         newmode.size    = 64;
744
745         mode_D = register_mode(&newmode);
746
747         /* extended */
748         newmode.name    = new_id_from_chars("E", 1);
749         newmode.code    = irm_E;
750         newmode.sign    = 1;
751         newmode.size    = 80;
752
753         mode_E = register_mode(&newmode);
754
755         /* Integer Number Modes */
756         newmode.sort         = irms_int_number;
757         newmode.arithmetic   = irma_twos_complement;
758
759         /* signed byte */
760         newmode.name         = new_id_from_chars("Bs", 2);
761         newmode.code         = irm_Bs;
762         newmode.sign         = 1;
763         newmode.size         = 8;
764         newmode.modulo_shift = 32;
765
766         mode_Bs = register_mode(&newmode);
767
768         /* unsigned byte */
769         newmode.name         = new_id_from_chars("Bu", 2);
770         newmode.code         = irm_Bu;
771         newmode.arithmetic   = irma_twos_complement;
772         newmode.sign         = 0;
773         newmode.size         = 8;
774         newmode.modulo_shift = 32;
775
776         mode_Bu = register_mode(&newmode);
777
778         /* signed short integer */
779         newmode.name         = new_id_from_chars("Hs", 2);
780         newmode.code         = irm_Hs;
781         newmode.sign         = 1;
782         newmode.size         = 16;
783         newmode.modulo_shift = 32;
784
785         mode_Hs = register_mode(&newmode);
786
787         /* unsigned short integer */
788         newmode.name         = new_id_from_chars("Hu", 2);
789         newmode.code         = irm_Hu;
790         newmode.sign         = 0;
791         newmode.size         = 16;
792         newmode.modulo_shift = 32;
793
794         mode_Hu = register_mode(&newmode);
795
796         /* signed integer */
797         newmode.name         = new_id_from_chars("Is", 2);
798         newmode.code         = irm_Is;
799         newmode.sign         = 1;
800         newmode.size         = 32;
801         newmode.modulo_shift = 32;
802
803         mode_Is = register_mode(&newmode);
804
805         /* unsigned integer */
806         newmode.name         = new_id_from_chars("Iu", 2);
807         newmode.code         = irm_Iu;
808         newmode.sign         = 0;
809         newmode.size         = 32;
810         newmode.modulo_shift = 32;
811
812         mode_Iu = register_mode(&newmode);
813
814         /* signed long integer */
815         newmode.name         = new_id_from_chars("Ls", 2);
816         newmode.code         = irm_Ls;
817         newmode.sign         = 1;
818         newmode.size         = 64;
819         newmode.modulo_shift = 64;
820
821         mode_Ls = register_mode(&newmode);
822
823         /* unsigned long integer */
824         newmode.name         = new_id_from_chars("Lu", 2);
825         newmode.code         = irm_Lu;
826         newmode.sign         = 0;
827         newmode.size         = 64;
828         newmode.modulo_shift = 64;
829
830         mode_Lu = register_mode(&newmode);
831
832         /* signed long long integer */
833         newmode.name         = new_id_from_chars("LLs", 3);
834         newmode.code         = irm_LLs;
835         newmode.sign         = 1;
836         newmode.size         = 128;
837         newmode.modulo_shift = 128;
838
839         mode_LLs = register_mode(&newmode);
840
841         /* unsigned long long integer */
842         newmode.name         = new_id_from_chars("LLu", 3);
843         newmode.code         = irm_LLu;
844         newmode.sign         = 0;
845         newmode.size         = 128;
846         newmode.modulo_shift = 128;
847
848         mode_LLu = register_mode(&newmode);
849
850         /* Reference Mode */
851         newmode.sort       = irms_reference;
852         newmode.arithmetic = irma_twos_complement;
853
854         /* pointer */
855         newmode.name         = new_id_from_chars("P", 1);
856         newmode.code         = irm_P;
857         newmode.sign         = 0;
858         newmode.size         = 32;
859         newmode.modulo_shift = 0;
860         newmode.eq_signed    = mode_Is;
861         newmode.eq_unsigned  = mode_Iu;
862
863         mode_P = register_mode(&newmode);
864
865         /* set the machine specific modes to the predefined ones */
866         mode_P_code = mode_P;
867         mode_P_data = mode_P;
868 }
869
870 /* find a signed mode for an unsigned integer mode */
871 ir_mode *find_unsigned_mode(const ir_mode *mode) {
872         ir_mode n = *mode;
873
874         /* allowed for reference mode */
875         if (mode->sort == irms_reference)
876                 n.sort = irms_int_number;
877
878         assert(n.sort == irms_int_number);
879         n.sign = 0;
880         return find_mode(&n);
881 }
882
883 /* find an unsigned mode for a signed integer mode */
884 ir_mode *find_signed_mode(const ir_mode *mode) {
885         ir_mode n = *mode;
886
887         assert(mode->sort == irms_int_number);
888         n.sign = 1;
889         return find_mode(&n);
890 }
891
892 /* finds a integer mode with 2*n bits for an integer mode with n bits. */
893 ir_mode *find_double_bits_int_mode(const ir_mode *mode) {
894         ir_mode n = *mode;
895
896         assert(mode->sort == irms_int_number && mode->arithmetic == irma_twos_complement);
897
898         n.size = 2*mode->size;
899         return find_mode(&n);
900 }
901
902 /*
903  * Returns non-zero if the given mode honors signed zero's, i.e.,
904  * a +0 and a -0 exists and handled differently.
905  */
906 int mode_honor_signed_zeros(const ir_mode *mode) {
907         /* for floating point, we know that IEEE 754 has +0 and -0,
908          * but always handles it identical.
909          */
910         return
911                 mode->sort == irms_float_number &&
912                 mode->arithmetic != irma_ieee754;
913 }
914
915 /*
916  * Returns non-zero if the given mode might overflow on unary Minus.
917  *
918  * This does NOT happen on IEEE 754.
919  */
920 int mode_overflow_on_unary_Minus(const ir_mode *mode) {
921         if (mode->sort == irms_float_number)
922                 return mode->arithmetic == irma_ieee754 ? 0 : 1;
923         return 1;
924 }
925
926 /*
927  * Returns non-zero if the mode has a reversed wrap-around
928  * logic, especially (a + x) - x == a.
929  *
930  * This is normally true for integer modes, not for floating
931  * point modes.
932  */
933 int mode_wrap_around(const ir_mode *mode) {
934         /* FIXME: better would be an extra mode property */
935         return mode_is_int(mode);
936 }
937
938 /*
939  * Returns non-zero if the cast from mode src to mode dst is a
940  * reinterpret cast (ie. only the bit pattern is reinterpreted,
941  * no conversion is done)
942  */
943 int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst) {
944         ir_mode_arithmetic ma;
945
946         if (src == dst)
947                 return 1;
948         if (get_mode_size_bits(src) != get_mode_size_bits(dst))
949                 return 0;
950         ma = get_mode_arithmetic(src);
951         if (ma != get_mode_arithmetic(dst))
952                 return 0;
953
954         return ma == irma_twos_complement || ma == irma_ones_complement;
955 }
956
957 void finish_mode(void) {
958         obstack_free(&modes, 0);
959         DEL_ARR_F(mode_list);
960
961         mode_T   = NULL;
962         mode_X   = NULL;
963         mode_M   = NULL;
964         mode_BB  = NULL;
965         mode_ANY = NULL;
966         mode_BAD = NULL;
967
968         mode_F   = NULL;
969         mode_D   = NULL;
970         mode_E   = NULL;
971
972         mode_Bs  = NULL;
973         mode_Bu  = NULL;
974         mode_Hs  = NULL;
975         mode_Hu  = NULL;
976         mode_Is  = NULL;
977         mode_Iu  = NULL;
978         mode_Ls  = NULL;
979         mode_Lu  = NULL;
980
981         mode_b   = NULL;
982
983         mode_P      = NULL;
984         mode_P_code = NULL;
985         mode_P_data = NULL;
986 }