PIPS
operatorid.c
Go to the documentation of this file.
1 /*
2 
3  $Id: operatorid.c 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 #include "genC.h"
28 #include "linear.h"
29 #include "ri.h"
30 #include "effects.h"
31 
32 #include "resources.h"
33 
34 #include "misc.h"
35 #include "ri-util.h"
36 #include "effects-util.h"
37 
38 #include "sac.h"
39 #include "patterns.h"
40 #include "pipsdbm.h"
41 
42 static operator_id_tree mappings = NULL;
44 {
45  pips_assert("not already set",mappings==NULL);
46  mappings=m;
47 }
49 {
50  pips_assert("already set",mappings);
51  mappings=NULL;
52 }
53 
54 /*
55  * we manipulate tokens from
56  * either the `ri'
57  * or from the pattern lexer
58  * binding is done here
59  */
60 
61 typedef struct {
62  char* name;
63  int id;
65 
67 {
92 
99 
102 
109 
110  { "__PIPS_SAC_MULADD", MULADD_OPERATOR_TOK },
111 
112  { NULL, UNKNOWN_TOK }
113 };
114 
115 
116 static void insert_mapping(oper_id_mapping* item)
117 {
118  char * s;
120 
121  t = mappings;
122  for(s = item->name; *s != 0; s++)
123  {
124  operator_id_tree next;
125  intptr_t c = *s;
126 
127  next = (operator_id_tree)hash_get(operator_id_tree_sons(t), (void*)c);
128  if (next == HASH_UNDEFINED_VALUE)
129  {
131  hash_put(operator_id_tree_sons(t), (void *)c, (void*)next);
132  }
133 
134  t = next;
135  }
136 
138  pips_user_warning("overwriting previous mapping...\n");
139 
140  operator_id_tree_id(t) = item->id;
141 }
142 
143 static int do_get_operator_id(const char* ename)
144 {
146  for(const char *s = ename; *s != 0; s++)
147  {
148  operator_id_tree next;
149  intptr_t c = *s;
150 
151  next = (operator_id_tree)hash_get(operator_id_tree_sons(t), (void*)c);
152  if (next == HASH_UNDEFINED_VALUE)
153  {
154  return UNKNOWN_TOK;
155  }
156  t = next;
157  }
158  return operator_id_tree_id(t);
159 }
160 
162 {
163  const char* ename = entity_local_name(e);
164  int res = do_get_operator_id(ename);
165  if(res == UNKNOWN_TOK )
166  {
167  /* retry with uppercase version, cos -> COS :) */
168  ename = strupper(strdup(ename),ename);
169  res = do_get_operator_id(ename);
170  }
171  return res;
172 }
173 
175 {
177  /* create a new operator id */
180 
181  for(size_t i=0; operators[i].name != NULL; i++)
183 
184  /* put it in pipsdbm */
185  DB_PUT_MEMORY_RESOURCE(DBR_SIMD_OPERATOR_MAPPINGS,"",m);
186 
188  return true;
189 }
190 
operator_id_tree make_operator_id_tree(intptr_t a1, operator_id_sons a2)
Definition: sac_private.c:237
@ ASSIGN_OPERATOR_TOK
CONSTANT_TOK
Definition: patterns.h:69
@ AMIN1_OPERATOR_TOK
MIN0_OPERATOR_TOK
Definition: patterns.h:83
@ MAX_OPERATOR_TOK
DMIN1_OPERATOR_TOK
Definition: patterns.h:85
@ MIN_OPERATOR_TOK
MODULO_OPERATOR_TOK
Definition: patterns.h:79
@ DIVIDE_OPERATOR_TOK
MULADD_OPERATOR_TOK
Definition: patterns.h:75
@ MULTIPLY_OPERATOR_TOK
UNARY_MINUS_OPERATOR_TOK
Definition: patterns.h:73
@ POWER_OPERATOR_TOK
INVERSE_OPERATOR_TOK
Definition: patterns.h:77
@ PHI_TOK
EQUAL_OPERATOR_TOK
Definition: patterns.h:106
@ MULADD_OPERATOR_TOK
MULTIPLY_OPERATOR_TOK
Definition: patterns.h:74
@ NON_EQUIV_OPERATOR_TOK
EQUIV_OPERATOR_TOK
Definition: patterns.h:98
@ AMAX1_OPERATOR_TOK
MAX0_OPERATOR_TOK
Definition: patterns.h:87
@ ABS_OPERATOR_TOK
DMAX1_OPERATOR_TOK
Definition: patterns.h:89
@ UNKNOWN_TOK
"invalid token"
Definition: patterns.h:57
@ PLUS_OPERATOR_TOK
ASSIGN_OPERATOR_TOK
Definition: patterns.h:70
@ DMAX1_OPERATOR_TOK
AMAX1_OPERATOR_TOK
Definition: patterns.h:88
@ INVERSE_OPERATOR_TOK
DIVIDE_OPERATOR_TOK
Definition: patterns.h:76
@ IABS_OPERATOR_TOK
ABS_OPERATOR_TOK
Definition: patterns.h:90
@ NON_EQUAL_OPERATOR_TOK
NOT_OPERATOR_TOK
Definition: patterns.h:96
@ FALSE_OPERATOR_TOK
TRUE_OPERATOR_TOK
Definition: patterns.h:100
@ TRUE_OPERATOR_TOK
NON_EQUIV_OPERATOR_TOK
Definition: patterns.h:99
@ GREATER_THAN_OPERATOR_TOK
GREATER_OR_EQUAL_OPERATOR_TOK
Definition: patterns.h:102
@ GREATER_OR_EQUAL_OPERATOR_TOK
FALSE_OPERATOR_TOK
Definition: patterns.h:101
@ COS_OPERATOR_TOK
MIN_OPERATOR_TOK
Definition: patterns.h:80
@ LESS_THAN_OPERATOR_TOK
LESS_OR_EQUAL_OPERATOR_TOK
Definition: patterns.h:104
@ LESS_OR_EQUAL_OPERATOR_TOK
GREATER_THAN_OPERATOR_TOK
Definition: patterns.h:103
@ AND_OPERATOR_TOK
CABS_OPERATOR_TOK
Definition: patterns.h:93
@ MINUS_OPERATOR_TOK
PLUS_OPERATOR_TOK
Definition: patterns.h:71
@ EQUAL_OPERATOR_TOK
LESS_THAN_OPERATOR_TOK
Definition: patterns.h:105
@ DABS_OPERATOR_TOK
IABS_OPERATOR_TOK
Definition: patterns.h:91
@ UNARY_MINUS_OPERATOR_TOK
MINUS_OPERATOR_TOK
Definition: patterns.h:72
@ EQUIV_OPERATOR_TOK
NON_EQUAL_OPERATOR_TOK
Definition: patterns.h:97
@ NOT_OPERATOR_TOK
OR_OPERATOR_TOK
Definition: patterns.h:95
@ MODULO_OPERATOR_TOK
POWER_OPERATOR_TOK
Definition: patterns.h:78
@ CABS_OPERATOR_TOK
DABS_OPERATOR_TOK
Definition: patterns.h:92
@ DMIN1_OPERATOR_TOK
AMIN1_OPERATOR_TOK
Definition: patterns.h:84
@ MAX0_OPERATOR_TOK
MAX_OPERATOR_TOK
Definition: patterns.h:86
@ SIN_OPERATOR_TOK
COS_OPERATOR_TOK
Definition: patterns.h:81
@ OR_OPERATOR_TOK
AND_OPERATOR_TOK
Definition: patterns.h:94
@ MIN0_OPERATOR_TOK
SIN_OPERATOR_TOK
Definition: patterns.h:82
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
#define DB_PUT_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
Definition: pipsdbm-local.h:66
hash_table hash_table_make(hash_key_type key_type, size_t size)
Definition: hash.c:294
void * hash_get(const hash_table htp, const void *key)
this function retrieves in the hash table pointed to by htp the couple whose key is equal to key.
Definition: hash.c:449
void hash_put(hash_table htp, const void *key, const void *val)
This functions stores a couple (key,val) in the hash table pointed to by htp.
Definition: hash.c:364
#define pips_user_warning
Definition: misc-local.h:146
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
string strupper(string, const char *)
Definition: string.c:213
@ hash_int
Definition: newgen_hash.h:32
#define HASH_UNDEFINED_VALUE
value returned by hash_get() when the key is not found; could also be called HASH_KEY_NOT_FOUND,...
Definition: newgen_hash.h:56
#define HASH_DEFAULT_SIZE
Definition: newgen_hash.h:26
int get_operator_id(entity e)
Definition: operatorid.c:161
static operator_id_tree mappings
Definition: operatorid.c:42
static int do_get_operator_id(const char *ename)
Definition: operatorid.c:143
static oper_id_mapping operators[]
Definition: operatorid.c:66
bool simd_operator_mappings(const string module_name)
Definition: operatorid.c:174
static void insert_mapping(oper_id_mapping *item)
Definition: operatorid.c:116
void reset_simd_operator_mappings()
Definition: operatorid.c:48
void set_simd_operator_mappings(void *m)
operatorid.c
Definition: operatorid.c:43
#define MAX_OPERATOR_NAME
#define POWER_OPERATOR_NAME
#define CABS_OPERATOR_NAME
#define C_LESS_OR_EQUAL_OPERATOR_NAME
#define COS_OPERATOR_NAME
#define C_GREATER_OR_EQUAL_OPERATOR_NAME
#define DMIN1_OPERATOR_NAME
#define ABS_OPERATOR_NAME
#define C_GREATER_THAN_OPERATOR_NAME
#define MINUS_OPERATOR_NAME
#define IABS_OPERATOR_NAME
#define EQUIV_OPERATOR_NAME
#define PLUS_OPERATOR_NAME
#define SIN_OPERATOR_NAME
#define MAX0_OPERATOR_NAME
#define MIN0_OPERATOR_NAME
#define NON_EQUIV_OPERATOR_NAME
#define DMAX1_OPERATOR_NAME
#define INVERSE_OPERATOR_NAME
#define CONDITIONAL_OPERATOR_NAME
#define FALSE_OPERATOR_NAME
#define AND_OPERATOR_NAME
FI: intrinsics are defined at a third place after bootstrap and effects! I guess the name should be d...
#define DIVIDE_OPERATOR_NAME
#define DABS_OPERATOR_NAME
#define UNARY_MINUS_OPERATOR_NAME
#define AMIN1_OPERATOR_NAME
#define C_LESS_THAN_OPERATOR_NAME
#define TRUE_OPERATOR_NAME
#define MULTIPLY_OPERATOR_NAME
#define AMAX1_OPERATOR_NAME
#define NOT_OPERATOR_NAME
#define OR_OPERATOR_NAME
#define NON_EQUAL_OPERATOR_NAME
#define C_EQUAL_OPERATOR_NAME
#define ASSIGN_OPERATOR_NAME
Definition: ri-util-local.h:95
#define MODULO_OPERATOR_NAME
#define PLUS_C_OPERATOR_NAME
#define MIN_OPERATOR_NAME
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
struct _newgen_struct_operator_id_tree_ * operator_id_tree
Definition: sac_private.h:90
#define operator_id_tree_sons(x)
Definition: sac_private.h:331
#define operator_id_tree_id(x)
Definition: sac_private.h:329
char * strdup()
#define intptr_t
Definition: stdint.in.h:294