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 */
160 /* machine specific modes */
161 ir_mode *mode_P_mach; /* machine specific pointer mode */
164 * functions defined in irmode.h
167 /* JNI access functions */
168 INLINE ir_mode *get_modeT(void) { ANNOUNCE(); return mode_T; }
169 INLINE ir_mode *get_modeF(void) { ANNOUNCE(); return mode_F; }
170 INLINE ir_mode *get_modeD(void) { ANNOUNCE(); return mode_D; }
171 INLINE ir_mode *get_modeE(void) { ANNOUNCE(); return mode_E; }
172 INLINE ir_mode *get_modeBs(void) { ANNOUNCE(); return mode_Bs; }
173 INLINE ir_mode *get_modeBu(void) { ANNOUNCE(); return mode_Bu; }
174 INLINE ir_mode *get_modeHs(void) { ANNOUNCE(); return mode_Hs; }
175 INLINE ir_mode *get_modeHu(void) { ANNOUNCE(); return mode_Hu; }
176 INLINE ir_mode *get_modeIs(void) { ANNOUNCE(); return mode_Is; }
177 INLINE ir_mode *get_modeIu(void) { ANNOUNCE(); return mode_Iu; }
178 INLINE ir_mode *get_modeLs(void) { ANNOUNCE(); return mode_Ls; }
179 INLINE ir_mode *get_modeLu(void) { ANNOUNCE(); return mode_Lu; }
180 INLINE ir_mode *get_modeC(void) { ANNOUNCE(); return mode_C; }
181 INLINE ir_mode *get_modeU(void) { ANNOUNCE(); return mode_U; }
182 INLINE ir_mode *get_modeb(void) { ANNOUNCE(); return mode_b; }
183 INLINE ir_mode *get_modeP(void) { ANNOUNCE(); return mode_P; }
184 INLINE ir_mode *get_modeX(void) { ANNOUNCE(); return mode_X; }
185 INLINE ir_mode *get_modeM(void) { ANNOUNCE(); return mode_M; }
186 INLINE ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; }
187 INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; }
188 INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; }
191 ir_mode *get_modeP_mach(void) { ANNOUNCE(); return mode_P_mach; }
192 void set_modeP_mach(ir_mode *p) {
194 assert(mode_is_reference(p));
199 * Registers a new mode if not defined yet, else returns
200 * the "equivalent" one.
202 static ir_mode *register_mode(const ir_mode* new_mode)
204 ir_mode *mode = NULL;
209 /* copy mode struct to modes array */
210 mode=(ir_mode*) obstack_copy(&modes, new_mode, sizeof(ir_mode));
212 mode->kind = k_ir_mode;
213 if(num_modes>=irm_max) mode->code = num_modes;
216 set_mode_values(mode);
222 * Creates a new mode.
224 ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic )
229 mode_tmpl.name = new_id_from_str(name);
230 mode_tmpl.sort = sort;
231 mode_tmpl.size = bit_size;
232 mode_tmpl.align = align;
233 mode_tmpl.sign = sign ? 1 : 0;
234 mode_tmpl.arithmetic = arithmetic;
235 mode_tmpl.link = NULL;
236 mode_tmpl.tv_priv = NULL;
238 mode = find_mode(&mode_tmpl);
248 case irms_control_flow:
250 case irms_internal_boolean:
251 assert(0 && "internal modes cannot be user defined");
254 case irms_float_number:
255 assert(0 && "not yet implemented");
258 case irms_int_number:
261 return register_mode(&mode_tmpl);
263 return NULL; /* to shut up gcc */
266 /* Functions for the direct access to all attributes od a ir_mode */
268 get_mode_modecode(const ir_mode *mode)
275 get_mode_ident(const ir_mode *mode)
282 get_mode_name(const ir_mode *mode)
285 return id_to_str(mode->name);
289 get_mode_sort(const ir_mode* mode)
296 get_mode_size_bits(const ir_mode *mode)
302 int get_mode_size_bytes(const ir_mode *mode) {
303 int size = get_mode_size_bits(mode);
305 if ((size & 7) != 0) return -1;
310 get_mode_align (const ir_mode *mode)
317 get_mode_sign (const ir_mode *mode)
323 int get_mode_arithmetic (const ir_mode *mode)
326 return mode->arithmetic;
329 void* get_mode_link(const ir_mode *mode)
335 void set_mode_link(ir_mode *mode, void *l)
342 get_mode_min (ir_mode *mode)
346 assert(get_mode_modecode(mode) < num_modes);
347 assert(mode_is_data(mode));
353 get_mode_max (ir_mode *mode)
357 assert(get_mode_modecode(mode) < num_modes);
358 assert(mode_is_data(mode));
364 get_mode_null (ir_mode *mode)
368 assert(get_mode_modecode(mode) < num_modes);
369 assert(mode_is_data(mode));
375 get_mode_one (ir_mode *mode)
379 assert(get_mode_modecode(mode) < num_modes);
380 assert(mode_is_data(mode));
386 get_mode_infinite(ir_mode *mode)
390 assert(get_mode_modecode(mode) < num_modes);
391 assert(mode_is_float(mode));
393 return get_tarval_inf(mode);
397 get_mode_NAN(ir_mode *mode)
401 assert(get_mode_modecode(mode) < num_modes);
402 assert(mode_is_float(mode));
404 return get_tarval_nan(mode);
408 is_mode (void *thing) {
410 if (get_kind(thing) == k_ir_mode)
416 /* Functions to check, whether a modecode is signed, float, int, num, data,
417 datab or dataM. For more exact definitions read the corresponding pages
418 in the firm documentation or the followingenumeration
420 The set of "float" is defined as:
421 ---------------------------------
422 float = {irm_F, irm_D, irm_E}
424 The set of "int" is defined as:
425 -------------------------------
426 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
428 The set of "num" is defined as:
429 -------------------------------
430 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
431 irm_Is, irm_Iu, irm_Ls, irm_Lu}
434 The set of "data" is defined as:
435 -------------------------------
436 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
437 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
438 = {num || irm_C || irm_U || irm_P}
440 The set of "datab" is defined as:
441 ---------------------------------
442 datab = {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, irm_b}
446 The set of "dataM" is defined as:
447 ---------------------------------
448 dataM = {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_M}
453 #ifdef MODE_ACCESS_DEFINES
454 # undef mode_is_signed
455 # undef mode_is_float
460 # undef mode_is_datab
461 # undef mode_is_dataM
464 mode_is_signed (const ir_mode *mode)
472 mode_is_float (const ir_mode *mode)
476 return (get_mode_sort(mode) == irms_float_number);
480 mode_is_int (const ir_mode *mode)
484 return (get_mode_sort(mode) == irms_int_number);
487 int mode_is_character (const ir_mode *mode)
491 return (get_mode_sort(mode) == irms_character);
494 int mode_is_reference (const ir_mode *mode)
498 return (get_mode_sort(mode) == irms_reference);
502 mode_is_num (const ir_mode *mode)
506 return (mode_is_int(mode) || mode_is_float(mode));
510 mode_is_numP (const ir_mode *mode)
514 return (mode_is_int(mode) || mode_is_float(mode) || mode_is_reference(mode));
518 mode_is_data (const ir_mode *mode)
522 return (mode_is_num(mode) || get_mode_sort(mode) == irms_character || get_mode_sort(mode) == irms_reference);
526 mode_is_datab (const ir_mode *mode)
530 return (mode_is_data(mode) || get_mode_sort(mode) == irms_internal_boolean);
534 mode_is_dataM (const ir_mode *mode)
538 return (mode_is_data(mode) || get_mode_modecode(mode) == irm_M);
540 #ifdef MODE_ACCESS_DEFINES
541 # define mode_is_signed(mode) (mode)->sign
542 # define mode_is_float(mode) ((mode)->sort == irms_float_number)
543 # define mode_is_int(mode) ((mode)->sort == irms_int_number)
544 # define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
545 # define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
546 # 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))
547 # 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))
549 /* Returns true if sm can be converted to lm without loss. */
551 smaller_mode(const ir_mode *sm, const ir_mode *lm)
557 if (sm == lm) return 1;
559 switch(get_mode_sort(sm))
561 case irms_int_number:
562 switch(get_mode_sort(lm))
564 case irms_int_number:
565 /* integers are convertable if
566 * - both have the same sign and lm is the larger one
567 * - lm is the signed one and is at least two bits larger
568 * (one for the sign, one for the highest bit of sm)
570 if (mode_is_signed(sm))
572 if ( mode_is_signed(lm) && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
575 else if (mode_is_signed(lm))
577 if (get_mode_size_bits(lm) > get_mode_size_bits(sm) + 1)
580 else if (get_mode_size_bits(lm) > get_mode_size_bits(sm))
586 case irms_float_number:
587 /* int to float works if the float is large enough */
595 case irms_float_number:
596 /* XXX currently only the three standard 32,64,80 bit floats
597 * are supported which can safely be converted */
598 if ( (get_mode_sort(lm) == irms_float_number)
599 && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
604 /* do exist machines out there with different pointer lenghts ?*/
615 /* ** initialization ** */
621 /* init flexible array */
623 obstack_init(&modes);
626 /* initialize predefined modes */
629 newmode.arithmetic = irma_none;
634 newmode.tv_priv = NULL;
636 /* Control Flow Modes*/
637 newmode.sort = irms_control_flow;
640 newmode.name = id_from_str("BB", 2);
641 newmode.code = irm_BB;
643 mode_BB = register_mode(&newmode);
646 newmode.name = id_from_str("X", 1);
647 newmode.code = irm_X;
649 mode_X = register_mode(&newmode);
652 newmode.sort = irms_memory;
655 newmode.name = id_from_str("M", 1);
656 newmode.code = irm_M;
658 mode_M = register_mode(&newmode);
660 /* Auxiliary Modes */
661 newmode.sort = irms_auxiliary,
664 newmode.name = id_from_str("T", 1);
665 newmode.code = irm_T;
667 mode_T = register_mode(&newmode);
670 newmode.name = id_from_str("ANY", 3);
671 newmode.code = irm_ANY;
673 mode_ANY = register_mode(&newmode);
676 newmode.name = id_from_str("BAD", 3);
677 newmode.code = irm_BAD;
679 mode_BAD = register_mode(&newmode);
681 /* Internal Boolean Modes */
682 newmode.sort = irms_internal_boolean;
685 newmode.name = id_from_str("b", 1);
686 newmode.code = irm_b;
688 mode_b = register_mode(&newmode);
692 /* Float Number Modes */
693 newmode.sort = irms_float_number;
694 newmode.arithmetic = irma_ieee754;
697 newmode.name = id_from_str("F", 1);
698 newmode.code = irm_F;
703 mode_F = register_mode(&newmode);
706 newmode.name = id_from_str("D", 1);
707 newmode.code = irm_D;
712 mode_D = register_mode(&newmode);
715 newmode.name = id_from_str("E", 1);
716 newmode.code = irm_E;
721 mode_E = register_mode(&newmode);
723 /* Integer Number Modes */
724 newmode.sort = irms_int_number;
725 newmode.arithmetic = irma_twos_complement;
728 newmode.name = id_from_str("Bs", 2);
729 newmode.code = irm_Bs;
734 mode_Bs = register_mode(&newmode);
737 newmode.name = id_from_str("Bu", 2);
738 newmode.code = irm_Bu;
739 newmode.arithmetic = irma_twos_complement;
744 mode_Bu = register_mode(&newmode);
746 /* signed short integer */
747 newmode.name = id_from_str("Hs", 2);
748 newmode.code = irm_Hs;
753 mode_Hs = register_mode(&newmode);
755 /* unsigned short integer */
756 newmode.name = id_from_str("Hu", 2);
757 newmode.code = irm_Hu;
762 mode_Hu = register_mode(&newmode);
765 newmode.name = id_from_str("Is", 2);
766 newmode.code = irm_Is;
771 mode_Is = register_mode(&newmode);
773 /* unsigned integer */
774 newmode.name = id_from_str("Iu", 2);
775 newmode.code = irm_Iu;
780 mode_Iu = register_mode(&newmode);
782 /* signed long integer */
783 newmode.name = id_from_str("Ls", 2);
784 newmode.code = irm_Ls;
789 mode_Ls = register_mode(&newmode);
791 /* unsigned long integer */
792 newmode.name = id_from_str("Lu", 2);
793 newmode.code = irm_Lu;
798 mode_Lu = register_mode(&newmode);
800 /* Character Modes */
801 newmode.sort = irms_character;
802 newmode.arithmetic = irma_none;
805 newmode.name = id_from_str("C", 1);
806 newmode.code = irm_C;
811 mode_C = register_mode(&newmode);
813 /* Unicode character */
814 newmode.name = id_from_str("U", 1);
815 newmode.code = irm_U;
820 mode_U = register_mode(&newmode);
822 /* Reference Modes */
823 newmode.sort = irms_reference;
824 newmode.arithmetic = irma_twos_complement;
827 newmode.name = id_from_str("P", 1);
828 newmode.code = irm_P;
833 mode_P = register_mode(&newmode);
835 /* set the machine specific modes to the predifined ones */
836 mode_P_mach = mode_P;