1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
14 # include "irmode_t.h"
24 static long long count = 0;
25 # define ANNOUNCE() printf(__FILE__": call no. %lld (%s)\n", count++, __FUNCTION__)
27 # define ANNOUNCE() ((void)0)
35 /** dynamic array to hold all modes */
36 static struct obstack modes;
38 /** number of defined modes */
46 * Compare modes that don't need to have their code field
49 * TODO: Add other fields
51 INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
54 if (0 == memcmp(&m->sort, &n->sort, offsetof(ir_mode,min) - offsetof(ir_mode,sort))) return 1;
60 * searches the modes obstack for the given mode and returns
61 * a pointer on an equal mode already in the array, NULL if
64 static ir_mode *find_mode(const ir_mode *m)
67 struct _obstack_chunk *p;
70 for( n=(ir_mode*) p->contents; (char *)n < modes.next_free; n+=sizeof(ir_mode) )
72 if(modes_are_equal(n,m)) return n;
75 for (p = p->prev; p; p = p->prev)
77 for( n=(ir_mode*) p->contents; (char *)n < p->limit; n+=sizeof(ir_mode) )
79 if(modes_are_equal(n,m)) return n;
87 * sets special values of modes
89 static void set_mode_values(ir_mode* mode)
91 switch (get_mode_sort(mode))
94 case irms_float_number:
95 mode->min = get_tarval_min(mode);
96 mode->max = get_tarval_max(mode);
97 mode->null = get_tarval_null(mode);
98 mode->one = get_tarval_one(mode);
101 case irms_internal_boolean:
102 mode->min = tarval_b_false;
103 mode->max = tarval_b_true;
104 mode->null = tarval_b_false;
105 mode->one = tarval_b_true;
109 mode->min = tarval_bad;
110 mode->max = tarval_bad;
111 mode->null = (get_mode_modecode(mode)==irm_P)?tarval_P_void:tarval_bad;
112 mode->one = tarval_bad;
118 case irms_control_flow:
119 mode->min = tarval_bad;
120 mode->max = tarval_bad;
121 mode->null = tarval_bad;
122 mode->one = tarval_bad;
128 * globals defined in irmode.h
131 /* --- Predefined modes --- */
133 /* FIRM internal modes: */
141 /* predefined numerical modes: */
142 ir_mode *mode_F; /* float */
143 ir_mode *mode_D; /* double */
144 ir_mode *mode_E; /* long double */
146 ir_mode *mode_Bs; /* integral values, signed and unsigned */
147 ir_mode *mode_Bu; /* 8 bit */
148 ir_mode *mode_Hs; /* 16 bit */
150 ir_mode *mode_Is; /* 32 bit */
152 ir_mode *mode_Ls; /* 64 bit */
161 * functions defined in irmode.h
164 /* JNI access functions */
165 INLINE ir_mode *get_modeT(void) { ANNOUNCE(); return mode_T; }
166 INLINE ir_mode *get_modeF(void) { ANNOUNCE(); return mode_F; }
167 INLINE ir_mode *get_modeD(void) { ANNOUNCE(); return mode_D; }
168 INLINE ir_mode *get_modeE(void) { ANNOUNCE(); return mode_E; }
169 INLINE ir_mode *get_modeBs(void) { ANNOUNCE(); return mode_Bs; }
170 INLINE ir_mode *get_modeBu(void) { ANNOUNCE(); return mode_Bu; }
171 INLINE ir_mode *get_modeHs(void) { ANNOUNCE(); return mode_Hs; }
172 INLINE ir_mode *get_modeHu(void) { ANNOUNCE(); return mode_Hu; }
173 INLINE ir_mode *get_modeIs(void) { ANNOUNCE(); return mode_Is; }
174 INLINE ir_mode *get_modeIu(void) { ANNOUNCE(); return mode_Iu; }
175 INLINE ir_mode *get_modeLs(void) { ANNOUNCE(); return mode_Ls; }
176 INLINE ir_mode *get_modeLu(void) { ANNOUNCE(); return mode_Lu; }
177 INLINE ir_mode *get_modeC(void) { ANNOUNCE(); return mode_C; }
178 INLINE ir_mode *get_modeU(void) { ANNOUNCE(); return mode_U; }
179 INLINE ir_mode *get_modeb(void) { ANNOUNCE(); return mode_b; }
180 INLINE ir_mode *get_modeP(void) { ANNOUNCE(); return mode_P; }
181 INLINE ir_mode *get_modeX(void) { ANNOUNCE(); return mode_X; }
182 INLINE ir_mode *get_modeM(void) { ANNOUNCE(); return mode_M; }
183 INLINE ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; }
184 INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; }
185 INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; }
188 * Registers a new mode if not defined yet, else returns
189 * the "equivalent" one.
191 static ir_mode *register_mode(const ir_mode* new_mode)
193 ir_mode *mode = NULL;
198 /* copy mode struct to modes array */
199 mode=(ir_mode*) obstack_copy(&modes, new_mode, sizeof(ir_mode));
201 mode->kind = k_ir_mode;
202 if(num_modes>=irm_max) mode->code = num_modes;
205 set_mode_values(mode);
211 * Creates a new mode.
213 ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic )
222 case irms_control_flow:
224 case irms_internal_boolean:
225 assert(0 && "internal modes cannot be user defined");
229 case irms_float_number:
230 assert(0 && "not yet implemented");
234 case irms_int_number:
239 mode_tmpl.name = new_id_from_str(name);
240 mode_tmpl.sort = sort;
241 mode_tmpl.size = bit_size;
242 mode_tmpl.align = align;
243 mode_tmpl.sign = sign ? 1 : 0;
244 mode_tmpl.arithmetic = arithmetic;
245 mode_tmpl.tv_priv = NULL;
247 /* first check if there already is a matching mode */
248 mode = find_mode(&mode_tmpl);
255 return register_mode(&mode_tmpl);
259 /* Functions for the direct access to all attributes od a ir_mode */
261 get_mode_modecode(const ir_mode *mode)
268 get_mode_ident(const ir_mode *mode)
275 get_mode_name(const ir_mode *mode)
278 return id_to_str(mode->name);
282 get_mode_sort(const ir_mode* mode)
289 get_mode_size_bits(const ir_mode *mode)
295 int get_mode_size_bytes(const ir_mode *mode) {
296 int size = get_mode_size_bits(mode);
298 if ((size & 7) != 0) return -1;
303 get_mode_align (const ir_mode *mode)
310 get_mode_sign (const ir_mode *mode)
316 int get_mode_arithmetic (const ir_mode *mode)
319 return mode->arithmetic;
322 void* get_mode_link(const ir_mode *mode)
328 void set_mode_link(ir_mode *mode, void *l)
335 get_mode_min (ir_mode *mode)
339 assert(get_mode_modecode(mode) < num_modes);
340 assert(mode_is_data(mode));
346 get_mode_max (ir_mode *mode)
350 assert(get_mode_modecode(mode) < num_modes);
351 assert(mode_is_data(mode));
357 get_mode_null (ir_mode *mode)
361 assert(get_mode_modecode(mode) < num_modes);
362 assert(mode_is_data(mode));
368 get_mode_one (ir_mode *mode)
372 assert(get_mode_modecode(mode) < num_modes);
373 assert(mode_is_data(mode));
379 get_mode_infinite(ir_mode *mode)
383 assert(get_mode_modecode(mode) < num_modes);
384 assert(mode_is_float(mode));
386 return get_tarval_inf(mode);
390 get_mode_NAN(ir_mode *mode)
394 assert(get_mode_modecode(mode) < num_modes);
395 assert(mode_is_float(mode));
397 return get_tarval_nan(mode);
401 is_mode (void *thing) {
403 if (get_kind(thing) == k_ir_mode)
409 /* Functions to check, whether a modecode is signed, float, int, num, data,
410 datab or dataM. For more exact definitions read the corresponding pages
411 in the firm documentation or the followingenumeration
413 The set of "float" is defined as:
414 ---------------------------------
415 float = {irm_F, irm_D, irm_E}
417 The set of "int" is defined as:
418 -------------------------------
419 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
421 The set of "num" is defined as:
422 -------------------------------
423 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
424 irm_Is, irm_Iu, irm_Ls, irm_Lu}
427 The set of "data" is defined as:
428 -------------------------------
429 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
430 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
431 = {num || irm_C || irm_U || irm_P}
433 The set of "datab" is defined as:
434 ---------------------------------
435 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
436 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
439 The set of "dataM" is defined as:
440 ---------------------------------
441 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
442 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
446 #ifdef MODE_ACCESS_DEFINES
447 # undef mode_is_signed
448 # undef mode_is_float
452 # undef mode_is_datab
453 # undef mode_is_dataM
456 mode_is_signed (const ir_mode *mode)
464 mode_is_float (const ir_mode *mode)
468 return (get_mode_sort(mode) == irms_float_number);
472 mode_is_int (const ir_mode *mode)
476 return (get_mode_sort(mode) == irms_int_number);
479 int mode_is_character (const ir_mode *mode)
483 return (get_mode_sort(mode) == irms_character);
486 int mode_is_reference (const ir_mode *mode)
490 return (get_mode_sort(mode) == irms_reference);
494 mode_is_num (const ir_mode *mode)
498 return (mode_is_int(mode) || mode_is_float(mode));
502 mode_is_data (const ir_mode *mode)
506 return (mode_is_num(mode) || get_mode_sort(mode) == irms_character || get_mode_sort(mode) == irms_reference);
510 mode_is_datab (const ir_mode *mode)
514 return (mode_is_data(mode) || get_mode_sort(mode) == irms_internal_boolean);
518 mode_is_dataM (const ir_mode *mode)
522 return (mode_is_data(mode) || get_mode_modecode(mode) == irm_M);
524 #ifdef MODE_ACCESS_DEFINES
525 # define mode_is_signed(mode) (mode)->sign
526 # define mode_is_float(mode) ((mode)->sort == irms_float_number)
527 # define mode_is_int(mode) ((mode)->sort == irms_int_number)
528 # define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
529 # define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
530 # 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))
531 # 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))
533 /* Returns true if sm can be converted to lm without loss. */
535 smaller_mode(const ir_mode *sm, const ir_mode *lm)
541 if (sm == lm) return 1;
543 switch(get_mode_sort(sm))
545 case irms_int_number:
546 switch(get_mode_sort(lm))
548 case irms_int_number:
549 /* integers are convertable if
550 * - both have the same sign and lm is the larger one
551 * - lm is the signed one and is at least two bits larger
552 * (one for the sign, one for the highest bit of sm)
554 if (mode_is_signed(sm))
556 if ( mode_is_signed(lm) && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
559 else if (mode_is_signed(lm))
561 if (get_mode_size_bits(lm) > get_mode_size_bits(sm) + 1)
564 else if (get_mode_size_bits(lm) > get_mode_size_bits(sm))
570 case irms_float_number:
571 /* int to float works if the float is large enough */
579 case irms_float_number:
580 /* XXX currently only the three standard 32,64,80 bit floats
581 * are supported which can safely be converted */
582 if ( (get_mode_sort(lm) == irms_float_number)
583 && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
588 /* do exist machines out there with different pointer lenghts ?*/
599 /* ** initialization ** */
605 /* init flexible array */
607 obstack_init(&modes);
610 /* initialize predefined modes */
613 newmode.arithmetic = irma_none;
617 newmode.tv_priv = NULL;
619 /* Control Flow Modes*/
620 newmode.sort = irms_control_flow;
623 newmode.name = id_from_str("BB", 2);
624 newmode.code = irm_BB;
626 mode_BB = register_mode(&newmode);
629 newmode.name = id_from_str("X", 1);
630 newmode.code = irm_X;
632 mode_X = register_mode(&newmode);
635 newmode.sort = irms_memory;
638 newmode.name = id_from_str("M", 1);
639 newmode.code = irm_M;
641 mode_M = register_mode(&newmode);
643 /* Auxiliary Modes */
644 newmode.sort = irms_auxiliary,
647 newmode.name = id_from_str("T", 1);
648 newmode.code = irm_T;
650 mode_T = register_mode(&newmode);
653 newmode.name = id_from_str("ANY", 3);
654 newmode.code = irm_ANY;
656 mode_ANY = register_mode(&newmode);
659 newmode.name = id_from_str("BAD", 3);
660 newmode.code = irm_BAD;
662 mode_BAD = register_mode(&newmode);
664 /* Internal Boolean Modes */
665 newmode.sort = irms_internal_boolean;
668 newmode.name = id_from_str("b", 1);
669 newmode.code = irm_b;
671 mode_b = register_mode(&newmode);
675 /* Float Number Modes */
676 newmode.sort = irms_float_number;
677 newmode.arithmetic = irma_ieee754;
680 newmode.name = id_from_str("F", 1);
681 newmode.code = irm_F;
686 mode_F = register_mode(&newmode);
689 newmode.name = id_from_str("D", 1);
690 newmode.code = irm_D;
695 mode_D = register_mode(&newmode);
698 newmode.name = id_from_str("E", 1);
699 newmode.code = irm_E;
704 mode_E = register_mode(&newmode);
706 /* Integer Number Modes */
707 newmode.sort = irms_int_number;
708 newmode.arithmetic = irma_twos_complement;
711 newmode.name = id_from_str("Bs", 2);
712 newmode.code = irm_Bs;
717 mode_Bs = register_mode(&newmode);
720 newmode.name = id_from_str("Bu", 2);
721 newmode.code = irm_Bu;
722 newmode.arithmetic = irma_twos_complement;
727 mode_Bu = register_mode(&newmode);
729 /* signed short integer */
730 newmode.name = id_from_str("Hs", 2);
731 newmode.code = irm_Hs;
736 mode_Hs = register_mode(&newmode);
738 /* unsigned short integer */
739 newmode.name = id_from_str("Hu", 2);
740 newmode.code = irm_Hu;
745 mode_Hu = register_mode(&newmode);
748 newmode.name = id_from_str("Is", 2);
749 newmode.code = irm_Is;
754 mode_Is = register_mode(&newmode);
756 /* unsigned integer */
757 newmode.name = id_from_str("Iu", 2);
758 newmode.code = irm_Iu;
763 mode_Iu = register_mode(&newmode);
765 /* signed long integer */
766 newmode.name = id_from_str("Ls", 2);
767 newmode.code = irm_Ls;
772 mode_Ls = register_mode(&newmode);
774 /* unsigned long integer */
775 newmode.name = id_from_str("Lu", 2);
776 newmode.code = irm_Lu;
781 mode_Lu = register_mode(&newmode);
783 /* Character Modes */
784 newmode.sort = irms_character;
785 newmode.arithmetic = irma_none;
788 newmode.name = id_from_str("C", 1);
789 newmode.code = irm_C;
794 mode_C = register_mode(&newmode);
796 /* Unicode character */
797 newmode.name = id_from_str("U", 1);
798 newmode.code = irm_U;
803 mode_U = register_mode(&newmode);
805 /* Reference Modes */
806 newmode.sort = irms_reference;
807 newmode.arithmetic = irma_twos_complement;
810 newmode.name = id_from_str("P", 1);
811 newmode.code = irm_P;
816 mode_P = register_mode(&newmode);