Otawa  0.10
ExpNode.h
Go to the documentation of this file.
1 /*
2  * $Id$
3  * Copyright (c) 2005, IRIT UPS.
4  *
5  * prog/ExpNode.h -- ExpNode class.
6  */
7 #ifndef OTAWA_EXP_NODE_H
8 #define OTAWA_EXP_NODE_H
9 
10 #include <elm/assert.h>
11 #include <otawa/ilp.h>
12 
13 namespace otawa {
14 
15 class ExpNode {
16 public:
17  typedef enum {
19  CST,
20  VAR,
21  POS,
22  NEG,
23  ADD,
24  SUB,
25  MUL,
27  } kind_t;
28 
29 private:
31  union {
33  struct {
36  } bin;
38  double cst;
39  } args;
40 
41 public:
42  inline ExpNode(ilp::Var *v);
43  inline ExpNode(double cst);
44  inline ExpNode(kind_t kind, ExpNode *arg);
46 
47  inline kind_t kind(void) const;
48  inline ilp::Var *var(void) const;
49  inline double cst(void) const;
50  inline ExpNode *arg(void) const;
51  inline ExpNode *arg1(void) const;
52  inline ExpNode *arg2(void) const;
53 };
54 
55 // Inlines
56 inline ExpNode::ExpNode(ilp::Var *var): knd(VAR) {
57  args.var = var;
58 }
59 
60 inline ExpNode::ExpNode(double cst): knd(CST) {
61  args.cst = cst;
62 }
63 
64 inline ExpNode::ExpNode(kind_t kind, ExpNode *arg): knd(kind) {
65  ASSERT(knd == POS || knd == NEG);
66  args.una = arg;
67 }
68 
69 inline ExpNode::ExpNode(kind_t kind, ExpNode *arg1, ExpNode *arg2): knd(kind) {
70  ASSERT(knd >= ADD);
71  args.bin.arg1 = arg1;
72  args.bin.arg2 = arg2;
73 }
74 
75 inline ExpNode::kind_t ExpNode::kind(void) const {
76  return knd;
77 }
78 
79 inline ilp::Var *ExpNode::var(void) const {
80  ASSERT(knd == VAR);
81  return args.var;
82 }
83 
84 inline double ExpNode::cst(void) const {
85  ASSERT(knd == CST);
86  return args.cst;
87 }
88 
89 inline ExpNode *ExpNode::arg(void) const {
90  ASSERT(knd == POS || knd == NEG);
91  return args.una;
92 }
93 
94 inline ExpNode *ExpNode::arg1(void) const {
95  ASSERT(knd >= ADD);
96  return args.bin.arg1;
97 }
98 
99 inline ExpNode *ExpNode::arg2(void) const {
100  ASSERT(knd >= ADD);
101  return args.bin.arg2;
102 }
103 
104 } // otawa
105 
106 #endif // OTAWA_EXP_NODE_H
Definition: ExpNode.h:19
Definition: ExpNode.h:23
Definition: ExpNode.h:26
ExpNode * arg(void) const
Definition: ExpNode.h:89
Definition: features.h:39
union otawa::ExpNode::@5 args
struct otawa::ExpNode::@5::@6 bin
Definition: ExpNode.h:18
Definition: ExpNode.h:22
kind_t
Definition: ExpNode.h:17
kind_t kind(void) const
Definition: ExpNode.h:75
Definition: ExpNode.h:21
Inst::kind_t kind
Definition: odisasm.cpp:106
double cst
Definition: ExpNode.h:38
Definition: ExpNode.h:20
Definition: ExpNode.h:25
ExpNode * una
Definition: ExpNode.h:32
ExpNode * arg1
Definition: ExpNode.h:34
ExpNode * arg2(void) const
ExpNode(ilp::Var *v)
Definition: ExpNode.h:56
ExpNode * arg1(void) const
double cst(void) const
ilp::Var * var(void) const
ExpNode * arg2
Definition: ExpNode.h:35
A variable is an identifier used for performing ILP computation.
Definition: Var.h:36
Identifier< ilp::Var * > VAR
This identifier is used for storing in basic blocks and edges the variables (otawa::ilp::Var *) used ...
kind_t knd
Definition: ExpNode.h:30
Definition: ExpNode.h:24
Definition: ExpNode.h:15
ilp::Var * var
Definition: ExpNode.h:37