/*
- * 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_int_number:
case irms_float_number:
mode->min = get_tarval_min(mode);
ir_mode *mode_Iu;
ir_mode *mode_Ls; /* 64 bit */
ir_mode *mode_Lu;
+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_modeIu(void) { return mode_Iu; }
ir_mode *get_modeLs(void) { return mode_Ls; }
ir_mode *get_modeLu(void) { return mode_Lu; }
-ir_mode *get_modeC(void) { return mode_C; }
-ir_mode *get_modeU(void) { return mode_U; }
+ir_mode *get_modeLLs(void){ return mode_LLs; }
+ir_mode *get_modeLLu(void){ return mode_LLu; }
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(get_mode_modecode(mode) < (modecode) num_modes);
assert(mode_is_data(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_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);
mode_Lu = 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;
+ /* signed long long integer */
+ newmode.name = new_id_from_chars("LLs", 3);
+ newmode.code = irm_LLs;
+ newmode.sign = 1;
+ newmode.size = 128;
+ newmode.modulo_shift = 128;
- mode_C = register_mode(&newmode);
+ mode_LLs = register_mode(&newmode);
- /* Unicode character */
- newmode.name = new_id_from_chars("U", 1);
- newmode.code = irm_U;
+ /* unsigned long long integer */
+ newmode.name = new_id_from_chars("LLu", 3);
+ newmode.code = irm_LLu;
newmode.sign = 0;
- newmode.size = 16;
+ newmode.size = 128;
+ newmode.modulo_shift = 128;
- mode_U = register_mode(&newmode);
+ mode_LLu = register_mode(&newmode);
- /* Reference Modes */
- newmode.sort = irms_reference;
+ /* Reference Mode */
+ newmode.sort = irms_reference;
newmode.arithmetic = irma_twos_complement;
/* pointer */
/* for floating point, we know that IEEE 754 has +0 and -0,
* but always handles it identical.
*/
- if (mode->sort == irms_float_number)
- return mode->arithmetic == irma_ieee754 ? 0 : 1;
- return 0;
+ return
+ mode->sort == irms_float_number &&
+ mode->arithmetic != irma_ieee754;
}
/*
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;
}