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