removed makro calls, dokumentation
[libfirm] / ir / ir / irmode.c
index 0eb0662..8f2dc5d 100644 (file)
@@ -1,24 +1,29 @@
-/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Martin Trapp, Christian Schaefer
-**
-*/
+/*
+ * 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.
+ */
 
-/* $Id$ */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
-# include "irmode_t.h"
-# include "ident.h"
 # include <stdlib.h>
 # include <stddef.h>
 # include <string.h>
+# include <stdbool.h>
+
+# include "irmode_t.h"
+# include "ident.h"
 # include "tv.h"
 # include "obst.h"
-# include "misc.h"
 
 #if 0
 static long long count = 0;
@@ -51,7 +56,13 @@ static int num_modes;
 INLINE static int modes_are_equal(const ir_mode *m, const ir_mode *n)
 {
   if (m == n) return 1;
-  if (0 == memcmp(&m->sort, &n->sort, offsetof(ir_mode,min) - offsetof(ir_mode,sort))) return 1;
+  if (m->sort == n->sort &&
+      m->arithmetic == n->arithmetic &&
+      m->size == n->size &&
+      m->align == n->align &&
+      m->sign == n->sign  &&
+      m->modulo_shift == n->modulo_shift)
+    return 1;
 
   return 0;
 }
@@ -66,18 +77,18 @@ static ir_mode *find_mode(const ir_mode *m)
   ir_mode *n;
   struct _obstack_chunk        *p;
 
-  p=modes.chunk;
-  for( n=(ir_mode*) p->contents; (char *)n < modes.next_free; n+=sizeof(ir_mode) )
-  {
-    if(modes_are_equal(n,m)) return n;
+  p = modes.chunk;
+  for ( n = (ir_mode *)p->contents; (char *)(n+1) <= modes.next_free; ++n) {
+    assert(is_mode(n));
+    if (modes_are_equal(n, m))
+      return n;
   }
 
-  for (p = p->prev; p; p = p->prev)
-  {
-    for( n=(ir_mode*) p->contents; (char *)n < p->limit; n+=sizeof(ir_mode) )
-    {
-      if(modes_are_equal(n,m)) return n;
-    }
+  for (p = p->prev; p; p = p->prev) {
+    for (n = (ir_mode *)p->contents; (char *)(n+1) < p->limit; ++n)
+      assert(is_mode(n));
+      if (modes_are_equal(n, m))
+       return n;
   }
 
   return NULL;
@@ -221,11 +232,28 @@ static ir_mode *register_mode(const ir_mode* new_mode)
 /*
  * Creates a new mode.
  */
-ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign, mode_arithmetic arithmetic )
+ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align, int sign,
+                    mode_arithmetic arithmetic, unsigned int modulo_shift )
 {
   ir_mode mode_tmpl;
   ir_mode *mode;
 
+  mode_tmpl.name         = new_id_from_str(name);
+  mode_tmpl.sort         = sort;
+  mode_tmpl.size         = bit_size;
+  mode_tmpl.align        = align;
+  mode_tmpl.sign         = sign ? 1 : 0;
+  mode_tmpl.modulo_shift = (mode_tmpl.sort == irms_int_number) ? modulo_shift : 0;
+  mode_tmpl.arithmetic   = arithmetic;
+  mode_tmpl.link         = NULL;
+  mode_tmpl.tv_priv      = NULL;
+
+  mode = find_mode(&mode_tmpl);
+  if (mode)
+  {
+    return mode;
+  }
+
   /* sanity checks */
   switch (sort)
   {
@@ -235,36 +263,17 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int align,
     case irms_internal_boolean:
       assert(0 && "internal modes cannot be user defined");
       return NULL;
-      break;
 
     case irms_float_number:
       assert(0 && "not yet implemented");
       return NULL;
-      break;
 
     case irms_int_number:
     case irms_reference:
     case irms_character:
-      break;
-  }
-  mode_tmpl.name        = new_id_from_str(name);
-  mode_tmpl.sort        = sort;
-  mode_tmpl.size        = bit_size;
-  mode_tmpl.align       = align;
-  mode_tmpl.sign        = sign ? 1 : 0;
-  mode_tmpl.arithmetic  = arithmetic;
-  mode_tmpl.tv_priv     = NULL;
-
-  /* first check if there already is a matching mode */
-  mode = find_mode(&mode_tmpl);
-  if (mode)
-  {
-    return mode;
-  }
-  else
-  {
-    return register_mode(&mode_tmpl);
+      return register_mode(&mode_tmpl);
   }
+  return NULL; /* to shut up gcc */
 }
 
 /* Functions for the direct access to all attributes od a ir_mode */
