-#ifdef MODE_ACCESS_DEFINES
-# define mode_is_signed(mode) (mode)->sign
-# define mode_is_float(mode) ((mode)->sort == irms_float_number)
-# define mode_is_int(mode) ((mode)->sort == irms_int_number)
-# define mode_is_num(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number))
-# define mode_is_data(mode) (((mode)->sort == irms_float_number) || ((mode)->sort == irms_int_number) || ((mode)->sort == irms_character) || ((mode)->sort == irms_reference))
-# 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))
-# 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))
-#endif
-/* Returns true if sm can be converted to lm without loss. */
-int
-smaller_mode(const ir_mode *sm, const ir_mode *lm)
-{
- int sm_bits, lm_bits;
-
- ANNOUNCE();
- assert(sm);
- assert(lm);
-
- if (sm == lm) return 1;
-
- sm_bits = get_mode_size_bits(sm);
- lm_bits = get_mode_size_bits(lm);
-
- switch(get_mode_sort(sm))
- {
- case irms_int_number:
- switch(get_mode_sort(lm))
- {
- case irms_int_number:
- /* integers are convertable if
- * - both have the same sign and lm is the larger one
- * - lm is the signed one and is at least two bits larger
- * (one for the sign, one for the highest bit of sm)
- * - sm & lm are two_complement and lm has greater or equal number of bits
- */
- if ( get_mode_arithmetic(sm) == get_mode_arithmetic(lm)
- && get_mode_arithmetic(sm) == irma_twos_complement) {
- return lm_bits >= sm_bits;
- }
- else if (mode_is_signed(sm))
- {
- if ( mode_is_signed(lm) && (lm_bits >= sm_bits) )
- return 1;
- }
- else if (mode_is_signed(lm))
- {
- if (lm_bits > sm_bits + 1)
- return 1;
- }
- else if (lm_bits >= sm_bits)
- {
- return 1;
- }
- break;
-
- case irms_float_number:
- /* int to float works if the float is large enough */
- return 0;
-
- default:
- break;
- }
- break;
-
- case irms_float_number:
- if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
- if ( (get_mode_sort(lm) == irms_float_number)
- && (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
- return 1;
- }
- break;
-
- case irms_reference:
- /* do exist machines out there with different pointer lenghts ?*/
- return 0;
-
- default:
- break;
- }
-
- /* else */
- return 0;
-}
-
-/* ** initialization ** */
-void
-init_mode (void)
-{
- ir_mode newmode;
- ANNOUNCE();
- /* init flexible array */
-
- obstack_init(&modes);
-
- num_modes = 0;
- /* initialize predefined modes */
-
- /* Internal Modes */
- newmode.arithmetic = irma_none;
- newmode.size = 0;
- newmode.align = 0;
- newmode.sign = 0;
- newmode.modulo_shift = 0;
- newmode.link = NULL;
- newmode.tv_priv = NULL;
-
- /* Control Flow Modes*/
- newmode.sort = irms_control_flow;
-
- /* Basic Block */
- newmode.name = id_from_str("BB", 2);
- newmode.code = irm_BB;
-
- mode_BB = register_mode(&newmode);
-
-/* eXecution */
- newmode.name = id_from_str("X", 1);
- newmode.code = irm_X;
-
- mode_X = register_mode(&newmode);
-
- /* Memory Modes */
- newmode.sort = irms_memory;
-
- /* Memory */
- newmode.name = id_from_str("M", 1);
- newmode.code = irm_M;
-
- mode_M = register_mode(&newmode);
-
- /* Auxiliary Modes */
- newmode.sort = irms_auxiliary,
-
- /* Tuple */
- newmode.name = id_from_str("T", 1);
- newmode.code = irm_T;
-
- mode_T = register_mode(&newmode);
-
- /* ANY */
- newmode.name = id_from_str("ANY", 3);
- newmode.code = irm_ANY;
-
- mode_ANY = register_mode(&newmode);
-
- /* BAD */
- newmode.name = id_from_str("BAD", 3);
- newmode.code = irm_BAD;