12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright 2013 Vadim Girlin <vadimgirlin@gmail.com>
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Permission is hereby granted, free of charge, to any person obtaining a
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * copy of this software and associated documentation files (the "Software"),
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * to deal in the Software without restriction, including without limitation
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * on the rights to use, copy, modify, merge, publish, distribute, sub
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * license, and/or sell copies of the Software, and to permit persons to whom
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * the Software is furnished to do so, subject to the following conditions:
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * The above copyright notice and this permission notice (including the next
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * paragraph) shall be included in all copies or substantial portions of the
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Software.
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
191aa246dec5abe212f699de1413a0c4a191ca364aElliott Hughes * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20166db04e259ca51838c311891598664deeed85adIan Rogers * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom * USE OR OTHER DEALINGS IN THE SOFTWARE.
22578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom *
23a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro * Authors:
246b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro *      Vadim Girlin
252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers */
26a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#define PPH_DEBUG 0
28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#if PPH_DEBUG
30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#define PPH_DUMP(q) do { q } while (0)
31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#else
32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#define PPH_DUMP(q)
33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers#endif
34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
35caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik#include "sb_shader.h"
36caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik#include "sb_pass.h"
37caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
38f7754e861f0dec2d4772d61102fa93252258f672Aart Biknamespace r600_sb {
39f7754e861f0dec2d4772d61102fa93252258f672Aart Bik
40f7754e861f0dec2d4772d61102fa93252258f672Aart Bikint peephole::run() {
41f7754e861f0dec2d4772d61102fa93252258f672Aart Bik
42f7754e861f0dec2d4772d61102fa93252258f672Aart Bik	run_on(sh.root);
43caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
44f7754e861f0dec2d4772d61102fa93252258f672Aart Bik	return 0;
45caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik}
46f7754e861f0dec2d4772d61102fa93252258f672Aart Bik
47f7754e861f0dec2d4772d61102fa93252258f672Aart Bikvoid peephole::run_on(container_node* c) {
48caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
49f7754e861f0dec2d4772d61102fa93252258f672Aart Bik	for (node_iterator I = c->begin(), E = c->end(); I != E; ++I) {
50f7754e861f0dec2d4772d61102fa93252258f672Aart Bik		node *n = *I;
51caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
52f7754e861f0dec2d4772d61102fa93252258f672Aart Bik		if (n->is_container())
53f7754e861f0dec2d4772d61102fa93252258f672Aart Bik			run_on(static_cast<container_node*>(n));
54caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik		else {
55f7754e861f0dec2d4772d61102fa93252258f672Aart Bik
56f7754e861f0dec2d4772d61102fa93252258f672Aart Bik			if (n->is_alu_inst()) {
57caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik				alu_node *a = static_cast<alu_node*>(n);
58caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
59caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik				if (a->bc.op_ptr->flags &
60caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik						(AF_PRED | AF_SET | AF_CMOV | AF_KILL)) {
61caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik					optimize_cc_op(a);
622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers				} else if (a->bc.op == ALU_OP1_FLT_TO_INT) {
63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
64a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro					alu_node *s = a;
65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro					if (get_bool_flt_to_int_source(s)) {
66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro						convert_float_setcc(a, s);
67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro					}
68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro				}
692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			}
70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		}
71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid peephole::optimize_cc_op(alu_node* a) {
75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	unsigned aflags = a->bc.op_ptr->flags;
762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (aflags & (AF_PRED | AF_SET | AF_KILL)) {
78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		optimize_cc_op2(a);
79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	} else if (aflags & AF_CMOV) {
801cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray		optimize_CNDcc_op(a);
811cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray	}
82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid peephole::convert_float_setcc(alu_node *f2i, alu_node *s) {
858ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	alu_node *ns = sh.clone(s);
868ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray
878ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	ns->dst[0] = f2i->dst[0];
888ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	ns->dst[0]->def = ns;
898ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	ns->bc.set_op(ns->bc.op + (ALU_OP2_SETE_DX10 - ALU_OP2_SETE));
908ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	f2i->insert_after(ns);
918ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray	f2i->remove();
928ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray}
938ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray
948ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffrayvoid peephole::optimize_cc_op2(alu_node* a) {
952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	unsigned flags = a->bc.op_ptr->flags;
97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	unsigned cc = flags & AF_CC_MASK;
98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if ((cc != AF_CC_E && cc != AF_CC_NE) || a->pred)
100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return;
1012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	unsigned cmp_type = flags & AF_CMP_TYPE_MASK;
103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	unsigned dst_type = flags & AF_DST_TYPE_MASK;
104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	int op_kind = (flags & AF_PRED) ? 1 :
106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			(flags & AF_SET) ? 2 :
107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			(flags & AF_KILL) ? 3 : 0;
1082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	bool swapped = false;
11044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers
11144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers	if (a->src[0]->is_const() && a->src[0]->literal_value == literal(0)) {
11244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers		std::swap(a->src[0],a->src[1]);
11344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers		swapped = true;
11444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers		// clear modifiers
11544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers		memset(&a->bc.src[0], 0, sizeof(bc_alu_src));
11644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers		memset(&a->bc.src[1], 0, sizeof(bc_alu_src));
117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (swapped || (a->src[1]->is_const() &&
1202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			a->src[1]->literal_value == literal(0))) {
121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		value *s = a->src[0];
123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		bool_op_info bop = {};
125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers		PPH_DUMP(
127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			sblog << "cc_op2: ";
128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			dump::dump_op(a);
129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			sblog << "\n";
130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		);
131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (!get_bool_op_info(s, bop))
1332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			return;
134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (cc == AF_CC_E)
136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			bop.invert = !bop.invert;
137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		bool swap_args = false;
139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers		cc = bop.n->bc.op_ptr->flags & AF_CC_MASK;
141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (bop.invert)
143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			cc = invert_setcc_condition(cc, swap_args);
144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (bop.int_cvt) {
146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			assert(cmp_type != AF_FLOAT_CMP);
1472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			cmp_type = AF_FLOAT_CMP;
148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		}
149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		PPH_DUMP(
151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			sblog << "boi node: ";
152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			dump::dump_op(bop.n);
153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			sblog << " invert: " << bop.invert << "  int_cvt: " << bop.int_cvt;
1542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			sblog <<"\n";
155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		);
156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		unsigned newop;
158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		switch(op_kind) {
160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		case 1:
1612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			newop = get_predsetcc_op(cc, cmp_type);
162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			break;
163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		case 2:
164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			newop = get_setcc_op(cc, cmp_type, dst_type != AF_FLOAT_DST);
165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			break;
166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		case 3:
167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			newop = get_killcc_op(cc, cmp_type);
168bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers			break;
169bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers		default:
170bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers			newop = ALU_OP0_NOP;
171bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers			assert(!"invalid op kind");
172bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers			break;
173bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers		}
174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1757a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell		a->bc.set_op(newop);
1767a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell
1777a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell		if (swap_args) {
1787a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell			a->src[0] = bop.n->src[1];
1797a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell			a->src[1] = bop.n->src[0];
1807a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell			a->bc.src[0] = bop.n->bc.src[1];
1817a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell			a->bc.src[1] = bop.n->bc.src[0];
18209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
18309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell		} else {
18409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell			a->src[0] = bop.n->src[0];
18509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell			a->src[1] = bop.n->src[1];
18609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell			a->bc.src[0] = bop.n->bc.src[0];
18709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell			a->bc.src[1] = bop.n->bc.src[1];
188bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell		}
189bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	}
190bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
191bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
192bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid peephole::optimize_CNDcc_op(alu_node* a) {
193bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	unsigned flags = a->bc.op_ptr->flags;
194bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	unsigned cc = flags & AF_CC_MASK;
195bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	unsigned cmp_type = flags & AF_CMP_TYPE_MASK;
196bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	bool swap = false;
197bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
198bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	if (cc == AF_CC_E) {
199bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell		swap = !swap;
200bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell		cc = AF_CC_NE;
201bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell	} else if (cc != AF_CC_NE)
2028ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell		return;
2038ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
2048ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell	value *s = a->src[0];
2058ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
2068ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell	bool_op_info bop = {};
2078ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
2088ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell	PPH_DUMP(
2098ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell		sblog << "cndcc: ";
2108ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell		dump::dump_op(a);
2118ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell		sblog << "\n";
2128ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell	);
2138ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
2148ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell	if (!get_bool_op_info(s, bop))
2158ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell		return;
216c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
217c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	alu_node *d = bop.n;
218c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
219c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	if (d->bc.omod)
220c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik		return;
221c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
222c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	PPH_DUMP(
223c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik		sblog << "cndcc def: ";
224c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik		dump::dump_op(d);
225c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik		sblog << "\n";
226c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	);
227c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
228c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
229c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	unsigned dflags = d->bc.op_ptr->flags;
230c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	unsigned dcc = dflags & AF_CC_MASK;
231c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik	unsigned dcmp_type = dflags & AF_CMP_TYPE_MASK;
2322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers	unsigned ddst_type = dflags & AF_DST_TYPE_MASK;
233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	int nds;
234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	// TODO we can handle some of these cases,
236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	// though probably this shouldn't happen
237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (cmp_type != AF_FLOAT_CMP && ddst_type == AF_FLOAT_DST)
238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return;
239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers	if (d->src[0]->is_const() && d->src[0]->literal_value == literal(0))
241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		nds = 1;
242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	else if ((d->src[1]->is_const() &&
243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			d->src[1]->literal_value == literal(0)))
244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		nds = 0;
245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	else
246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return;
247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers	// can't propagate ABS modifier to CNDcc because it's OP3
249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (d->bc.src[nds].abs)
250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return;
251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	// TODO we can handle some cases for uint comparison
253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (dcmp_type == AF_UINT_CMP)
254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return;
255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers	if (dcc == AF_CC_NE) {
257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		dcc = AF_CC_E;
258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		swap = !swap;
259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (nds == 1) {
262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		switch (dcc) {
263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		case AF_CC_GT: dcc = AF_CC_GE; swap = !swap; break;
2641bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes		case AF_CC_GE: dcc = AF_CC_GT; swap = !swap; break;
265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		default: break;
266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		}
267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers	a->src[0] = d->src[nds];
270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	a->bc.src[0] = d->bc.src[nds];
271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (swap) {
273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		std::swap(a->src[1], a->src[2]);
274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		std::swap(a->bc.src[1], a->bc.src[2]);
275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
2762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	a->bc.set_op(get_cndcc_op(dcc, dcmp_type));
278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirobool peephole::get_bool_flt_to_int_source(alu_node* &a) {
282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (a->bc.op == ALU_OP1_FLT_TO_INT) {
284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers		if (a->bc.src[0].neg || a->bc.src[0].abs || a->bc.src[0].rel)
286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			return false;
287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		value *s = a->src[0];
289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (!s || !s->def || !s->def->is_alu_inst())
290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			return false;
291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		alu_node *dn = static_cast<alu_node*>(s->def);
2932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (dn->is_alu_op(ALU_OP1_TRUNC)) {
295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			s = dn->src[0];
296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			if (!s || !s->def || !s->def->is_alu_inst())
297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro				return false;
298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			if (dn->bc.src[0].neg != 1 || dn->bc.src[0].abs != 0 ||
300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro					dn->bc.src[0].rel != 0) {
3012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers				return false;
302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			}
303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			dn = static_cast<alu_node*>(s->def);
305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		}
307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (dn->bc.op_ptr->flags & AF_SET) {
3092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers			a = dn;
310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			return true;
311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		}
312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	}
313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	return false;
314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirobool peephole::get_bool_op_info(value* b, bool_op_info& bop) {
3171bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes
318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	node *d = b->def;
319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (!d || !d->is_alu_inst())
321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		return false;
3222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	alu_node *dn = static_cast<alu_node*>(d);
324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro	if (dn->bc.op_ptr->flags & AF_SET) {
326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		bop.n = dn;
327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro		if (dn->bc.op_ptr->flags & AF_DX10)
329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro			bop.int_cvt = true;
33026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray
33126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray		return true;
33226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray	}
33326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray
33426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray	if (get_bool_flt_to_int_source(dn)) {
335b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray		bop.n = dn;
33626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray		bop.int_cvt = true;
33726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray		return true;
33826a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray	}
33926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray
34026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray	return false;
3412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}
342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} // namespace r600_sb
344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro