91 private:
92 uint64_t _idx_clone_orig;
93 public:
94
95 void set_idx(node_idx_t idx) {
96 _idx_clone_orig = _idx_clone_orig & CONST64(0xFFFFFFFF00000000) | idx;
97 }
98 node_idx_t idx() const { return (node_idx_t)(_idx_clone_orig & 0xFFFFFFFF); }
99
100 void set_gen(int generation) {
101 uint64_t g = (uint64_t)generation << 32;
102 _idx_clone_orig = _idx_clone_orig & 0xFFFFFFFF | g;
103 }
104 int gen() const { return (int)(_idx_clone_orig >> 32); }
105
106 void set(uint64_t x) { _idx_clone_orig = x; }
107 void set(node_idx_t x, int g) { set_idx(x); set_gen(g); }
108 uint64_t get() const { return _idx_clone_orig; }
109
110 NodeCloneInfo(uint64_t idx_clone_orig) : _idx_clone_orig(idx_clone_orig) {}
111 NodeCloneInfo(node_idx_t x, int g) {set(x, g);}
112
113 void dump() const;
114 };
115
116 class CloneMap {
117 friend class Compile;
118 private:
119 bool _debug;
120 Dict* _dict;
121 int _clone_idx; // current cloning iteration/generation in loop unroll
122 public:
123 void* _2p(node_idx_t key) const { return (void*)(intptr_t)key; } // 2 conversion functions to make gcc happy
124 node_idx_t _2_node_idx_t(const void* k) const { return (node_idx_t)(intptr_t)k; }
125 Dict* dict() const { return _dict; }
126 void insert(node_idx_t key, uint64_t val) { assert(_dict->operator[](_2p(key)) == NULL, "key existed"); _dict->Insert(_2p(key), (void*)val); }
127 void insert(node_idx_t key, NodeCloneInfo& ci) { insert(key, ci.get()); }
128 void remove(node_idx_t key) { _dict->Delete(_2p(key)); }
129 uint64_t value(node_idx_t key) const { return (uint64_t)_dict->operator[](_2p(key)); }
130 node_idx_t idx(node_idx_t key) const { return NodeCloneInfo(value(key)).idx(); }
131 int gen(node_idx_t key) const { return NodeCloneInfo(value(key)).gen(); }
|
91 private:
92 uint64_t _idx_clone_orig;
93 public:
94
95 void set_idx(node_idx_t idx) {
96 _idx_clone_orig = _idx_clone_orig & CONST64(0xFFFFFFFF00000000) | idx;
97 }
98 node_idx_t idx() const { return (node_idx_t)(_idx_clone_orig & 0xFFFFFFFF); }
99
100 void set_gen(int generation) {
101 uint64_t g = (uint64_t)generation << 32;
102 _idx_clone_orig = _idx_clone_orig & 0xFFFFFFFF | g;
103 }
104 int gen() const { return (int)(_idx_clone_orig >> 32); }
105
106 void set(uint64_t x) { _idx_clone_orig = x; }
107 void set(node_idx_t x, int g) { set_idx(x); set_gen(g); }
108 uint64_t get() const { return _idx_clone_orig; }
109
110 NodeCloneInfo(uint64_t idx_clone_orig) : _idx_clone_orig(idx_clone_orig) {}
111 NodeCloneInfo(node_idx_t x, int g) : _idx_clone_orig(0) { set(x, g); }
112
113 void dump() const;
114 };
115
116 class CloneMap {
117 friend class Compile;
118 private:
119 bool _debug;
120 Dict* _dict;
121 int _clone_idx; // current cloning iteration/generation in loop unroll
122 public:
123 void* _2p(node_idx_t key) const { return (void*)(intptr_t)key; } // 2 conversion functions to make gcc happy
124 node_idx_t _2_node_idx_t(const void* k) const { return (node_idx_t)(intptr_t)k; }
125 Dict* dict() const { return _dict; }
126 void insert(node_idx_t key, uint64_t val) { assert(_dict->operator[](_2p(key)) == NULL, "key existed"); _dict->Insert(_2p(key), (void*)val); }
127 void insert(node_idx_t key, NodeCloneInfo& ci) { insert(key, ci.get()); }
128 void remove(node_idx_t key) { _dict->Delete(_2p(key)); }
129 uint64_t value(node_idx_t key) const { return (uint64_t)_dict->operator[](_2p(key)); }
130 node_idx_t idx(node_idx_t key) const { return NodeCloneInfo(value(key)).idx(); }
131 int gen(node_idx_t key) const { return NodeCloneInfo(value(key)).gen(); }
|