12cd769179345799d383f92dd615991755ec24be1Vadim Girlin/* 22cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Copyright 2013 Vadim Girlin <vadimgirlin@gmail.com> 32cd769179345799d383f92dd615991755ec24be1Vadim Girlin * 42cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Permission is hereby granted, free of charge, to any person obtaining a 52cd769179345799d383f92dd615991755ec24be1Vadim Girlin * copy of this software and associated documentation files (the "Software"), 62cd769179345799d383f92dd615991755ec24be1Vadim Girlin * to deal in the Software without restriction, including without limitation 72cd769179345799d383f92dd615991755ec24be1Vadim Girlin * on the rights to use, copy, modify, merge, publish, distribute, sub 82cd769179345799d383f92dd615991755ec24be1Vadim Girlin * license, and/or sell copies of the Software, and to permit persons to whom 92cd769179345799d383f92dd615991755ec24be1Vadim Girlin * the Software is furnished to do so, subject to the following conditions: 102cd769179345799d383f92dd615991755ec24be1Vadim Girlin * 112cd769179345799d383f92dd615991755ec24be1Vadim Girlin * The above copyright notice and this permission notice (including the next 122cd769179345799d383f92dd615991755ec24be1Vadim Girlin * paragraph) shall be included in all copies or substantial portions of the 132cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Software. 142cd769179345799d383f92dd615991755ec24be1Vadim Girlin * 152cd769179345799d383f92dd615991755ec24be1Vadim Girlin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162cd769179345799d383f92dd615991755ec24be1Vadim Girlin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172cd769179345799d383f92dd615991755ec24be1Vadim Girlin * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 182cd769179345799d383f92dd615991755ec24be1Vadim Girlin * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 192cd769179345799d383f92dd615991755ec24be1Vadim Girlin * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 202cd769179345799d383f92dd615991755ec24be1Vadim Girlin * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 212cd769179345799d383f92dd615991755ec24be1Vadim Girlin * USE OR OTHER DEALINGS IN THE SOFTWARE. 222cd769179345799d383f92dd615991755ec24be1Vadim Girlin * 232cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Authors: 242cd769179345799d383f92dd615991755ec24be1Vadim Girlin * Vadim Girlin 252cd769179345799d383f92dd615991755ec24be1Vadim Girlin */ 262cd769179345799d383f92dd615991755ec24be1Vadim Girlin 272cd769179345799d383f92dd615991755ec24be1Vadim Girlin#include "sb_bc.h" 282cd769179345799d383f92dd615991755ec24be1Vadim Girlin#include "sb_shader.h" 292cd769179345799d383f92dd615991755ec24be1Vadim Girlin#include "sb_pass.h" 302cd769179345799d383f92dd615991755ec24be1Vadim Girlin 312cd769179345799d383f92dd615991755ec24be1Vadim Girlinnamespace r600_sb { 322cd769179345799d383f92dd615991755ec24be1Vadim Girlin 332cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 342cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool container_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 352cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool alu_group_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 362cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool alu_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 372cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool cf_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 382cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool fetch_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 392cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool region_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 402cd769179345799d383f92dd615991755ec24be1Vadim Girlin 412cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool repeat_node::accept(vpass& p, bool enter) { 422cd769179345799d383f92dd615991755ec24be1Vadim Girlin return p.visit(*this, enter); 432cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 442cd769179345799d383f92dd615991755ec24be1Vadim Girlin 452cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool depart_node::accept(vpass& p, bool enter) { 462cd769179345799d383f92dd615991755ec24be1Vadim Girlin return p.visit(*this, enter); 472cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 482cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool if_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 492cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool bb_node::accept(vpass& p, bool enter) { return p.visit(*this, enter); } 502cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool alu_packed_node::accept(vpass& p, bool enter) { 512cd769179345799d383f92dd615991755ec24be1Vadim Girlin return p.visit(*this, enter); 522cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 532cd769179345799d383f92dd615991755ec24be1Vadim Girlin 54ba7fa4c4c93e67fec798d837005a3041adda3d5bVadim Girlinvoid alu_packed_node::init_args(bool repl) { 552cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *p = static_cast<alu_node*>(first); 562cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(p->is_valid()); 572cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (p) { 582cd769179345799d383f92dd615991755ec24be1Vadim Girlin dst.insert(dst.end(), p->dst.begin(), p->dst.end()); 592cd769179345799d383f92dd615991755ec24be1Vadim Girlin src.insert(src.end(), p->src.begin(), p->src.end()); 602cd769179345799d383f92dd615991755ec24be1Vadim Girlin p = static_cast<alu_node*>(p->next); 612cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 622cd769179345799d383f92dd615991755ec24be1Vadim Girlin 632cd769179345799d383f92dd615991755ec24be1Vadim Girlin value *replicated_value = NULL; 642cd769179345799d383f92dd615991755ec24be1Vadim Girlin 652cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (vvec::iterator I = dst.begin(), E = dst.end(); I != E; ++I) { 662cd769179345799d383f92dd615991755ec24be1Vadim Girlin value *v = *I; 672cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (v) { 682cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (repl) { 692cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (replicated_value) 702cd769179345799d383f92dd615991755ec24be1Vadim Girlin v->assign_source(replicated_value); 712cd769179345799d383f92dd615991755ec24be1Vadim Girlin else 722cd769179345799d383f92dd615991755ec24be1Vadim Girlin replicated_value = v; 732cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 742cd769179345799d383f92dd615991755ec24be1Vadim Girlin 752cd769179345799d383f92dd615991755ec24be1Vadim Girlin v->def = this; 762cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 772cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 782cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 792cd769179345799d383f92dd615991755ec24be1Vadim Girlin 802cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::insert_node_before(node* s, node* n) { 812cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (s->prev) { 822cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *sp = s->prev; 832cd769179345799d383f92dd615991755ec24be1Vadim Girlin sp->next = n; 842cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = sp; 852cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = s; 862cd769179345799d383f92dd615991755ec24be1Vadim Girlin s->prev = n; 872cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 882cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = s; 892cd769179345799d383f92dd615991755ec24be1Vadim Girlin s->prev = n; 902cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = n; 912cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 922cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = this; 932cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 942cd769179345799d383f92dd615991755ec24be1Vadim Girlin 952cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::insert_node_after(node* s, node* n) { 962cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (s->next) { 972cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *sn = s->next; 982cd769179345799d383f92dd615991755ec24be1Vadim Girlin sn->prev = n; 992cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = sn; 1002cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = s; 1012cd769179345799d383f92dd615991755ec24be1Vadim Girlin s->next = n; 1022cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 1032cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = s; 1042cd769179345799d383f92dd615991755ec24be1Vadim Girlin s->next = n; 1052cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = n; 1062cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1072cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = this; 1082cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1092cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1102cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::move(iterator b, iterator e) { 1112cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(b != e); 1122cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1132cd769179345799d383f92dd615991755ec24be1Vadim Girlin container_node *source_container = b->parent; 1142cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *l = source_container->cut(b, e); 1152cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1162cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = last = l; 1172cd769179345799d383f92dd615991755ec24be1Vadim Girlin first->parent = this; 1182cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1192cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (last->next) { 1202cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = last->next; 1212cd769179345799d383f92dd615991755ec24be1Vadim Girlin last->parent = this; 1222cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1232cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1242cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1252cd769179345799d383f92dd615991755ec24be1Vadim Girlinnode* container_node::cut(iterator b, iterator e) { 1262cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(!*b || b->parent == this); 1272cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(!*e || e->parent == this); 1282cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(b != e); 1292cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1302cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (b->prev) { 1312cd769179345799d383f92dd615991755ec24be1Vadim Girlin b->prev->next = *e; 1322cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 1332cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = *e; 1342cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1352cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1362cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (*e) { 1372cd769179345799d383f92dd615991755ec24be1Vadim Girlin e->prev->next = NULL; 1382cd769179345799d383f92dd615991755ec24be1Vadim Girlin e->prev = b->prev; 1392cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 1402cd769179345799d383f92dd615991755ec24be1Vadim Girlin last->next = NULL; 1412cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = b->prev; 1422cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1432cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1442cd769179345799d383f92dd615991755ec24be1Vadim Girlin b->prev = NULL; 1452cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1462cd769179345799d383f92dd615991755ec24be1Vadim Girlin return *b; 1472cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1482cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1492cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned container_node::count() { 1502cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned c = 0; 1512cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *t = first; 1522cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (t) { 1532cd769179345799d383f92dd615991755ec24be1Vadim Girlin t = t->next; 1542cd769179345799d383f92dd615991755ec24be1Vadim Girlin c++; 1552cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1562cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c; 1572cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1582cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1592cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::remove_node(node *n) { 1602cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (n->prev) 1612cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev->next = n->next; 1622cd769179345799d383f92dd615991755ec24be1Vadim Girlin else 1632cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = n->next; 1642cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (n->next) 1652cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next->prev = n->prev; 1662cd769179345799d383f92dd615991755ec24be1Vadim Girlin else 1672cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = n->prev; 1682cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = NULL; 1692cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1702cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1712cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::expand(container_node *n) { 1722cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!n->empty()) { 1732cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *e0 = n->first; 1742cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *e1 = n->last; 1752cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1762cd769179345799d383f92dd615991755ec24be1Vadim Girlin e0->prev = n->prev; 1772cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (e0->prev) { 1782cd769179345799d383f92dd615991755ec24be1Vadim Girlin e0->prev->next = e0; 1792cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 1802cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = e0; 1812cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 1822cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1832cd769179345799d383f92dd615991755ec24be1Vadim Girlin e1->next = n->next; 1842cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (e1->next) 1852cd769179345799d383f92dd615991755ec24be1Vadim Girlin e1->next->prev = e1; 1862cd769179345799d383f92dd615991755ec24be1Vadim Girlin else 1872cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = e1; 1882cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1892cd769179345799d383f92dd615991755ec24be1Vadim Girlin do { 1902cd769179345799d383f92dd615991755ec24be1Vadim Girlin e0->parent = this; 1912cd769179345799d383f92dd615991755ec24be1Vadim Girlin e0 = e0->next; 1922cd769179345799d383f92dd615991755ec24be1Vadim Girlin } while (e0 != e1->next); 1932cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else 1942cd769179345799d383f92dd615991755ec24be1Vadim Girlin remove_node(n); 1952cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 1962cd769179345799d383f92dd615991755ec24be1Vadim Girlin 1972cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::push_back(node *n) { 1982cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (last) { 1992cd769179345799d383f92dd615991755ec24be1Vadim Girlin last->next = n; 2002cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = NULL; 2012cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = last; 2022cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = n; 2032cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 2042cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(!first); 2052cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = last = n; 2062cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = n->next = NULL; 2072cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 2082cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = this; 2092cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2102cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::push_front(node *n) { 2112cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (first) { 2122cd769179345799d383f92dd615991755ec24be1Vadim Girlin first->prev = n; 2132cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = NULL; 2142cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = first; 2152cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = n; 2162cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 2172cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(!last); 2182cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = last = n; 2192cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = n->next = NULL; 2202cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 2212cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = this; 2222cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2232cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2242cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid node::insert_before(node* n) { 2252cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent->insert_node_before(this, n); 2262cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2272cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2282cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid node::insert_after(node* n) { 2292cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent->insert_node_after(this, n); 2302cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2312cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2322cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid node::replace_with(node* n) { 2332cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->prev = prev; 2342cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->next = next; 2352cd769179345799d383f92dd615991755ec24be1Vadim Girlin n->parent = parent; 2362cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (prev) 2372cd769179345799d383f92dd615991755ec24be1Vadim Girlin prev->next = n; 2382cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (next) 2392cd769179345799d383f92dd615991755ec24be1Vadim Girlin next->prev = n; 2402cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2412cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (parent->first == this) 2422cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent->first = n; 2432cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2442cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (parent->last == this) 2452cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent->last = n; 2462cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2472cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent = NULL; 2482cd769179345799d383f92dd615991755ec24be1Vadim Girlin next = prev = NULL; 2492cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2502cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2512cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::expand() { 2522cd769179345799d383f92dd615991755ec24be1Vadim Girlin parent->expand(this); 2532cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2542cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2552cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid node::remove() {parent->remove_node(this); 2562cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2572cd769179345799d383f92dd615991755ec24be1Vadim Girlin 258e933246013eef376804662f3fcf4646c143c6c88Heiko Przybylvalue_hash node::hash_src() const { 2592cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2602cd769179345799d383f92dd615991755ec24be1Vadim Girlin value_hash h = 12345; 2612cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2622cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (int k = 0, e = src.size(); k < e; ++k) { 2632cd769179345799d383f92dd615991755ec24be1Vadim Girlin value *s = src[k]; 2642cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (s) 2652cd769179345799d383f92dd615991755ec24be1Vadim Girlin h ^= (s->hash()); 2662cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 2672cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2682cd769179345799d383f92dd615991755ec24be1Vadim Girlin return h; 2692cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2702cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2712cd769179345799d383f92dd615991755ec24be1Vadim Girlin 272e933246013eef376804662f3fcf4646c143c6c88Heiko Przybylvalue_hash node::hash() const { 2732cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2742cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (parent && parent->subtype == NST_LOOP_PHI_CONTAINER) 2752cd769179345799d383f92dd615991755ec24be1Vadim Girlin return 47451; 2762cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2772cd769179345799d383f92dd615991755ec24be1Vadim Girlin return hash_src() ^ (subtype << 13) ^ (type << 3); 2782cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 2792cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2802cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid r600_sb::container_node::append_from(container_node* c) { 2812cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!c->first) 2822cd769179345799d383f92dd615991755ec24be1Vadim Girlin return; 2832cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2842cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *b = c->first; 2852cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2862cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (last) { 2872cd769179345799d383f92dd615991755ec24be1Vadim Girlin last->next = c->first; 2882cd769179345799d383f92dd615991755ec24be1Vadim Girlin last->next->prev = last; 2892cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 2902cd769179345799d383f92dd615991755ec24be1Vadim Girlin first = c->first; 2912cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 2922cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2932cd769179345799d383f92dd615991755ec24be1Vadim Girlin last = c->last; 2942cd769179345799d383f92dd615991755ec24be1Vadim Girlin c->first = NULL; 2952cd769179345799d383f92dd615991755ec24be1Vadim Girlin c->last = NULL; 2962cd769179345799d383f92dd615991755ec24be1Vadim Girlin 2972cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (b) { 2982cd769179345799d383f92dd615991755ec24be1Vadim Girlin b->parent = this; 2992cd769179345799d383f92dd615991755ec24be1Vadim Girlin b = b->next; 3002cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3012cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3022cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3032cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3042cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool container_node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3052cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool alu_node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3062cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool alu_packed_node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3072cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool fetch_node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3082cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool cf_node::fold_dispatch(expr_handler* ex) { return ex->fold(*this); } 3092cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3102cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned alu_packed_node::get_slot_mask() { 3112cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned mask = 0; 3122cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (node_iterator I = begin(), E = end(); I != E; ++I) 3132cd769179345799d383f92dd615991755ec24be1Vadim Girlin mask |= 1 << static_cast<alu_node*>(*I)->bc.slot; 3142cd769179345799d383f92dd615991755ec24be1Vadim Girlin return mask; 3152cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3162cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3172cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid alu_packed_node::update_packed_items(sb_context &ctx) { 3182cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3192cd769179345799d383f92dd615991755ec24be1Vadim Girlin vvec::iterator SI(src.begin()), DI(dst.begin()); 3202cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3212cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(first); 3222cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3232cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *c = static_cast<alu_node*>(first); 3242cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned flags = c->bc.op_ptr->flags; 3252cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned slot_flags = c->bc.slot_flags; 3262cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3272cd769179345799d383f92dd615991755ec24be1Vadim Girlin // fixup dst for instructions that replicate output 3282cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (((flags & AF_REPL) && slot_flags == AF_4V) || 3292cd769179345799d383f92dd615991755ec24be1Vadim Girlin (ctx.is_cayman() && slot_flags == AF_S)) { 3302cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3312cd769179345799d383f92dd615991755ec24be1Vadim Girlin value *swp[4] = {}; 3322cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3332cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned chan; 3342cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3352cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (vvec::iterator I2 = dst.begin(), E2 = dst.end(); 3362cd769179345799d383f92dd615991755ec24be1Vadim Girlin I2 != E2; ++I2) { 3372cd769179345799d383f92dd615991755ec24be1Vadim Girlin value *v = *I2; 3382cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (v) { 3392cd769179345799d383f92dd615991755ec24be1Vadim Girlin chan = v->get_final_chan(); 3402cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(!swp[chan] || swp[chan] == v); 3412cd769179345799d383f92dd615991755ec24be1Vadim Girlin swp[chan] = v; 3422cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3432cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3442cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3452cd769179345799d383f92dd615991755ec24be1Vadim Girlin chan = 0; 3462cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (vvec::iterator I2 = dst.begin(), E2 = dst.end(); 3472cd769179345799d383f92dd615991755ec24be1Vadim Girlin I2 != E2; ++I2, ++chan) { 3482cd769179345799d383f92dd615991755ec24be1Vadim Girlin *I2 = swp[chan]; 3492cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3502cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3512cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3522cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (node_iterator I = begin(), E = end(); I != E; ++I) { 3532cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *n = static_cast<alu_node*>(*I); 3542cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(n); 3552cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3562cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (vvec::iterator I2 = n->src.begin(), E2 = n->src.end(); 3572cd769179345799d383f92dd615991755ec24be1Vadim Girlin I2 != E2; ++I2, ++SI) { 3582cd769179345799d383f92dd615991755ec24be1Vadim Girlin *I2 = *SI; 3592cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3602cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (vvec::iterator I2 = n->dst.begin(), E2 = n->dst.end(); 3612cd769179345799d383f92dd615991755ec24be1Vadim Girlin I2 != E2; ++I2, ++DI) { 3622cd769179345799d383f92dd615991755ec24be1Vadim Girlin *I2 = *DI; 3632cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3642cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 3652cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3662cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3672cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::is_cf_op(unsigned op) { 3682cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!is_cf_inst()) 3692cd769179345799d383f92dd615991755ec24be1Vadim Girlin return false; 3702cd769179345799d383f92dd615991755ec24be1Vadim Girlin cf_node *c = static_cast<cf_node*>(this); 3712cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op == op; 3722cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3732cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3742cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::is_alu_op(unsigned op) { 3752cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!is_alu_inst()) 3762cd769179345799d383f92dd615991755ec24be1Vadim Girlin return false; 3772cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *c = static_cast<alu_node*>(this); 3782cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op == op; 3792cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3802cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3812cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::is_fetch_op(unsigned op) { 3822cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!is_fetch_inst()) 3832cd769179345799d383f92dd615991755ec24be1Vadim Girlin return false; 3842cd769179345799d383f92dd615991755ec24be1Vadim Girlin fetch_node *c = static_cast<fetch_node*>(this); 3852cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op == op; 3862cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3872cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3882cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3892cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3902cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::is_mova() { 3912cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!is_alu_inst()) 3922cd769179345799d383f92dd615991755ec24be1Vadim Girlin return false; 3932cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *a = static_cast<alu_node*>(this); 3942cd769179345799d383f92dd615991755ec24be1Vadim Girlin return (a->bc.op_ptr->flags & AF_MOVA); 3952cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 3962cd769179345799d383f92dd615991755ec24be1Vadim Girlin 3972cd769179345799d383f92dd615991755ec24be1Vadim Girlinbool node::is_pred_set() { 3982cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!is_alu_inst()) 3992cd769179345799d383f92dd615991755ec24be1Vadim Girlin return false; 4002cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *a = static_cast<alu_node*>(this); 4012cd769179345799d383f92dd615991755ec24be1Vadim Girlin return (a->bc.op_ptr->flags & AF_ANY_PRED); 4022cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4032cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4042cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned node::cf_op_flags() { 4052cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(is_cf_inst()); 4062cd769179345799d383f92dd615991755ec24be1Vadim Girlin cf_node *c = static_cast<cf_node*>(this); 4072cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op_ptr->flags; 4082cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4092cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4102cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned node::alu_op_flags() { 4112cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(is_alu_inst()); 4122cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *c = static_cast<alu_node*>(this); 4132cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op_ptr->flags; 4142cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4152cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4162cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned node::fetch_op_flags() { 4172cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(is_fetch_inst()); 4182cd769179345799d383f92dd615991755ec24be1Vadim Girlin fetch_node *c = static_cast<fetch_node*>(this); 4192cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.op_ptr->flags; 4202cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4212cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4222cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned node::alu_op_slot_flags() { 4232cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(is_alu_inst()); 4242cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *c = static_cast<alu_node*>(this); 4252cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c->bc.slot_flags; 4262cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4272cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4282cd769179345799d383f92dd615991755ec24be1Vadim Girlinregion_node* node::get_parent_region() { 4292cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *p = this; 4302cd769179345799d383f92dd615991755ec24be1Vadim Girlin while ((p = p->parent)) 4312cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (p->is_region()) 4322cd769179345799d383f92dd615991755ec24be1Vadim Girlin return static_cast<region_node*>(p); 4332cd769179345799d383f92dd615991755ec24be1Vadim Girlin return NULL; 4342cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4352cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4362cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned container_node::real_alu_count() { 4372cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned c = 0; 4382cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *t = first; 4392cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (t) { 4402cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (t->is_alu_inst()) 4412cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++c; 4422cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (t->is_alu_packed()) 4432cd769179345799d383f92dd615991755ec24be1Vadim Girlin c += static_cast<container_node*>(t)->count(); 4442cd769179345799d383f92dd615991755ec24be1Vadim Girlin t = t->next; 4452cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 4462cd769179345799d383f92dd615991755ec24be1Vadim Girlin return c; 4472cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4482cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4492cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid container_node::collect_stats(node_stats& s) { 4502cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4512cd769179345799d383f92dd615991755ec24be1Vadim Girlin for (node_iterator I = begin(), E = end(); I != E; ++I) { 4522cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *n = *I; 4532cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (n->is_container()) { 4542cd769179345799d383f92dd615991755ec24be1Vadim Girlin static_cast<container_node*>(n)->collect_stats(s); 4552cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 4562cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4572cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (n->is_alu_inst()) { 4582cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.alu_count; 4592cd769179345799d383f92dd615991755ec24be1Vadim Girlin alu_node *a = static_cast<alu_node*>(n); 4602cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (a->bc.op_ptr->flags & AF_KILL) 4612cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.alu_kill_count; 4622cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (a->is_copy_mov()) 4632cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.alu_copy_mov_count; 4642cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else if (n->is_fetch_inst()) 4652cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.fetch_count; 4662cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (n->is_cf_inst()) 4672cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.cf_count; 4682cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (n->is_region()) { 4692cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.region_count; 4702cd769179345799d383f92dd615991755ec24be1Vadim Girlin region_node *r = static_cast<region_node*>(n); 4712cd769179345799d383f92dd615991755ec24be1Vadim Girlin if(r->is_loop()) 4722cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.loop_count; 4732cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4742cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (r->phi) 4752cd769179345799d383f92dd615991755ec24be1Vadim Girlin s.phi_count += r->phi->count(); 4762cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (r->loop_phi) 4772cd769179345799d383f92dd615991755ec24be1Vadim Girlin s.loop_phi_count += r->loop_phi->count(); 4782cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 4792cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (n->is_depart()) 4802cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.depart_count; 4812cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (n->is_repeat()) 4822cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.repeat_count; 4832cd769179345799d383f92dd615991755ec24be1Vadim Girlin else if (n->is_if()) 4842cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++s.if_count; 4852cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 4862cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4872cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4882cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid region_node::expand_depart(depart_node *d) { 4892cd769179345799d383f92dd615991755ec24be1Vadim Girlin depart_vec::iterator I = departs.begin() + d->dep_id, E; 4902cd769179345799d383f92dd615991755ec24be1Vadim Girlin I = departs.erase(I); 4912cd769179345799d383f92dd615991755ec24be1Vadim Girlin E = departs.end(); 4922cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (I != E) { 4932cd769179345799d383f92dd615991755ec24be1Vadim Girlin --(*I)->dep_id; 4942cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++I; 4952cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 4962cd769179345799d383f92dd615991755ec24be1Vadim Girlin d->expand(); 4972cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 4982cd769179345799d383f92dd615991755ec24be1Vadim Girlin 4992cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid region_node::expand_repeat(repeat_node *r) { 5002cd769179345799d383f92dd615991755ec24be1Vadim Girlin repeat_vec::iterator I = repeats.begin() + r->rep_id - 1, E; 5012cd769179345799d383f92dd615991755ec24be1Vadim Girlin I = repeats.erase(I); 5022cd769179345799d383f92dd615991755ec24be1Vadim Girlin E = repeats.end(); 5032cd769179345799d383f92dd615991755ec24be1Vadim Girlin while (I != E) { 5042cd769179345799d383f92dd615991755ec24be1Vadim Girlin --(*I)->rep_id; 5052cd769179345799d383f92dd615991755ec24be1Vadim Girlin ++I; 5062cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 5072cd769179345799d383f92dd615991755ec24be1Vadim Girlin r->expand(); 5082cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 5092cd769179345799d383f92dd615991755ec24be1Vadim Girlin 5102cd769179345799d383f92dd615991755ec24be1Vadim Girlinvoid node_stats::dump() { 511ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " alu_count : " << alu_count << "\n"; 512ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " alu_kill_count : " << alu_kill_count << "\n"; 513ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " alu_copy_mov_count : " << alu_copy_mov_count << "\n"; 514ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " cf_count : " << cf_count << "\n"; 515ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " fetch_count : " << fetch_count << "\n"; 516ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " region_count : " << region_count << "\n"; 517ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " loop_count : " << loop_count << "\n"; 518ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " phi_count : " << phi_count << "\n"; 519ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " loop_phi_count : " << loop_phi_count << "\n"; 520ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " depart_count : " << depart_count << "\n"; 521ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " repeat_count : " << repeat_count << "\n"; 522ecde4b07e2208934a17a09d26c43baf314c10a60Vadim Girlin sblog << " if_count : " << if_count << "\n"; 5232cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 5242cd769179345799d383f92dd615991755ec24be1Vadim Girlin 5252cd769179345799d383f92dd615991755ec24be1Vadim Girlinunsigned alu_node::interp_param() { 5262cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (!(bc.op_ptr->flags & AF_INTERP)) 5272cd769179345799d383f92dd615991755ec24be1Vadim Girlin return 0; 5282cd769179345799d383f92dd615991755ec24be1Vadim Girlin unsigned param; 5292cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (bc.op_ptr->src_count == 2) { 5302cd769179345799d383f92dd615991755ec24be1Vadim Girlin param = src[1]->select.sel(); 5312cd769179345799d383f92dd615991755ec24be1Vadim Girlin } else { 5322cd769179345799d383f92dd615991755ec24be1Vadim Girlin param = src[0]->select.sel(); 5332cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 5342cd769179345799d383f92dd615991755ec24be1Vadim Girlin return param + 1; 5352cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 5362cd769179345799d383f92dd615991755ec24be1Vadim Girlin 5372cd769179345799d383f92dd615991755ec24be1Vadim Girlinalu_group_node* alu_node::get_alu_group_node() { 5382cd769179345799d383f92dd615991755ec24be1Vadim Girlin node *p = parent; 5392cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (p) { 5402cd769179345799d383f92dd615991755ec24be1Vadim Girlin if (p->subtype == NST_ALU_PACKED_INST) { 5412cd769179345799d383f92dd615991755ec24be1Vadim Girlin assert(p->parent && p->parent->subtype == NST_ALU_GROUP); 5422cd769179345799d383f92dd615991755ec24be1Vadim Girlin p = p->parent; 5432cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 5442cd769179345799d383f92dd615991755ec24be1Vadim Girlin return static_cast<alu_group_node*>(p); 5452cd769179345799d383f92dd615991755ec24be1Vadim Girlin } 5462cd769179345799d383f92dd615991755ec24be1Vadim Girlin return NULL; 5472cd769179345799d383f92dd615991755ec24be1Vadim Girlin} 5482cd769179345799d383f92dd615991755ec24be1Vadim Girlin 5492cd769179345799d383f92dd615991755ec24be1Vadim Girlin} // namespace r600_sb 550