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 )
233 case irms_control_flow:
235 case irms_internal_boolean:
236 assert(0 && "internal modes cannot be user defined");
240 case irms_float_number:
241 assert(0 && "not yet implemented");
245 case irms_int_number:
250 mode_tmpl.name = new_id_from_str(name);
251 mode_tmpl.sort = sort;
252 mode_tmpl.size = bit_size;
253 mode_tmpl.align = align;
254 mode_tmpl.sign = sign ? 1 : 0;
255 mode_tmpl.arithmetic = arithmetic;
256 mode_tmpl.tv_priv = NULL;
258 /* first check if there already is a matching mode */
259 mode = find_mode(&mode_tmpl);
266 return register_mode(&mode_tmpl);
270 /* Functions for the direct access to all attributes od a ir_mode */
272 get_mode_modecode(const ir_mode *mode)
279 get_mode_ident(const ir_mode *mode)
286 get_mode_name(const ir_mode *mode)
289 return id_to_str(mode->name);
293 get_mode_sort(const ir_mode* mode)
300 get_mode_size_bits(const ir_mode *mode)
306 int get_mode_size_bytes(const ir_mode *mode) {
307 int size = get_mode_size_bits(mode);
309 if ((size & 7) != 0) return -1;
314 get_mode_align (const ir_mode *mode)
321 get_mode_sign (const ir_mode *mode)
327 int get_mode_arithmetic (const ir_mode *mode)
330 return mode->arithmetic;
333 void* get_mode_link(const ir_mode *mode)
339 void set_mode_link(ir_mode *mode, void *l)
346 get_mode_min (ir_mode *mode)
350 assert(get_mode_modecode(mode) < num_modes);
351 assert(mode_is_data(mode));
357 get_mode_max (ir_mode *mode)
361 assert(get_mode_modecode(mode) < num_modes);
362 assert(mode_is_data(mode));
368 get_mode_null (ir_mode *mode)
372 assert(get_mode_modecode(mode) < num_modes);
373 assert(mode_is_data(mode));
379 get_mode_one (ir_mode *mode)
383 assert(get_mode_modecode(mode) < num_modes);
384 assert(mode_is_data(mode));
390 get_mode_infinite(ir_mode *mode)
394 assert(get_mode_modecode(mode) < num_modes);
395 assert(mode_is_float(mode));
397 return get_tarval_inf(mode);
401 get_mode_NAN(ir_mode *mode)
405 assert(get_mode_modecode(mode) < num_modes);
406 assert(mode_is_float(mode));
408 return get_tarval_nan(mode);
412 is_mode (void *thing) {
414 if (get_kind(thing) == k_ir_mode)
420 /* Functions to check, whether a modecode is signed, float, int, num, data,
421 datab or dataM. For more exact definitions read the corresponding pages
422 in the firm documentation or the followingenumeration
424 The set of "float" is defined as:
425 ---------------------------------
426 float = {irm_F, irm_D, irm_E}
428 The set of "int" is defined as:
429 -------------------------------
430 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
432 The set of "num" is defined as:
433 -------------------------------
434 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
435 irm_Is, irm_Iu, irm_Ls, irm_Lu}
438 The set of "data" is defined as:
439 -------------------------------
440 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
441 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P}
442 = {num || irm_C || irm_U || irm_P}
444 The set of "datab" is defined as:
445 ---------------------------------
446 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
447 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b}
450 The set of "dataM" is defined as:
451 ---------------------------------
452 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
453 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M}
457 #ifdef MODE_ACCESS_DEFINES
458 # undef mode_is_signed
459 # undef mode_is_float
464 # undef mode_is_datab
465 # undef mode_is_dataM
468 mode_is_signed (const ir_mode *mode)
476 mode_is_float (const ir_mode *mode)
480 return (get_mode_sort(mode) == irms_float_number);
484 mode_is_int (const ir_mode *mode)
488 return (get_mode_sort(mode) == irms_int_number);
491 int mode_is_character (const ir_mode *mode)
495 return (get_mode_sort(mode) == irms_character);
498 int mode_is_reference (const ir_mode *mode)
502 return (get_mode_sort(mode) == irms_reference);
506 mode_is_num (const ir_mode *mode)
510 return (mode_is_int(mode) || mode_is_float(mode));
514 mode_is_numP (const ir_mode *mode)
518 return (mode_is_int(mode) || mode_is_float(mode) || mode_is_reference(mode));
522 mode_is_data (const ir_mode *mode)
526 return (mode_is_num(mode) || get_mode_sort(mode) == irms_character || get_mode_sort(mode) == irms_reference);
530 mode_is_datab (const ir_mode *mode)
534 return (mode_is_data(mode) || get_mode_sort(mode) == irms_internal_boolean);
538 mode_is_dataM (const ir_mode *mode)
542 return (mode_is_data(mode) || get_mode_modecode(mode) == irm_M);
544 #ifdef MODE_ACCESS_DEFINES
545 # define mode_is_signed(mode) (mode)->sign
546 # define mode_is_float(mode) ((mode)->sort == irms_float_number)
547 # define mode_is_int(mode) ((mode)->sort == irms_int_number)
548 # define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
549 # define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
550 # 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))
551 # 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))
553 /* Returns true if sm can be converted to lm without loss. */
555 smaller_mode(const ir_mode *sm, const ir_mode *lm)
561 if (sm == lm) return 1;
563 switch(get_mode_sort(sm))
565 case irms_int_number:
566 switch(get_mode_sort(lm))
568 case irms_int_number:
569 /* integers are convertable if
570 * - both have the same sign and lm is the larger one
571 * - lm is the signed one and is at least two bits larger
572 * (one for the sign, one for the highest bit of sm)
574 if (mode_is_signed(sm))
576 if ( mode_is_signed(lm) && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
579 else if (mode_is_signed(lm))
581 if (get_mode_size_bits(lm) > get_mode_size_bits(sm) + 1)
584 else if (get_mode_size_bits(lm) > get_mode_size_bits(sm))
590 case irms_float_number:
591 /* int to float works if the float is large enough */
599 case irms_float_number:
600 /* XXX currently only the three standard 32,64,80 bit floats
601 * are supported which can safely be converted */
602 if ( (get_mode_sort(lm) == irms_float_number)
603 && (get_mode_size_bits(lm) > get_mode_size_bits(sm)) )
608 /* do exist machines out there with different pointer lenghts ?*/
619 /* ** initialization ** */
625 /* init flexible array */
627 obstack_init(&modes);
630 /* initialize predefined modes */
633 newmode.arithmetic = irma_none;
637 newmode.tv_priv = NULL;
639 /* Control Flow Modes*/
640 newmode.sort = irms_control_flow;
643 newmode.name = id_from_str("BB", 2);
644 newmode.code = irm_BB;
646 mode_BB = register_mode(&newmode);
649 newmode.name = id_from_str("X", 1);
650 newmode.code = irm_X;
652 mode_X = register_mode(&newmode);
655 newmode.sort = irms_memory;
658 newmode.name = id_from_str("M", 1);
659 newmode.code = irm_M;
661 mode_M = register_mode(&newmode);
663 /* Auxiliary Modes */
664 newmode.sort = irms_auxiliary,
667 newmode.name = id_from_str("T", 1);
668 newmode.code = irm_T;
670 mode_T = register_mode(&newmode);
673 newmode.name = id_from_str("ANY", 3);
674 newmode.code = irm_ANY;
676 mode_ANY = register_mode(&newmode);
679 newmode.name = id_from_str("BAD", 3);
680 newmode.code = irm_BAD;
682 mode_BAD = register_mode(&newmode);
684 /* Internal Boolean Modes */
685 newmode.sort = irms_internal_boolean;
688 newmode.name = id_from_str("b", 1);
689 newmode.code = irm_b;
691 mode_b = register_mode(&newmode);
695 /* Float Number Modes */
696 newmode.sort = irms_float_number;
697 newmode.arithmetic = irma_ieee754;
700 newmode.name = id_from_str("F", 1);
701 newmode.code = irm_F;
706 mode_F = register_mode(&newmode);
709 newmode.name = id_from_str("D", 1);
710 newmode.code = irm_D;
715 mode_D = register_mode(&newmode);
718 newmode.name = id_from_str("E", 1);
719 newmode.code = irm_E;
724 mode_E = register_mode(&newmode);
726 /* Integer Number Modes */
727 newmode.sort = irms_int_number;
728 newmode.arithmetic = irma_twos_complement;
731 newmode.name = id_from_str("Bs", 2);
732 newmode.code = irm_Bs;
737 mode_Bs = register_mode(&newmode);
740 newmode.name = id_from_str("Bu", 2);
741 newmode.code = irm_Bu;
742 newmode.arithmetic = irma_twos_complement;
747 mode_Bu = register_mode(&newmode);
749 /* signed short integer */
750 newmode.name = id_from_str("Hs", 2);
751 newmode.code = irm_Hs;
756 mode_Hs = register_mode(&newmode);
758 /* unsigned short integer */
759 newmode.name = id_from_str("Hu", 2);
760 newmode.code = irm_Hu;
765 mode_Hu = register_mode(&newmode);
768 newmode.name = id_from_str("Is", 2);
769 newmode.code = irm_Is;
774 mode_Is = register_mode(&newmode);
776 /* unsigned integer */
777 newmode.name = id_from_str("Iu", 2);
778 newmode.code = irm_Iu;
783 mode_Iu = register_mode(&newmode);
785 /* signed long integer */
786 newmode.name = id_from_str("Ls", 2);
787 newmode.code = irm_Ls;
792 mode_Ls = register_mode(&newmode);
794 /* unsigned long integer */
795 newmode.name = id_from_str("Lu", 2);
796 newmode.code = irm_Lu;
801 mode_Lu = register_mode(&newmode);
803 /* Character Modes */
804 newmode.sort = irms_character;
805 newmode.arithmetic = irma_none;
808 newmode.name = id_from_str("C", 1);
809 newmode.code = irm_C;
814 mode_C = register_mode(&newmode);
816 /* Unicode character */
817 newmode.name = id_from_str("U", 1);
818 newmode.code = irm_U;
823 mode_U = register_mode(&newmode);
825 /* Reference Modes */
826 newmode.sort = irms_reference;
827 newmode.arithmetic = irma_twos_complement;
830 newmode.name = id_from_str("P", 1);
831 newmode.code = irm_P;
836 mode_P = register_mode(&newmode);
838 /* set the machine specific modes to the predifined ones */
839 mode_P_mach = mode_P;