@@ -286,7 +295,7 @@ const char *
 get_mode_name(const ir_mode *mode)
 {
   ANNOUNCE();
-  return id_to_str(mode->name);
+  return get_id_str(mode->name);
 }
 
 mode_sort
@@ -330,6 +339,15 @@ int get_mode_arithmetic (const ir_mode *mode)
   return mode->arithmetic;
 }
 
+
+/* Attribute modulo shift specifies for modes of kind irms_int_number
+ *  whether shift applies modulo to value of bits to shift.  Asserts
+ *  if mode is not irms_int_number.
+ */
+unsigned int get_mode_modulo_shift(const ir_mode *mode) {
+  return mode->modulo_shift;
+}
+
 void* get_mode_link(const ir_mode *mode)
 {
   ANNOUNCE();
@@ -630,11 +648,13 @@ init_mode (void)
   /* initialize predefined modes */
 
   /* Internal Modes */
-  newmode.arithmetic = irma_none;
-  newmode.size    = 0;
-  newmode.align   = 0;
-  newmode.sign    = 0;
-  newmode.tv_priv = NULL;
+  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;
@@ -733,6 +753,7 @@ init_mode (void)
   newmode.sign    = 1;
   newmode.align   = 1;
   newmode.size    = 8;
+  newmode.modulo_shift = 32;
 
   mode_Bs = register_mode(&newmode);
 
@@ -743,6 +764,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 1;
   newmode.size    = 8;
+  newmode.modulo_shift = 32;
 
   mode_Bu = register_mode(&newmode);
 
@@ -752,6 +774,7 @@ init_mode (void)
   newmode.sign    = 1;
   newmode.align   = 2;
   newmode.size    = 16;
+  newmode.modulo_shift = 32;
 
   mode_Hs = register_mode(&newmode);
 
@@ -761,6 +784,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 2;
   newmode.size    = 16;
+  newmode.modulo_shift = 32;
 
   mode_Hu = register_mode(&newmode);
 
@@ -770,6 +794,7 @@ init_mode (void)
   newmode.sign    = 1;
   newmode.align   = 4;
   newmode.size    = 32;
+  newmode.modulo_shift = 32;
 
   mode_Is = register_mode(&newmode);
 
@@ -779,6 +804,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 4;
   newmode.size    = 32;
+  newmode.modulo_shift = 32;
 
   mode_Iu = register_mode(&newmode);
 
@@ -788,6 +814,7 @@ init_mode (void)
   newmode.sign    = 1;
   newmode.align   = 4;
   newmode.size    = 64;
+  newmode.modulo_shift = 64;
 
   mode_Ls = register_mode(&newmode);
 
@@ -797,6 +824,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 4;
   newmode.size    = 64;
+  newmode.modulo_shift = 64;
 
   mode_Lu = register_mode(&newmode);
 
@@ -810,6 +838,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 1;
   newmode.size    = 8;
+  newmode.modulo_shift = 32;
 
   mode_C = register_mode(&newmode);
 
@@ -819,6 +848,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 2;
   newmode.size    = 16;
+  newmode.modulo_shift = 32;
 
   mode_U = register_mode(&newmode);
 
@@ -832,6 +862,7 @@ init_mode (void)
   newmode.sign    = 0;
   newmode.align   = 4;
   newmode.size    = 32;
+  newmode.modulo_shift = 0;
 
   mode_P = register_mode(&newmode);