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