/*
- * Project: libFIRM
- * File name: ir/ir/irmode.c
- * Purpose: Data modes of operations.
- * Author: Martin Trapp, Christian Schaefer
- * Modified by: Goetz Lindenmaier, Mathias Heil
- * Created:
- * CVS-ID: $Id$
- * Copyright: (c) 1998-2003 Universität Karlsruhe
- * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief Data modes of operations.
+ * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Mathias Heil
+ * @version $Id$
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
static struct obstack modes;
/** number of defined modes */
-static int num_modes;
+static int num_modes = 0;
/* * *
* local functions
*/
static void set_mode_values(ir_mode* mode) {
switch (get_mode_sort(mode)) {
- case irms_character:
+ case irms_reference:
case irms_int_number:
case irms_float_number:
mode->min = get_tarval_min(mode);
mode->null = get_tarval_null(mode);
mode->one = get_tarval_one(mode);
mode->minus_one = get_tarval_minus_one(mode);
+ if(get_mode_sort(mode) != irms_float_number) {
+ mode->all_one = get_tarval_all_one(mode);
+ } else {
+ mode->all_one = tarval_bad;
+ }
break;
case irms_internal_boolean:
mode->null = tarval_b_false;
mode->one = tarval_b_true;
mode->minus_one = tarval_bad;
- break;
-
- case irms_reference:
- mode->min = tarval_bad;
- mode->max = tarval_bad;
- mode->null = get_tarval_null(mode);
- mode->one = tarval_bad;
- mode->minus_one = tarval_bad;
+ mode->all_one = tarval_b_true;
break;
case irms_auxiliary:
ir_mode *mode_LLs; /* 128 bit */
ir_mode *mode_LLu;
-ir_mode *mode_C;
-ir_mode *mode_U;
ir_mode *mode_b;
ir_mode *mode_P;
ir_mode *get_modeLu(void) { return mode_Lu; }
ir_mode *get_modeLLs(void){ return mode_LLs; }
ir_mode *get_modeLLu(void){ return mode_LLu; }
-ir_mode *get_modeC(void) { return mode_C; }
-ir_mode *get_modeU(void) { return mode_U; }
ir_mode *get_modeb(void) { return mode_b; }
ir_mode *get_modeP(void) { return mode_P; }
ir_mode *get_modeX(void) { return mode_X; }
mode = (ir_mode *)obstack_copy(&modes, new_mode, sizeof(*mode));
mode->kind = k_ir_mode;
- if (num_modes >= irm_max) mode->code = num_modes;
- num_modes++;
+ if (num_modes >= irm_max) {
+ mode->code = num_modes;
+ }
+ num_modes++;
/* add the new mode to the irp list of modes */
add_irp_mode(mode);
case irms_float_number:
case irms_int_number:
case irms_reference:
- case irms_character:
mode = register_mode(&mode_tmpl);
}
return mode;
break;
case irms_reference:
- case irms_character:
assert(0 && "only integer and floating point modes can be vectorized");
break;
return _get_mode_sign(mode);
}
-int
+mode_arithmetic
(get_mode_arithmetic)(const ir_mode *mode) {
return get_mode_arithmetic(mode);
}
tarval *
get_mode_min(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_data(mode));
return mode->min;
tarval *
get_mode_max(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_data(mode));
return mode->max;
tarval *
get_mode_null(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
- assert(mode_is_data(mode));
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(mode_is_datab(mode));
return mode->null;
}
tarval *
get_mode_one(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_data(mode));
return mode->one;
tarval *
get_mode_minus_one(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_data(mode));
return mode->minus_one;
}
+tarval *
+get_mode_all_one(ir_mode *mode) {
+ assert(mode);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(mode_is_data(mode) || mode == mode_b);
+ return mode->all_one;
+}
+
tarval *
get_mode_infinite(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_float(mode));
return get_tarval_plus_inf(mode);
tarval *
get_mode_NAN(ir_mode *mode) {
assert(mode);
- assert(get_mode_modecode(mode) < num_modes);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_float(mode));
return get_tarval_nan(mode);
return _mode_is_int(mode);
}
-int
-(mode_is_character)(const ir_mode *mode) {
- return _mode_is_character(mode);
-}
-
int
(mode_is_reference)(const ir_mode *mode) {
return _mode_is_reference(mode);
return _mode_is_num(mode);
}
-int
-(mode_is_numP)(const ir_mode *mode) {
- return _mode_is_numP(mode);
-}
-
int
(mode_is_data)(const ir_mode *mode) {
return _mode_is_data(mode);
case irms_int_number:
switch (get_mode_sort(lm)) {
case irms_int_number:
+ if(get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
+ return 0;
+
+ /* only two complement implemented */
+ assert(get_mode_arithmetic(sm)==irma_twos_complement);
+
/* 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;
+ if(mode_is_signed(sm)) {
+ if(!mode_is_signed(lm))
+ return 0;
+ return sm_bits <= lm_bits;
+ } else {
+ if(mode_is_signed(lm)) {
+ return sm_bits < lm_bits;
+ }
+ return sm_bits <= lm_bits;
}
break;
/* do exist machines out there with different pointer lenghts ?*/
return 0;
+ case irms_internal_boolean:
+ return mode_is_int(lm);
+
default:
break;
}
/* initialization, build the default modes */
void
-init_mode (void) {
+init_mode(void) {
ir_mode newmode;
obstack_init(&modes);
mode_LLu = register_mode(&newmode);
- /* Character Modes */
- newmode.sort = irms_character;
- newmode.arithmetic = irma_twos_complement;
- newmode.modulo_shift = 0;
-
- /* Character */
- newmode.name = new_id_from_chars("C", 1);
- newmode.code = irm_C;
- newmode.sign = 0;
- newmode.size = 8;
-
- mode_C = register_mode(&newmode);
-
- /* Unicode character */
- newmode.name = new_id_from_chars("U", 1);
- newmode.code = irm_U;
- newmode.sign = 0;
- newmode.size = 16;
-
- mode_U = register_mode(&newmode);
-
- /* Reference Modes */
- newmode.sort = irms_reference;
+ /* Reference Mode */
+ newmode.sort = irms_reference;
newmode.arithmetic = irma_twos_complement;
/* pointer */
mode_Ls = NULL;
mode_Lu = NULL;
- mode_C = NULL;
- mode_U = NULL;
mode_b = NULL;
- mode_P = NULL;
+ mode_P = NULL;
mode_P_code = NULL;
mode_P_data = NULL;
}