3 * File name: ir/ir/irmode.c
4 * Purpose: Data modes of operations.
5 * Author: Martin Trapp, Christian Schaefer
6 * Modified by: Goetz Lindenmaier, Mathias Heil
9 * Copyright: (c) 1998-2003 Universität Karlsruhe
10 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
18 # include "irmode_t.h"
28 static long long count = 0;
29 # define ANNOUNCE() printf(__FILE__": call no. %lld (%s)\n", count++, __FUNCTION__)
31 # define ANNOUNCE() ((void)0)
39 /** dynamic array to hold all modes */
40 static struct obstack modes;
42 /** number of defined modes */
50 * Compare modes that don't need to have their code field
53 * TODO: Add other fields
55 INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
58 if (m->sort == n->sort && m->arithmetic == n->arithmetic && m->size == n->size && m->align == n->align && m->sign == n->sign)
60 // if (0 == memcmp(&m->sort, &n->sort, offsetof(ir_mode,min) - offsetof(ir_mode,sort))) return 1;
66 * searches the modes obstack for the given mode and returns
67 * a pointer on an equal mode already in the array, NULL if
70 static ir_mode *find_mode(const ir_mode *m)
73 struct _obstack_chunk *p;
76 for ( n = (ir_mode *)p->contents; (char *)(n+1) <= modes.next_free; ++n) {
78 if (modes_are_equal(n, m))
82 for (p = p->prev; p; p = p->prev) {
83 for (n = (ir_mode *)p->contents; (char *)(n+1) < p->limit; ++n)
85 if (modes_are_equal(n, m))
93 * sets special values of modes
95 static void set_mode_values(ir_mode* mode)
97 switch (get_mode_sort(mode))
100 case irms_float_number:
101 mode->min = get_tarval_min(mode);
102 mode->max = get_tarval_max(mode);
103 mode->null = get_tarval_null(mode);
104 mode->one = get_tarval_one(mode);
107 case irms_internal_boolean:
108 mode->min = tarval_b_false;
109 mode->max = tarval_b_true;
110 mode->null = tarval_b_false;
111 mode->one = tarval_b_true;
115 mode->min = tarval_bad;
116 mode->max = tarval_bad;
117 mode->null = (get_mode_modecode(mode)==irm_P)?tarval_P_void:tarval_bad;
118 mode->one = tarval_bad;
124 case irms_control_flow:
125 mode->min = tarval_bad;
126 mode->max = tarval_bad;
127 mode->null = tarval_bad;
128 mode->one = tarval_bad;
134 * globals defined in irmode.h
137 /* --- Predefined modes --- */
139 /* FIRM internal modes: */
147 /* predefined numerical modes: */
148 ir_mode *mode_F; /* float */
149 ir_mode *mode_D; /* double */
150 ir_mode *mode_E; /* long double */
152 ir_mode *mode_Bs; /* integral values, signed and unsigned */
153 ir_mode *mode_Bu; /* 8 bit */
154 ir_mode *mode_Hs; /* 16 bit */
156 ir_mode *mode_Is; /* 32 bit */
158 ir_mode *mode_Ls; /* 64 bit */
166 /* machine specific modes */
167 ir_mode *mode_P_mach; /* machine specific pointer mode */
170 * functions defined in irmode.h
173 /* JNI access functions */
174 INLINE ir_mode *get_modeT(void) { ANNOUNCE(); return mode_T; }
175 INLINE ir_mode *get_modeF(void) { ANNOUNCE(); return mode_F; }
176 INLINE ir_mode *get_modeD(void) { ANNOUNCE(); return mode_D; }
177 INLINE ir_mode *get_modeE(void) { ANNOUNCE(); return mode_E; }
178 INLINE ir_mode *get_modeBs(void) { ANNOUNCE(); return mode_Bs; }
179 INLINE ir_mode *get_modeBu(void) { ANNOUNCE(); return mode_Bu; }
180 INLINE ir_mode *get_modeHs(void) { ANNOUNCE(); return mode_Hs; }
181 INLINE ir_mode *get_modeHu(void) { ANNOUNCE(); return mode_Hu; }
182 INLINE ir_mode *get_modeIs(void) { ANNOUNCE(); return mode_Is; }
183 INLINE ir_mode *get_modeIu(void) { ANNOUNCE(); return mode_Iu; }
184 INLINE ir_mode *get_modeLs(void) { ANNOUNCE(); return mode_Ls; }
185 INLINE ir_mode *get_modeLu(void) { ANNOUNCE(); return mode_Lu; }
186 INLINE ir_mode *get_modeC(void) { ANNOUNCE(); return mode_C; }
187 INLINE ir_mode *get_modeU(void) { ANNOUNCE(); return mode_U; }
188 INLINE ir_mode *get_modeb(void) { ANNOUNCE(); return mode_b; }
189 INLINE ir_mode *get_modeP(void) { ANNOUNCE(); return mode_P; }
190 INLINE ir_mode *get_modeX(void) { ANNOUNCE(); return mode_X; }
191 INLINE ir_mode *get_modeM(void) { ANNOUNCE(); return mode_M; }
192 INLINE ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; }
193 INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; }
194 INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; }
197 ir_mode *get_modeP_mach(void) { ANNOUNCE(); return mode_P_mach; }
198 void set_modeP_mach(ir_mode *p) {
200 assert(mode_is_reference(p));
205 * Registers a new mode if not defined yet, else returns
206 * the "equivalent" one.
208 static ir_mode *register_mode(const ir_mode* new_mode)
210 ir_mode *mode = NULL;
215 /* copy mode struct to modes array */
216 mode=(ir_mode*) obstack_copy(&modes, new_mode, sizeof(ir_mode));
218 mode->kind = k_ir_mode;
219 if(num_modes>=irm_max) mode->code = num_modes;
222 set_mode_values(mode);
228 * Creates a new mode.
230 ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic )
235 mode_tmpl.name = new_id_from_str(name);
236 mode_tmpl.sort = sort;
237 mode_tmpl.size = bit_size;
238 mode_tmpl.align = align;
239 mode_tmpl.sign = sign ? 1 : 0;
240 mode_tmpl.arithmetic = arithmetic;
241 mode_tmpl.link = NULL;
242 mode_tmpl.tv_priv = NULL;
244 mode = find_mode(&mode_tmpl);
254 case irms_control_flow:
256 case irms_internal_boolean:
257 assert(0 && "internal modes cannot be user defined");
260 case irms_float_number:
261 assert(0 && "not yet implemented");
264 case irms_int_number:
267 return register_mode(&mode_tmpl);
269 return NULL; /* to shut up gcc */
272 /* Functions for the direct access to all attributes od a ir_mode */
274 get_mode_modecode(const ir_mode *mode)
281 get_mode_ident(const ir_mode *mode)
288 get_mode_name(const ir_mode *mode)
291 return get_id_str(mode->name);
295 get_mode_sort(const ir_mode* mode)
302 get_mode_size_bits(const ir_mode *mode)
308 int get_mode_size_bytes(const ir_mode *mode) {
309 int size = get_mode_size_bits(mode);
311 if ((size & 7) != 0) return -1;
316 get_mode_align (const ir_mode *mode)
323 get_mode_sign (const ir_mode *mode)
329 int get_mode_arithmetic (const ir_mode *mode)
332 return mode->arithmetic;
335 void* get_mode_link(const ir_mode *mode)
341 void set_mode_link(ir_mode *mode, void *l)
348 get_mode_min (ir_mode *mode)
352 assert(get_mode_modecode(mode) < num_modes);
353 assert(mode_is_data(mode));
359 get_mode_max (ir_mode *mode)
363 assert(get_mode_modecode(mode) < num_modes);
364 assert(mode_is_data(mode));
370 get_mode_null (ir_mode *mode)
374 assert(get_mode_modecode(mode) < num_modes);
375 assert(mode_is_data(mode));
381 get_mode_one (ir_mode *mode)
385 assert(get_mode_modecode(mode) < num_modes);
386 assert(mode_is_data(mode));
392 get_mode_infinite(ir_mode *mode)
396 assert(get_mode_modecode(mode) < num_modes);
397 assert(mode_is_float(mode));
399 return get_tarval_inf(mode);
403 get_mode_NAN(ir_mode *mode)
407 assert(get_mode_modecode(mode) < num_modes);
408 assert(mode_is_float(mode));
410 return get_tarval_nan(mode);
414 is_mode (void *thing) {
416 if (get_kind(thing) == k_ir_mode)
422 /* Functions to check, whether a modecode is signed, float, int, num, data,
423 datab or dataM. For more exact definitions read the corresponding pages
424 in the firm documentation or the followingenumeration
426 The set of "float" is defined as:
427 ---------------------------------
428 float = {irm_F, irm_D, irm_E}
430 The set of "int" is defined as:
431 -------------------------------
432 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
434 The set of "num" is defined as:
435 -------------------------------
436 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
437 irm_Is, irm_Iu, irm_Ls, irm_Lu}
440 The set of "data" is defined as:
441 -------------------------------
442 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
443 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
444 = {num || irm_C || irm_U || irm_P}
446 The set of "datab" is defined as:
447 ---------------------------------
448 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
449 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
452 The set of "dataM" is defined as:
453 ---------------------------------
454 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
455 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
459 #ifdef MODE_ACCESS_DEFINES
460 # undef mode_is_signed
461 # undef mode_is_float
466 # undef mode_is_datab
467 # undef mode_is_dataM
470 mode_is_signed (const ir_mode *mode)
478 mode_is_float (const ir_mode *mode)
482 return (get_mode_sort(mode) == irms_float_number);
486 mode_is_int (const ir_mode *mode)
490 return (get_mode_sort(mode) == irms_int_number);
493 int mode_is_character (const ir_mode *mode)
497 return (get_mode_sort(mode) == irms_character);
500 int mode_is_reference (const ir_mode *mode)
504 return (get_mode_sort(mode) == irms_reference);
508 mode_is_num (const ir_mode *mode)
512 return (mode_is_int(mode) || mode_is_float(mode));
516 mode_is_numP (const ir_mode *mode)
520 return (mode_is_int(mode) || mode_is_float(mode) || mode_is_reference(mode));
524 mode_is_data (const ir_mode *mode)
528 return (mode_is_num(mode) || get_mode_sort(mode) == irms_character || get_mode_sort(mode) == irms_reference);
532 mode_is_datab (const ir_mode *mode)
536 return (mode_is_data(mode) || get_mode_sort(mode) == irms_internal_boolean);
540 mode_is_dataM (const ir_mode *mode)
544 return (mode_is_data(mode) || get_mode_modecode(mode) == irm_M);
546 #ifdef MODE_ACCESS_DEFINES
547 # define mode_is_signed(mode) (mode)->sign
548 # define mode_is_float(mode) ((mode)->sort == irms_float_number)
549 # define mode_is_int(mode) ((mode)->sort == irms_int_number)
550 # define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
551 # define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
552 # define mode_is_datab(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference) || ((mode)->sort == irms_internal_boolean))
553 # define mode_is_dataM(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference) || ((mode)->code == irm_M))
555 /* Returns true if sm can be converted to lm without loss. */
557 smaller_mode(const ir_mode *sm, const ir_mode *lm)
563 if (sm == lm) return 1;
565 switch(get_mode_sort(sm))
567 case irms_int_number:
568 switch(get_mode_sort(lm))
570 case irms_int_number:
571 /* integers are convertable if
572 * - both have the same sign and lm is the larger one
573 * - lm is the signed one and is at least two bits larger
574 * (one for the sign, one for the highest bit of sm)
576 if (mode_is_signed(sm))
578 if ( mode_is_signed(lm) && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
581 else if (mode_is_signed(lm))
583 if (get_mode_size_bits(lm) > get_mode_size_bits(sm) + 1)
586 else if (get_mode_size_bits(lm) > get_mode_size_bits(sm))
592 case irms_float_number:
593 /* int to float works if the float is large enough */
601 case irms_float_number:
602 /* XXX currently only the three standard 32,64,80 bit floats
603 * are supported which can safely be converted */
604 if ( (get_mode_sort(lm) == irms_float_number)
605 && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
610 /* do exist machines out there with different pointer lenghts ?*/
621 /* ** initialization ** */
627 /* init flexible array */
629 obstack_init(&modes);
632 /* initialize predefined modes */
635 newmode.arithmetic = irma_none;
640 newmode.tv_priv = NULL;
642 /* Control Flow Modes*/
643 newmode.sort = irms_control_flow;
646 newmode.name = id_from_str("BB", 2);
647 newmode.code = irm_BB;
649 mode_BB = register_mode(&newmode);
652 newmode.name = id_from_str("X", 1);
653 newmode.code = irm_X;
655 mode_X = register_mode(&newmode);
658 newmode.sort = irms_memory;
661 newmode.name = id_from_str("M", 1);
662 newmode.code = irm_M;
664 mode_M = register_mode(&newmode);
666 /* Auxiliary Modes */
667 newmode.sort = irms_auxiliary,
670 newmode.name = id_from_str("T", 1);
671 newmode.code = irm_T;
673 mode_T = register_mode(&newmode);
676 newmode.name = id_from_str("ANY", 3);
677 newmode.code = irm_ANY;
679 mode_ANY = register_mode(&newmode);
682 newmode.name = id_from_str("BAD", 3);
683 newmode.code = irm_BAD;
685 mode_BAD = register_mode(&newmode);
687 /* Internal Boolean Modes */
688 newmode.sort = irms_internal_boolean;
691 newmode.name = id_from_str("b", 1);
692 newmode.code = irm_b;
694 mode_b = register_mode(&newmode);
698 /* Float Number Modes */
699 newmode.sort = irms_float_number;
700 newmode.arithmetic = irma_ieee754;
703 newmode.name = id_from_str("F", 1);
704 newmode.code = irm_F;
709 mode_F = register_mode(&newmode);
712 newmode.name = id_from_str("D", 1);
713 newmode.code = irm_D;
718 mode_D = register_mode(&newmode);
721 newmode.name = id_from_str("E", 1);
722 newmode.code = irm_E;
727 mode_E = register_mode(&newmode);
729 /* Integer Number Modes */
730 newmode.sort = irms_int_number;
731 newmode.arithmetic = irma_twos_complement;
734 newmode.name = id_from_str("Bs", 2);
735 newmode.code = irm_Bs;
740 mode_Bs = register_mode(&newmode);
743 newmode.name = id_from_str("Bu", 2);
744 newmode.code = irm_Bu;
745 newmode.arithmetic = irma_twos_complement;
750 mode_Bu = register_mode(&newmode);
752 /* signed short integer */
753 newmode.name = id_from_str("Hs", 2);
754 newmode.code = irm_Hs;
759 mode_Hs = register_mode(&newmode);
761 /* unsigned short integer */
762 newmode.name = id_from_str("Hu", 2);
763 newmode.code = irm_Hu;
768 mode_Hu = register_mode(&newmode);
771 newmode.name = id_from_str("Is", 2);
772 newmode.code = irm_Is;
777 mode_Is = register_mode(&newmode);
779 /* unsigned integer */
780 newmode.name = id_from_str("Iu", 2);
781 newmode.code = irm_Iu;
786 mode_Iu = register_mode(&newmode);
788 /* signed long integer */
789 newmode.name = id_from_str("Ls", 2);
790 newmode.code = irm_Ls;
795 mode_Ls = register_mode(&newmode);
797 /* unsigned long integer */
798 newmode.name = id_from_str("Lu", 2);
799 newmode.code = irm_Lu;
804 mode_Lu = register_mode(&newmode);
806 /* Character Modes */
807 newmode.sort = irms_character;
808 newmode.arithmetic = irma_none;
811 newmode.name = id_from_str("C", 1);
812 newmode.code = irm_C;
817 mode_C = register_mode(&newmode);
819 /* Unicode character */
820 newmode.name = id_from_str("U", 1);
821 newmode.code = irm_U;
826 mode_U = register_mode(&newmode);
828 /* Reference Modes */
829 newmode.sort = irms_reference;
830 newmode.arithmetic = irma_twos_complement;
833 newmode.name = id_from_str("P", 1);
834 newmode.code = irm_P;
839 mode_P = register_mode(&newmode);
841 /* set the machine specific modes to the predifined ones */
842 mode_P_mach = mode_P;