1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp. 2006. All Rights Reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_defines.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_eu.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glsl/ralloc.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Internal helper for constructing instructions 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void guess_execution_size(struct brw_compile *p, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg reg) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.width == BRW_WIDTH_8 && p->compressed) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_16; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = reg.width; /* note - definitions are compatible */ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prior to Sandybridge, the SEND instruction accepted non-MRF source 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * registers, implicitly moving the operand to a message register. 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * On Sandybridge, this is no longer the case. This function performs the 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * explicit move; it should be called before emitting a SEND instruction. 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_resolve_implied_move(struct brw_compile *p, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg *src, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->file == BRW_MESSAGE_REGISTER_FILE) 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src->file != BRW_ARCHITECTURE_REGISTER_FILE || src->nr != BRW_ARF_NULL) { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, retype(brw_message_reg(msg_reg_nr), BRW_REGISTER_TYPE_UD), 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(*src, BRW_REGISTER_TYPE_UD)); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *src = brw_message_reg(msg_reg_nr); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen7_convert_mrf_to_grf(struct brw_compile *p, struct brw_reg *reg) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the BSpec / ISA Reference / send - [DevIVB+]: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "The send with EOT should use register space R112-R127 for <src>. This is 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to enable loading of a new thread into the same slot while the message 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with EOT for current thread is pending dispatch." 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Since we're pretending to have 16 MRFs anyway, we may as well use the 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * registers required for messages with EOT. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 7 && reg->file == BRW_MESSAGE_REGISTER_FILE) { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->file = BRW_GENERAL_REGISTER_FILE; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->nr += GEN7_MRF_HACK_START; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_dest(struct brw_compile *p, struct brw_instruction *insn, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dest.file != BRW_ARCHITECTURE_REGISTER_FILE && 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest.file != BRW_MESSAGE_REGISTER_FILE) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.nr < 128); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen7_convert_mrf_to_grf(p, &dest); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_reg_file = dest.file; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_reg_type = dest.type; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_address_mode = dest.address_mode; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dest.address_mode == BRW_ADDRESS_DIRECT) { 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_reg_nr = dest.nr; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_subreg_nr = dest.subnr; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dest.hstride == BRW_HORIZONTAL_STRIDE_0) 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest.hstride = BRW_HORIZONTAL_STRIDE_1; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.dest_horiz_stride = dest.hstride; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da16.dest_subreg_nr = dest.subnr / 16; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da16.dest_writemask = dest.dw1.bits.writemask; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* even ignored in da16, still need to set as '01' */ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da16.dest_horiz_stride = 1; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.ia1.dest_subreg_nr = dest.subnr; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These are different sizes in align1 vs align16: 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.ia1.dest_indirect_offset = dest.dw1.bits.indirect_offset; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dest.hstride == BRW_HORIZONTAL_STRIDE_0) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest.hstride = BRW_HORIZONTAL_STRIDE_1; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.ia1.dest_horiz_stride = dest.hstride; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.ia16.dest_indirect_offset = dest.dw1.bits.indirect_offset; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* even ignored in da16, still need to set as '01' */ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.ia16.dest_horiz_stride = 1; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NEW: Set the execution size based on dest.width and 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * insn->compression_control: 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org guess_execution_size(p, insn, dest); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int reg_type_size[]; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_reg(struct brw_instruction *insn, struct brw_reg reg) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int hstride_for_reg[] = {0, 1, 2, 4}; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int vstride_for_reg[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256}; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width_for_reg[] = {1, 2, 4, 8, 16}; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int execsize_for_reg[] = {1, 2, 4, 8, 16}; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, hstride, vstride, execsize; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == BRW_IMMEDIATE_VALUE) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3.3.6: Region Parameters. Restriction: Immediate vectors 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mean the destination has to be 128-bit aligned and the 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * destination horiz stride has to be a word. 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.type == BRW_REGISTER_TYPE_V) { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(hstride_for_reg[insn->bits1.da1.dest_horiz_stride] * 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg_type_size[insn->bits1.da1.dest_reg_type] == 2); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == BRW_ARCHITECTURE_REGISTER_FILE && 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.file == BRW_ARF_NULL) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.hstride >= 0 && reg.hstride < Elements(hstride_for_reg)); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hstride = hstride_for_reg[reg.hstride]; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.vstride == 0xf) { 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstride = -1; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.vstride >= 0 && reg.vstride < Elements(vstride_for_reg)); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vstride = vstride_for_reg[reg.vstride]; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.width >= 0 && reg.width < Elements(width_for_reg)); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = width_for_reg[reg.width]; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.execution_size >= 0 && 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size < Elements(execsize_for_reg)); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org execsize = execsize_for_reg[insn->header.execution_size]; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Restrictions from 3.3.10: Register Region Restrictions. */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3. */ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(execsize >= width); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4. */ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (execsize == width && hstride != 0) { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(vstride == -1 || vstride == width * hstride); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5. */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (execsize == width && hstride == 0) { 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no restriction on vstride. */ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 6. */ 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width == 1) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(hstride == 0); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 7. */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (execsize == 1 && width == 1) { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(hstride == 0); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(vstride == 0); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8. */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vstride == 0 && hstride == 0) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(width == 1); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 10. Check destination issues. */ 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_src0(struct brw_compile *p, struct brw_instruction *insn, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg reg) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.type != BRW_ARCHITECTURE_REGISTER_FILE) 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.nr < 128); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen7_convert_mrf_to_grf(p, ®); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_reg(insn, reg); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src0_reg_file = reg.file; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src0_reg_type = reg.type; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_abs = reg.abs; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_negate = reg.negate; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_address_mode = reg.address_mode; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == BRW_IMMEDIATE_VALUE) { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.ud = reg.dw1.ud; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Required to set some fields in src1 as well: 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src1_reg_file = 0; /* arf */ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src1_reg_type = reg.type; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.address_mode == BRW_ADDRESS_DIRECT) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_subreg_nr = reg.subnr; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_reg_nr = reg.nr; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_subreg_nr = reg.subnr / 16; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_reg_nr = reg.nr; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.ia1.src0_subreg_nr = reg.subnr; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.ia1.src0_indirect_offset = reg.dw1.bits.indirect_offset; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.ia16.src0_subreg_nr = reg.dw1.bits.indirect_offset; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.width == BRW_WIDTH_1 && 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size == BRW_EXECUTE_1) { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_horiz_stride = BRW_HORIZONTAL_STRIDE_0; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_width = BRW_WIDTH_1; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_vert_stride = BRW_VERTICAL_STRIDE_0; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_horiz_stride = reg.hstride; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_width = reg.width; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da1.src0_vert_stride = reg.vstride; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is an oddity of the fact we're using the same 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * descriptions for registers in align_16 as align_1: 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.vstride == BRW_VERTICAL_STRIDE_8) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_vert_stride = BRW_VERTICAL_STRIDE_4; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da16.src0_vert_stride = reg.vstride; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_set_src1(struct brw_compile *p, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg reg) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.file != BRW_MESSAGE_REGISTER_FILE); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.nr < 128); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen7_convert_mrf_to_grf(p, ®); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_reg(insn, reg); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src1_reg_file = reg.file; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da1.src1_reg_type = reg.type; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_abs = reg.abs; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_negate = reg.negate; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only src1 can be immediate in two-argument instructions. 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->bits1.da1.src0_reg_file != BRW_IMMEDIATE_VALUE); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == BRW_IMMEDIATE_VALUE) { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.ud = reg.dw1.ud; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is a hardware restriction, which may or may not be lifted 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the future: 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert (reg.address_mode == BRW_ADDRESS_DIRECT); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* assert (reg.file == BRW_GENERAL_REGISTER_FILE); */ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_subreg_nr = reg.subnr; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_reg_nr = reg.nr; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_subreg_nr = reg.subnr / 16; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_reg_nr = reg.nr; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.access_mode == BRW_ALIGN_1) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.width == BRW_WIDTH_1 && 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size == BRW_EXECUTE_1) { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_horiz_stride = BRW_HORIZONTAL_STRIDE_0; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_width = BRW_WIDTH_1; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_vert_stride = BRW_VERTICAL_STRIDE_0; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_horiz_stride = reg.hstride; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_width = reg.width; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da1.src1_vert_stride = reg.vstride; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is an oddity of the fact we're using the same 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * descriptions for registers in align_16 as align_1: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.vstride == BRW_VERTICAL_STRIDE_8) 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_vert_stride = BRW_VERTICAL_STRIDE_4; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da16.src1_vert_stride = reg.vstride; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the Message Descriptor and Extended Message Descriptor fields 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for SEND messages. 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note This zeroes out the Function Control bits, so it must be called 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \b before filling out any message-specific data. Callers can 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * choose not to fill in irrelevant bits; they will be zero. 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_message_descriptor(struct brw_compile *p, 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *inst, 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum brw_message_target sfid, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned msg_length, 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned response_length, 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool header_present, 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool end_of_thread) 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, inst, brw_imm_d(0)); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 5) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic_gen5.header_present = header_present; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic_gen5.response_length = response_length; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic_gen5.msg_length = msg_length; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic_gen5.end_of_thread = end_of_thread; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* On Gen6+ Message target/SFID goes in bits 27:24 of the header */ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->header.destreg__conditionalmod = sfid; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set Extended Message Descriptor (ex_desc) */ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits2.send_gen5.sfid = sfid; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits2.send_gen5.end_of_thread = end_of_thread; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic.response_length = response_length; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic.msg_length = msg_length; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic.msg_target = sfid; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.generic.end_of_thread = end_of_thread; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_set_math_message( struct brw_compile *p, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint function, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint integer_type, 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool low_precision, 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dataType ) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = p->brw; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned msg_length; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned response_length; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Infer message length from the function */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (function) { 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_POW: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_INT_DIV_QUOTIENT: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_INT_DIV_REMAINDER: 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length = 2; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length = 1; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Infer response length from the function */ 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (function) { 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_SINCOS: 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER: 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length = 2; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length = 1; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, BRW_SFID_MATH, 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length, response_length, false, false); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 5) { 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.function = function; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.int_type = integer_type; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.precision = low_precision; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.saturate = insn->header.saturate; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.data_type = dataType; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math_gen5.snapshot = 0; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math.function = function; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math.int_type = integer_type; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math.precision = low_precision; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math.saturate = insn->header.saturate; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.math.data_type = dataType; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.saturate = 0; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_set_ff_sync_message(struct brw_compile *p, 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool allocate, 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool end_of_thread) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, BRW_SFID_URB, 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, response_length, true, end_of_thread); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.opcode = 1; /* FF_SYNC */ 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.offset = 0; /* Not used by FF_SYNC */ 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.swizzle_control = 0; /* Not used by FF_SYNC */ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.allocate = allocate; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.used = 0; /* Not used by FF_SYNC */ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.complete = 0; /* Not used by FF_SYNC */ 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_set_urb_message( struct brw_compile *p, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool allocate, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool used, 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool end_of_thread, 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool complete, 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint offset, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint swizzle_control ) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = p->brw; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, BRW_SFID_URB, 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length, response_length, true, end_of_thread); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 7) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen7.opcode = 0; /* URB_WRITE_HWORD */ 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen7.offset = offset; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(swizzle_control != BRW_URB_SWIZZLE_TRANSPOSE); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen7.swizzle_control = swizzle_control; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* per_slot_offset = 0 makes it ignore offsets in message header */ 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen7.per_slot_offset = 0; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen7.complete = complete; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen >= 5) { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.opcode = 0; /* URB_WRITE */ 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.offset = offset; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.swizzle_control = swizzle_control; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.allocate = allocate; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.used = used; /* ? */ 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb_gen5.complete = complete; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.opcode = 0; /* ? */ 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.offset = offset; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.swizzle_control = swizzle_control; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.allocate = allocate; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.used = used; /* ? */ 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.urb.complete = complete; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_dp_write_message(struct brw_compile *p, 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_control, 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_type, 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool header_present, 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint last_render_target, 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint end_of_thread, 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint send_commit_msg) 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = p->brw; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sfid; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the Render Cache for RT writes; otherwise use the Data Cache */ 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (msg_type == GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN6_SFID_DATAPORT_RENDER_CACHE; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN7_SFID_DATAPORT_DATA_CACHE; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the render cache for all write messages. */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN6_SFID_DATAPORT_RENDER_CACHE; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = BRW_SFID_DATAPORT_WRITE; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, sfid, msg_length, response_length, 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org header_present, end_of_thread); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.binding_table_index = binding_table_index; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.msg_control = msg_control; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.last_render_target = last_render_target; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.msg_type = msg_type; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.binding_table_index = binding_table_index; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.msg_control = msg_control; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.last_render_target = last_render_target; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.msg_type = msg_type; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.send_commit_msg = send_commit_msg; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 5) { 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write_gen5.binding_table_index = binding_table_index; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write_gen5.msg_control = msg_control; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write_gen5.last_render_target = last_render_target; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write_gen5.msg_type = msg_type; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write_gen5.send_commit_msg = send_commit_msg; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write.binding_table_index = binding_table_index; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write.msg_control = msg_control; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write.last_render_target = last_render_target; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write.msg_type = msg_type; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_write.send_commit_msg = send_commit_msg; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_dp_read_message(struct brw_compile *p, 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_control, 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_type, 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint target_cache, 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = p->brw; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sfid; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN7_SFID_DATAPORT_DATA_CACHE; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target_cache == BRW_DATAPORT_READ_TARGET_RENDER_CACHE) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN6_SFID_DATAPORT_RENDER_CACHE; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = GEN6_SFID_DATAPORT_SAMPLER_CACHE; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sfid = BRW_SFID_DATAPORT_READ; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, sfid, msg_length, response_length, 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org true, false); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.binding_table_index = binding_table_index; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.msg_control = msg_control; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.last_render_target = 0; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen7_dp.msg_type = msg_type; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.binding_table_index = binding_table_index; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.msg_control = msg_control; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.last_render_target = 0; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.msg_type = msg_type; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.gen6_dp.send_commit_msg = 0; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 5) { 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_gen5.binding_table_index = binding_table_index; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_gen5.msg_control = msg_control; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_gen5.msg_type = msg_type; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_gen5.target_cache = target_cache; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->is_g4x) { 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_g4x.binding_table_index = binding_table_index; /*0:7*/ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_g4x.msg_control = msg_control; /*8:10*/ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_g4x.msg_type = msg_type; /*11:13*/ 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read_g4x.target_cache = target_cache; /*14:15*/ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read.binding_table_index = binding_table_index; /*0:7*/ 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read.msg_control = msg_control; /*8:11*/ 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read.msg_type = msg_type; /*12:13*/ 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.dp_read.target_cache = target_cache; /*14:15*/ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_sampler_message(struct brw_compile *p, 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint sampler, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_type, 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint header_present, 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint simd_mode, 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint return_format) 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_context *brw = p->brw; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_message_descriptor(p, insn, BRW_SFID_SAMPLER, msg_length, 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length, header_present, false); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen7.binding_table_index = binding_table_index; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen7.sampler = sampler; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen7.msg_type = msg_type; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen7.simd_mode = simd_mode; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen >= 5) { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen5.binding_table_index = binding_table_index; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen5.sampler = sampler; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen5.msg_type = msg_type; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_gen5.simd_mode = simd_mode; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->is_g4x) { 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_g4x.binding_table_index = binding_table_index; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_g4x.sampler = sampler; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler_g4x.msg_type = msg_type; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler.binding_table_index = binding_table_index; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler.sampler = sampler; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler.msg_type = msg_type; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.sampler.return_format = return_format; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define next_insn brw_next_insn 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction * 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_next_insn(struct brw_compile *p, GLuint opcode) 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->nr_insn + 1 > p->store_size) { 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("incresing the store size to %d\n", p->store_size << 1); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store_size <<= 1; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->store = reralloc(p->mem_ctx, p->store, 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction, p->store_size); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->store) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"realloc eu store memeory failed"); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = &p->store[p->nr_insn++]; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(insn, p->current, sizeof(*insn)); 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Reset this one-shot flag: 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->current->header.destreg__conditionalmod) { 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.destreg__conditionalmod = 0; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.predicate_control = BRW_PREDICATE_NORMAL; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.opcode = opcode; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_instruction *brw_alu1( struct brw_compile *p, 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint opcode, 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src ) 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, opcode); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_instruction *brw_alu2(struct brw_compile *p, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint opcode, 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1 ) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, opcode); 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, src1); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_3src_subreg_nr(struct brw_reg reg) 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.vstride == BRW_VERTICAL_STRIDE_0) { 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(brw_is_single_value_swizzle(reg.dw1.bits.swizzle)); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg.subnr / 4 + BRW_GET_SWZ(reg.dw1.bits.swizzle, 0); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg.subnr / 4; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_instruction *brw_alu3(struct brw_compile *p, 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint opcode, 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1, 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src2) 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, opcode); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen7_convert_mrf_to_grf(p, &dest); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.access_mode == BRW_ALIGN_16); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.file == BRW_GENERAL_REGISTER_FILE || 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest.file == BRW_MESSAGE_REGISTER_FILE); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.nr < 128); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.address_mode == BRW_ADDRESS_DIRECT); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.type = BRW_REGISTER_TYPE_F); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.dest_reg_file = (dest.file == BRW_MESSAGE_REGISTER_FILE); 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.dest_reg_nr = dest.nr; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.dest_subreg_nr = dest.subnr / 16; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.dest_writemask = dest.dw1.bits.writemask; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org guess_execution_size(p, insn, dest); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.file == BRW_GENERAL_REGISTER_FILE); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.address_mode == BRW_ADDRESS_DIRECT); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.nr < 128); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type == BRW_REGISTER_TYPE_F); 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src0_swizzle = src0.dw1.bits.swizzle; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src0_subreg_nr = get_3src_subreg_nr(src0); 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src0_reg_nr = src0.nr; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src0_abs = src0.abs; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src0_negate = src0.negate; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src0_rep_ctrl = src0.vstride == BRW_VERTICAL_STRIDE_0; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.file == BRW_GENERAL_REGISTER_FILE); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.address_mode == BRW_ADDRESS_DIRECT); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.nr < 128); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type == BRW_REGISTER_TYPE_F); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src1_swizzle = src1.dw1.bits.swizzle; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src1_subreg_nr_low = get_3src_subreg_nr(src1) & 0x3; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src1_subreg_nr_high = get_3src_subreg_nr(src1) >> 2; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits2.da3src.src1_rep_ctrl = src1.vstride == BRW_VERTICAL_STRIDE_0; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src1_reg_nr = src1.nr; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src1_abs = src1.abs; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src1_negate = src1.negate; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src2.file == BRW_GENERAL_REGISTER_FILE); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src2.address_mode == BRW_ADDRESS_DIRECT); 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src2.nr < 128); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src2.type == BRW_REGISTER_TYPE_F); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src2_swizzle = src2.dw1.bits.swizzle; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src2_subreg_nr = get_3src_subreg_nr(src2); 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src2_rep_ctrl = src2.vstride == BRW_VERTICAL_STRIDE_0; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.da3src.src2_reg_nr = src2.nr; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src2_abs = src2.abs; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.da3src.src2_negate = src2.negate; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convenience routines. 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALU1(OP) \ 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_##OP(struct brw_compile *p, \ 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, \ 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0) \ 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu1(p, BRW_OPCODE_##OP, dest, src0); \ 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALU2(OP) \ 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_##OP(struct brw_compile *p, \ 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, \ 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, \ 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) \ 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu2(p, BRW_OPCODE_##OP, dest, src0, src1); \ 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALU3(OP) \ 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_##OP(struct brw_compile *p, \ 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, \ 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, \ 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1, \ 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src2) \ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu3(p, BRW_OPCODE_##OP, dest, src0, src1, src2); \ 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Rounding operations (other than RNDD) require two instructions - the first 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stores a rounded value (possibly the wrong way) in the dest register, but 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * also sets a per-channel "increment bit" in the flag register. A predicated 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * add of 1.0 fixes dest to contain the desired result. 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sandybridge and later appear to round correctly without an ADD. 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ROUND(OP) \ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_##OP(struct brw_compile *p, \ 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, \ 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src) \ 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ \ 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *rnd, *add; \ 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rnd = next_insn(p, BRW_OPCODE_##OP); \ 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, rnd, dest); \ 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, rnd, src); \ 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org \ 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->brw->intel.gen < 6) { \ 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* turn on round-increments */ \ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rnd->header.destreg__conditionalmod = BRW_CONDITIONAL_R; \ 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org add = brw_ADD(p, dest, dest, brw_imm_f(1.0f)); \ 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org add->header.predicate_control = BRW_PREDICATE_NORMAL; \ 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU1(MOV) 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(SEL) 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU1(NOT) 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(AND) 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(OR) 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(XOR) 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(SHR) 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(SHL) 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(RSR) 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(RSL) 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(ASR) 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU1(FRC) 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU1(RNDD) 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(MAC) 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(MACH) 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU1(LZD) 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(DP4) 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(DPH) 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(DP3) 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(DP2) 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(LINE) 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU2(PLN) 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgALU3(MAD) 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgROUND(RNDZ) 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgROUND(RNDE) 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_ADD(struct brw_compile *p, 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 6.2.2: add */ 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src0.type == BRW_REGISTER_TYPE_F || 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src0.file == BRW_IMMEDIATE_VALUE && 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0.type == BRW_REGISTER_TYPE_VF)) { 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type != BRW_REGISTER_TYPE_UD); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type != BRW_REGISTER_TYPE_D); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src1.type == BRW_REGISTER_TYPE_F || 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src1.file == BRW_IMMEDIATE_VALUE && 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1.type == BRW_REGISTER_TYPE_VF)) { 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type != BRW_REGISTER_TYPE_UD); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type != BRW_REGISTER_TYPE_D); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu2(p, BRW_OPCODE_ADD, dest, src0, src1); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_AVG(struct brw_compile *p, 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.type == src0.type); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type == src1.type); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (src0.type) { 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_B: 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_UB: 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_W: 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_UW: 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_D: 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_REGISTER_TYPE_UD: 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Bad type for brw_AVG"); 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu2(p, BRW_OPCODE_AVG, dest, src0, src1); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_MUL(struct brw_compile *p, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 6.32.38: mul */ 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src0.type == BRW_REGISTER_TYPE_D || 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0.type == BRW_REGISTER_TYPE_UD || 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1.type == BRW_REGISTER_TYPE_D || 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1.type == BRW_REGISTER_TYPE_UD) { 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.type != BRW_REGISTER_TYPE_F); 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src0.type == BRW_REGISTER_TYPE_F || 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src0.file == BRW_IMMEDIATE_VALUE && 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0.type == BRW_REGISTER_TYPE_VF)) { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type != BRW_REGISTER_TYPE_UD); 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type != BRW_REGISTER_TYPE_D); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src1.type == BRW_REGISTER_TYPE_F || 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src1.file == BRW_IMMEDIATE_VALUE && 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1.type == BRW_REGISTER_TYPE_VF)) { 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type != BRW_REGISTER_TYPE_UD); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type != BRW_REGISTER_TYPE_D); 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.file != BRW_ARCHITECTURE_REGISTER_FILE || 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0.nr != BRW_ARF_ACCUMULATOR); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.file != BRW_ARCHITECTURE_REGISTER_FILE || 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1.nr != BRW_ARF_ACCUMULATOR); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return brw_alu2(p, BRW_OPCODE_MUL, dest, src0, src1); 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_NOP(struct brw_compile *p) 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_NOP); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_ud(0x0)); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Comparisons, if/else/endif 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_JMPI(struct brw_compile *p, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = brw_alu2(p, BRW_OPCODE_JMPI, dest, src0, src1); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = 1; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_DISABLE; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.predicate_control = BRW_PREDICATE_NONE; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpush_if_stack(struct brw_compile *p, struct brw_instruction *inst) 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack[p->if_stack_depth] = inst - p->store; 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack_depth++; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->if_stack_array_size <= p->if_stack_depth) { 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack_array_size *= 2; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack = reralloc(p->mem_ctx, p->if_stack, int, 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack_array_size); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_instruction * 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpop_if_stack(struct brw_compile *p) 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_stack_depth--; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &p->store[p->if_stack[p->if_stack_depth]]; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpush_loop_stack(struct brw_compile *p, struct brw_instruction *inst) 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->loop_stack_array_size < p->loop_stack_depth) { 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack_array_size *= 2; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack = reralloc(p->mem_ctx, p->loop_stack, int, 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack_array_size); 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_depth_in_loop = reralloc(p->mem_ctx, p->if_depth_in_loop, int, 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack_array_size); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack[p->loop_stack_depth] = inst - p->store; 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack_depth++; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_depth_in_loop[p->loop_stack_depth] = 0; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_instruction * 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_inner_do_insn(struct brw_compile *p) 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &p->store[p->loop_stack[p->loop_stack_depth - 1]]; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* EU takes the value from the flag register and pushes it onto some 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sort of a stack (presumably merging with any flag value already on 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the stack). Within an if block, the flags at the top of the stack 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * control execution on each channel of the unit, eg. on each of the 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16 pixel values in our wm programs. 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When the matching 'else' instruction is reached (presumably by 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * countdown of the instruction count patched in by our ELSE/ENDIF 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions), the relevent flags are inverted. 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When the matching 'endif' instruction is reached, the flags are 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * popped off. If the stack is now empty, normal execution resumes. 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction * 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_IF(struct brw_compile *p, GLuint execute_size) 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_IF); 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Override the defaults for this instruction: 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_imm_w(0)); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.branch_gen6.jump_count = 0; 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D))); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D))); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D))); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D))); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_ud(0)); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = 0; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.uip = 0; 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = execute_size; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = BRW_PREDICATE_NORMAL; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_ENABLE; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->single_program_flow) 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.thread_control = BRW_THREAD_SWITCH; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.predicate_control = BRW_PREDICATE_NONE; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_if_stack(p, insn); 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_depth_in_loop[p->loop_stack_depth]++; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This function is only used for gen6-style IF instructions with an 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * embedded comparison (conditional modifier). It is not used on gen7. 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction * 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggen6_IF(struct brw_compile *p, uint32_t conditional, 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, struct brw_reg src1) 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_IF); 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_imm_w(0)); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->compressed) { 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_16; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.branch_gen6.jump_count = 0; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, src1); 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.compression_control == BRW_COMPRESSION_NONE); 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.predicate_control == BRW_PREDICATE_NONE); 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = conditional; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->single_program_flow) 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.thread_control = BRW_THREAD_SWITCH; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_if_stack(p, insn); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In single-program-flow (SPF) mode, convert IF and ELSE into ADDs. 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconvert_IF_ELSE_to_ADD(struct brw_compile *p, 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *if_inst, 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *else_inst) 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The next instruction (where the ENDIF would be, if it existed) */ 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *next_inst = &p->store[p->nr_insn]; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(p->single_program_flow); 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(if_inst != NULL && if_inst->header.opcode == BRW_OPCODE_IF); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(else_inst == NULL || else_inst->header.opcode == BRW_OPCODE_ELSE); 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(if_inst->header.execution_size == BRW_EXECUTE_1); 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert IF to an ADD instruction that moves the instruction pointer 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the first instruction of the ELSE block. If there is no ELSE 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * block, point to where ENDIF would be. Reverse the predicate. 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * There's no need to execute an ENDIF since we don't need to do any 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stack operations, and if we're currently executing, we just want to 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * continue normally. 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->header.opcode = BRW_OPCODE_ADD; 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->header.predicate_inverse = 1; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (else_inst != NULL) { 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Convert ELSE to an ADD instruction that points where the ENDIF 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * would be. 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->header.opcode = BRW_OPCODE_ADD; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.ud = (else_inst - if_inst + 1) * 16; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits3.ud = (next_inst - else_inst) * 16; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.ud = (next_inst - if_inst) * 16; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Patch IF and ELSE instructions with appropriate jump targets. 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpatch_IF_ELSE(struct brw_compile *p, 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *if_inst, 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *else_inst, 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *endif_inst) 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We shouldn't be patching IF and ELSE instructions in single program flow 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mode when gen < 6, because in single program flow mode on those 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * platforms, we convert flow control instructions to conditional ADDs that 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * operate on IP (see brw_ENDIF). 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * However, on Gen6, writing to IP doesn't work in single program flow mode 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (see the SandyBridge PRM, Volume 4 part 2, p79: "When SPF is ON, IP may 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not be updated by non-flow control instructions."). And on later 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * platforms, there is no significant benefit to converting control flow 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instructions to conditional ADDs. So we do patch IF and ELSE 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instructions in single program flow mode on those platforms. 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!p->single_program_flow); 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(if_inst != NULL && if_inst->header.opcode == BRW_OPCODE_IF); 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(endif_inst != NULL); 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(else_inst == NULL || else_inst->header.opcode == BRW_OPCODE_ELSE); 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned br = 1; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Jump count is for 64bit data chunk each, so one 128bit instruction 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * requires 2 chunks. 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 5) 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br = 2; 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(endif_inst->header.opcode == BRW_OPCODE_ENDIF); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org endif_inst->header.execution_size = if_inst->header.execution_size; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (else_inst == NULL) { 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Patch IF -> ENDIF */ 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Turn it into an IFF, which means no mask stack operations for 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all-false and jumping past the ENDIF. 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->header.opcode = BRW_OPCODE_IFF; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.jump_count = br * (endif_inst - if_inst + 1); 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.pop_count = 0; 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.pad0 = 0; 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* As of gen6, there is no IFF and IF must point to the ENDIF. */ 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits1.branch_gen6.jump_count = br * (endif_inst - if_inst); 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.break_cont.uip = br * (endif_inst - if_inst); 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.break_cont.jip = br * (endif_inst - if_inst); 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->header.execution_size = if_inst->header.execution_size; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Patch IF -> ELSE */ 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.jump_count = br * (else_inst - if_inst); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.pop_count = 0; 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.if_else.pad0 = 0; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits1.branch_gen6.jump_count = br * (else_inst - if_inst + 1); 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Patch ELSE -> ENDIF */ 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_OPCODE_ELSE pre-gen6 should point just past the 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * matching ENDIF. 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits3.if_else.jump_count = br*(endif_inst - else_inst + 1); 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits3.if_else.pop_count = 1; 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits3.if_else.pad0 = 0; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_OPCODE_ELSE on gen6 should point to the matching ENDIF. */ 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits1.branch_gen6.jump_count = br*(endif_inst - else_inst); 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The IF instruction's JIP should point just past the ELSE */ 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.break_cont.jip = br * (else_inst - if_inst + 1); 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The IF instruction's UIP and ELSE's JIP should point to ENDIF */ 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst->bits3.break_cont.uip = br * (endif_inst - if_inst); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst->bits3.break_cont.jip = br * (endif_inst - else_inst); 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_ELSE(struct brw_compile *p) 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_ELSE); 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_imm_w(0)); 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.branch_gen6.jump_count = 0; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_ud(0)); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = 0; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.uip = 0; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_ENABLE; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!p->single_program_flow) 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.thread_control = BRW_THREAD_SWITCH; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_if_stack(p, insn); 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_ENDIF(struct brw_compile *p) 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = NULL; 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *else_inst = NULL; 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *if_inst = NULL; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *tmp; 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool emit_endif = true; 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* In single program flow mode, we can express IF and ELSE instructions 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * equivalently as ADD instructions that operate on IP. On platforms prior 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to Gen6, flow control instructions cause an implied thread switch, so 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this is a significant savings. 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * However, on Gen6, writing to IP doesn't work in single program flow mode 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (see the SandyBridge PRM, Volume 4 part 2, p79: "When SPF is ON, IP may 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not be updated by non-flow control instructions."). And on later 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * platforms, there is no significant benefit to converting control flow 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instructions to conditional ADDs. So we only do this trick on Gen4 and 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gen5. 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6 && p->single_program_flow) 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_endif = false; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A single next_insn() may change the base adress of instruction store 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * memory(p->store), so call it first before referencing the instruction 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * store pointer from an index 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (emit_endif) 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_ENDIF); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Pop the IF and (optional) ELSE instructions from the stack */ 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->if_depth_in_loop[p->loop_stack_depth]--; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = pop_if_stack(p); 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tmp->header.opcode == BRW_OPCODE_ELSE) { 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else_inst = tmp; 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = pop_if_stack(p); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if_inst = tmp; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!emit_endif) { 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ENDIF is useless; don't bother emitting it. */ 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org convert_IF_ELSE_to_ADD(p, if_inst, else_inst); 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_imm_w(0)); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_ud(0)); 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_ENABLE; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.thread_control = BRW_THREAD_SWITCH; 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Also pop item off the stack in the endif instruction: */ 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.jump_count = 0; 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pop_count = 1; 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pad0 = 0; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.branch_gen6.jump_count = 2; 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = 2; 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org patch_IF_ELSE(p, if_inst, else_inst, insn); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_BREAK(struct brw_compile *p) 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_BREAK); 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pad0 = 0; 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pop_count = p->if_depth_in_loop[p->loop_stack_depth]; 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *gen6_CONT(struct brw_compile *p) 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_CONTINUE); 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_CONT(struct brw_compile *p) 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_CONTINUE); 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0x0)); 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insn->header.mask_control = BRW_MASK_DISABLE; */ 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pad0 = 0; 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pop_count = p->if_depth_in_loop[p->loop_stack_depth]; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DO/WHILE loop: 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The DO/WHILE is just an unterminated loop -- break or continue are 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used for control within the loop. We have a few ways they can be 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * done. 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For uniform control flow, the WHILE is just a jump, so ADD ip, ip, 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * jip and no DO instruction. 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For non-uniform control flow pre-gen6, there's a DO instruction to 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * push the mask, and a WHILE to jump back, and BREAK to get out and 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pop the mask. 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For gen6, there's no more mask stack, so no need for DO. WHILE 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just points back to the first instruction of the loop. 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_DO(struct brw_compile *p, GLuint execute_size) 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6 || p->single_program_flow) { 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_loop_stack(p, &p->store[p->nr_insn]); 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &p->store[p->nr_insn]; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_DO); 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_loop_stack(p, insn); 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Override the defaults for this instruction: 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_null_reg()); 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_null_reg()); 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = execute_size; 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = BRW_PREDICATE_NONE; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insn->header.mask_control = BRW_MASK_ENABLE; */ 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insn->header.mask_control = BRW_MASK_DISABLE; */ 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For pre-gen6, we patch BREAK/CONT instructions to point at the WHILE 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instruction here. 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For gen6+, see brw_set_uip_jip(), which doesn't care so much about the loop 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * nesting, since it can always just point to the end of the block/current loop. 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_patch_break_cont(struct brw_compile *p, struct brw_instruction *while_inst) 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *do_inst = get_inner_do_insn(p); 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *inst; 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int br = (intel->gen == 5) ? 2 : 1; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (inst = while_inst - 1; inst != do_inst; inst--) { 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the jump count is != 0, that means that this instruction has already 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * been patched because it's part of a loop inside of the one we're 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * patching. 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->header.opcode == BRW_OPCODE_BREAK && 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.if_else.jump_count == 0) { 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.if_else.jump_count = br * ((while_inst - inst) + 1); 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (inst->header.opcode == BRW_OPCODE_CONTINUE && 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.if_else.jump_count == 0) { 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->bits3.if_else.jump_count = br * (while_inst - inst); 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct brw_instruction *brw_WHILE(struct brw_compile *p) 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn, *do_insn; 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint br = 1; 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 5) 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br = 2; 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 7) { 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_WHILE); 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_insn = get_inner_do_insn(p); 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_ud(0)); 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = br * (do_insn - insn); 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (intel->gen == 6) { 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_WHILE); 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_insn = get_inner_do_insn(p); 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_imm_w(0)); 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits1.branch_gen6.jump_count = br * (do_insn - insn); 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_8; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->single_program_flow) { 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_ADD); 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_insn = get_inner_do_insn(p); 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d((do_insn - insn) * 16)); 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = BRW_EXECUTE_1; 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_WHILE); 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_insn = get_inner_do_insn(p); 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(do_insn->header.opcode == BRW_OPCODE_DO); 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, brw_ip_reg()); 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_ip_reg()); 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0)); 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = do_insn->header.execution_size; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.jump_count = br * (do_insn - insn + 1); 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pop_count = 0; 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.if_else.pad0 = 0; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_patch_break_cont(p, insn); 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.predicate_control = BRW_PREDICATE_NONE; 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->loop_stack_depth--; 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn; 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* FORWARD JUMPS: 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_land_fwd_jump(struct brw_compile *p, int jmp_insn_idx) 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *jmp_insn = &p->store[jmp_insn_idx]; 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint jmpi = 1; 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 5) 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org jmpi = 2; 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(jmp_insn->header.opcode == BRW_OPCODE_JMPI); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(jmp_insn->bits1.da1.src1_reg_file == BRW_IMMEDIATE_VALUE); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org jmp_insn->bits3.ud = jmpi * (p->nr_insn - jmp_insn_idx - 1); 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* To integrate with the above, it makes sense that the comparison 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instruction should populate the flag register. It might be simpler 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just to use the flag reg for most WM tasks? 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_CMP(struct brw_compile *p, 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint conditional, 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_CMP); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = conditional; 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, src1); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* guess_execution_size(insn, src0); */ 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Make it so that future instructions will use the computed flag 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * value until brw_set_predicate_control_flag_value() is called 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * again. 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dest.file == BRW_ARCHITECTURE_REGISTER_FILE && 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest.nr == 0) { 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->current->header.predicate_control = BRW_PREDICATE_NORMAL; 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p->flag_value = 0xff; 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Issue 'wait' instruction for n1, host could program MMIO 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to wake up thread. */ 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_WAIT (struct brw_compile *p) 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_WAIT); 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src = brw_notification_1_reg(); 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, src); 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_null_reg()); 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.execution_size = 0; /* must */ 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = 0; 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = 0; 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helpers for the various SEND message types: 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Extended math function, float[8]. 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_math( struct brw_compile *p, 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint function, 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src, 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint data_type, 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint precision ) 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_MATH); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.file == BRW_GENERAL_REGISTER_FILE); 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.file == BRW_GENERAL_REGISTER_FILE); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.hstride == BRW_HORIZONTAL_STRIDE_1); 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.hstride == BRW_HORIZONTAL_STRIDE_1); 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Source modifiers are ignored for extended math instructions on Gen6. */ 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) { 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src.negate); 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src.abs); 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (function == BRW_MATH_FUNCTION_INT_DIV_QUOTIENT || 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function == BRW_MATH_FUNCTION_INT_DIV_REMAINDER || 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function == BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER) { 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.type != BRW_REGISTER_TYPE_F); 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.type == BRW_REGISTER_TYPE_F); 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Math is the same ISA format as other opcodes, except that CondModifier 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * becomes FC[3:0] and ThreadCtrl becomes FC[5:4]. 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = function; 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_null_reg()); 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Example code doesn't set predicate_control for send 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instructions. 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = 0; 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_math_message(p, 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function, 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.type == BRW_REGISTER_TYPE_D, 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org precision, 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_type); 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Extended math function, float[8]. 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_math2(struct brw_compile *p, 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint function, 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src1) 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_MATH); 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(intel->gen >= 6); 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) intel; 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.file == BRW_GENERAL_REGISTER_FILE); 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.file == BRW_GENERAL_REGISTER_FILE); 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.file == BRW_GENERAL_REGISTER_FILE); 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dest.hstride == BRW_HORIZONTAL_STRIDE_1); 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) { 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.hstride == BRW_HORIZONTAL_STRIDE_1); 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.hstride == BRW_HORIZONTAL_STRIDE_1); 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (function == BRW_MATH_FUNCTION_INT_DIV_QUOTIENT || 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function == BRW_MATH_FUNCTION_INT_DIV_REMAINDER || 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function == BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER) { 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type != BRW_REGISTER_TYPE_F); 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type != BRW_REGISTER_TYPE_F); 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src0.type == BRW_REGISTER_TYPE_F); 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src1.type == BRW_REGISTER_TYPE_F); 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Source modifiers are ignored for extended math instructions on Gen6. */ 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 6) { 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src0.negate); 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src0.abs); 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src1.negate); 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src1.abs); 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Math is the same ISA format as other opcodes, except that CondModifier 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * becomes FC[3:0] and ThreadCtrl becomes FC[5:4]. 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = function; 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, src1); 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Extended math function, float[16]. 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use 2 send instructions. 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_math_16( struct brw_compile *p, 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint function, 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src, 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint precision ) 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_MATH); 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Math is the same ISA format as other opcodes, except that CondModifier 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * becomes FC[3:0] and ThreadCtrl becomes FC[5:4]. 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = function; 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Source modifiers are ignored for extended math instructions. */ 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src.negate); 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!src.abs); 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_null_reg()); 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* First instruction: 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_predicate_control_flag_value(p, 0xff); 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_math_message(p, 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function, 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_MATH_INTEGER_UNSIGNED, 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org precision, 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_MATH_DATA_VECTOR); 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Second instruction: 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_2NDHALF; 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr+1; 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, offset(dest,1)); 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_math_message(p, 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function, 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_MATH_INTEGER_UNSIGNED, 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org precision, 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_MATH_DATA_VECTOR); 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Write a block of OWORDs (half a GRF each) from the scratch buffer, 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * using a constant offset per channel. 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The offset must be aligned to oword size (16 bytes). Used for 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * register spilling. 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_oword_block_write_scratch(struct brw_compile *p, 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg mrf, 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_regs, 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint offset) 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t msg_control, msg_type; 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int mlen; 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset /= 16; 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf = retype(mrf, BRW_REGISTER_TYPE_UD); 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_regs == 1) { 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control = BRW_DATAPORT_OWORD_BLOCK_2_OWORDS; 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mlen = 2; 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control = BRW_DATAPORT_OWORD_BLOCK_4_OWORDS; 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mlen = 3; 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the message header. This is g0, with g0.2 filled with 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the offset. We don't want to leave our offset around in g0 or 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it'll screw up texture samples, so set it up inside the message 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reg. 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, mrf, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD)); 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set message header global offset field (reg 0, element 2) */ 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(brw_vec1_reg(BRW_MESSAGE_REGISTER_FILE, 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf.nr, 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2), BRW_REGISTER_TYPE_UD), 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_imm_ud(offset)); 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest; 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int send_commit_msg; 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src_header = retype(brw_vec8_grf(0, 0), 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_REGISTER_TYPE_UW); 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.compression_control != BRW_COMPRESSION_NONE) { 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_header = vec16(src_header); 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.predicate_control == BRW_PREDICATE_NONE); 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = mrf.nr; 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Until gen6, writes followed by reads from the same location 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are not guaranteed to be ordered unless write_commit is set. 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If set, then a no-op write is issued to the destination 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * register to set a dependency, and a read from the destination 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * can be used to ensure the ordering. 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For gen6, only writes between different threads need ordering 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * protection. Our use of DP writes is all about register 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * spilling within a thread. 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(vec16(brw_null_reg()), BRW_REGISTER_TYPE_UW); 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg = 0; 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = src_header; 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg = 1; 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, mrf); 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE; 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE; 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_write_message(p, 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255, /* binding table index (255=stateless) */ 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control, 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type, 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mlen, 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org true, /* header_present */ 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* not a render target */ 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg, /* response_length */ 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* eot */ 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg); 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read a block of owords (half a GRF each) from the scratch buffer 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * using a constant index per channel. 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Offset must be aligned to oword size (16 bytes). Used for register 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * spilling. 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_oword_block_read_scratch(struct brw_compile *p, 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg mrf, 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_regs, 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint offset) 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t msg_control; 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int rlen; 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset /= 16; 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf = retype(mrf, BRW_REGISTER_TYPE_UD); 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(dest, BRW_REGISTER_TYPE_UW); 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_regs == 1) { 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control = BRW_DATAPORT_OWORD_BLOCK_2_OWORDS; 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rlen = 1; 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control = BRW_DATAPORT_OWORD_BLOCK_4_OWORDS; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rlen = 2; 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, mrf, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD)); 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set message header global offset field (reg 0, element 2) */ 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(brw_vec1_reg(BRW_MESSAGE_REGISTER_FILE, 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf.nr, 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2), BRW_REGISTER_TYPE_UD), 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_imm_ud(offset)); 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->header.predicate_control == 0); 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = mrf.nr; 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); /* UW? */ 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, mrf); 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_read_message(p, 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255, /* binding table index (255=stateless) */ 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control, 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */ 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_TARGET_RENDER_CACHE, 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, /* msg_length */ 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rlen); 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read a float[4] vector from the data port Data Cache (const buffer). 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Location (in buffer) should be a multiple of 16. 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used for fetching shader constants. 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_oword_block_read(struct brw_compile *p, 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg mrf, 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset, 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t bind_table_index) 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* On newer hardware, offset is in units of owords. */ 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset /= 16; 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf = retype(mrf, BRW_REGISTER_TYPE_UD); 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_predicate_control(p, BRW_PREDICATE_NONE); 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, mrf, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD)); 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set message header global offset field (reg 0, element 2) */ 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(brw_vec1_reg(BRW_MESSAGE_REGISTER_FILE, 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf.nr, 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2), BRW_REGISTER_TYPE_UD), 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_imm_ud(offset)); 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = mrf.nr; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cast dest to a uword[8] vector */ 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(vec8(dest), BRW_REGISTER_TYPE_UW); 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, mrf); 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_read_message(p, 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_table_index, 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW, 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_TARGET_DATA_CACHE, 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, /* msg_length */ 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* response_length (1 reg, 2 owords!) */ 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read a set of dwords from the data port Data Cache (const buffer). 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Location (in buffer) appears as UD offsets in the register after 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the provided mrf header reg. 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_dword_scattered_read(struct brw_compile *p, 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg mrf, 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t bind_table_index) 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mrf = retype(mrf, BRW_REGISTER_TYPE_UD); 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_predicate_control(p, BRW_PREDICATE_NONE); 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, mrf, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD)); 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = mrf.nr; 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cast dest to a uword[8] vector */ 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(vec8(dest), BRW_REGISTER_TYPE_UW); 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_read_message(p, 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_table_index, 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS, 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ, 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_TARGET_DATA_CACHE, 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2, /* msg_length */ 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* response_length */ 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read float[4] constant(s) from VS constant buffer. 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For relative addressing, two float[4] constants will be read into 'dest'. 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, one float[4] constant will be read into the lower half of 'dest'. 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_dp_READ_4_vs(struct brw_compile *p, 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint location, 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bind_table_index) 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr = 1; 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org location /= 16; 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup MRF[1] with location/offset into const buffer */ 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_access_mode(p, BRW_ALIGN_1); 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_predicate_control(p, BRW_PREDICATE_NONE); 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, retype(brw_vec1_reg(BRW_MESSAGE_REGISTER_FILE, msg_reg_nr, 2), 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_REGISTER_TYPE_UD), 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_imm_ud(location)); 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = BRW_PREDICATE_NONE; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_DISABLE; 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_message_reg(msg_reg_nr)); 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, brw_null_reg()); 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_read_message(p, 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_table_index, 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */ 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_TARGET_DATA_CACHE, 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, /* msg_length */ 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* response_length (1 Oword) */ 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read a float[4] constant per vertex from VS constant buffer, with 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * relative addressing. 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_dp_READ_4_vs_relative(struct brw_compile *p, 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg addr_reg, 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint offset, 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bind_table_index) 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src = brw_vec8_grf(0, 0); 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int msg_type; 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup MRF[1] with offset into const buffer */ 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_access_mode(p, BRW_ALIGN_1); 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_predicate_control(p, BRW_PREDICATE_NONE); 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* M1.0 is block offset 0, M1.4 is block offset 1, all other 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields ignored. 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_ADD(p, retype(brw_message_reg(1), BRW_REGISTER_TYPE_D), 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addr_reg, brw_imm_d(offset)); 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_resolve_implied_move(p, &src, 0); 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = BRW_PREDICATE_NONE; 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = 0; 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.mask_control = BRW_MASK_DISABLE; 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src); 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ; 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (intel->gen == 5 || intel->is_g4x) 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = G45_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ; 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = BRW_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ; 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_read_message(p, 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_table_index, 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD, 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type, 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_DATAPORT_READ_TARGET_DATA_CACHE, 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2, /* msg_length */ 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* response_length */ 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_fb_WRITE(struct brw_compile *p, 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dispatch_width, 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_control, 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool eot, 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool header_present) 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_type; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest; 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dispatch_width == 16) 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(vec16(brw_null_reg()), BRW_REGISTER_TYPE_UW); 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = retype(vec8(brw_null_reg()), BRW_REGISTER_TYPE_UW); 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SENDC); 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The execution mask is ignored for render target writes. */ 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = 0; 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* headerless version, just submit color payload */ 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = brw_message_reg(msg_reg_nr); 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE; 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type = BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE; 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_write_message(p, 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org binding_table_index, 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_control, 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type, 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length, 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org header_present, 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eot, /* last render target write */ 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length, 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eot, 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 /* send_commit_msg */); 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture sample instruction. 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: the msg_type plus msg_length values determine exactly what kind 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of sampling operation is performed. See volume 4, page 161 of docs. 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_SAMPLE(struct brw_compile *p, 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint sampler, 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint writemask, 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_type, 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint header_present, 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint simd_mode, 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint return_format) 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool need_stall = 0; 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask == 0) { 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*printf("%s: zero writemask??\n", __FUNCTION__); */ 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Hardware doesn't do destination dependency checking on send 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instructions properly. Add a workaround which generates the 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dependency by other means. In practice it seems like this bug 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * only crops up for texture samples, and only where registers are 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * written by the send and then written again later without being 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * read in between. Luckily for us, we already track that 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * information and use it to modify the writemask for the 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instruction, so that is a guide for whether a workaround is 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * needed. 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask != WRITEMASK_XYZW) { 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dst_offset = 0; 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, newmask = 0, len = 0; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask & (1<<i)) 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_offset += 2; 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < 4; i++) { 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(writemask & (1<<i))) 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newmask |= 1<<i; 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org len++; 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (newmask != writemask) { 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_stall = 1; 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* printf("need stall %x %x\n", newmask , writemask); */ 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool dispatch_16 = false; 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg m1 = brw_message_reg(msg_reg_nr); 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org guess_execution_size(p, p->current, dest); 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p->current->header.execution_size == BRW_EXECUTE_16) 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dispatch_16 = true; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newmask = ~newmask & WRITEMASK_XYZW; 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_mask_control(p, BRW_MASK_DISABLE); 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, retype(m1, BRW_REGISTER_TYPE_UD), 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(brw_vec8_grf(0,0), BRW_REGISTER_TYPE_UD)); 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, get_element_ud(m1, 2), brw_imm_ud(newmask << 12)); 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = retype(brw_null_reg(), BRW_REGISTER_TYPE_UW); 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dest = offset(dest, dst_offset); 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For 16-wide dispatch, masked channels are skipped in the 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * response. For 8-wide, masked channels still take up slots, 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and are just not written to. 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dispatch_16) 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length = len * 2; 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_resolve_implied_move(p, &src0, msg_reg_nr); 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.predicate_control = 0; /* XXX */ 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.compression_control = BRW_COMPRESSION_NONE; 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_sampler_message(p, insn, 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org binding_table_index, 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler, 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_type, 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length, 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length, 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org header_present, 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org simd_mode, 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return_format); 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (need_stall) { 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg reg = vec8(offset(dest, response_length-1)); 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mov (8) r9.0<1>:f r9.0<8;8,1>:f { Align1 } 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_compression_control(p, BRW_COMPRESSION_NONE); 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_MOV(p, retype(reg, BRW_REGISTER_TYPE_UD), 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(reg, BRW_REGISTER_TYPE_UD)); 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* All these variables are pretty confusing - we might be better off 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * using bitmasks and macros for this, in the old style. Or perhaps 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just having the caller instantiate the fields in dword3 itself. 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_urb_WRITE(struct brw_compile *p, 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool allocate, 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool used, 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_length, 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool eot, 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool writes_complete, 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint offset, 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint swizzle) 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_resolve_implied_move(p, &src0, msg_reg_nr); 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen == 7) { 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable Channel Masks in the URB_WRITE_HWORD message header */ 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_push_insn_state(p); 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_access_mode(p, BRW_ALIGN_1); 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_OR(p, retype(brw_vec1_reg(BRW_MESSAGE_REGISTER_FILE, msg_reg_nr, 5), 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_REGISTER_TYPE_UD), 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org retype(brw_vec1_grf(0, 5), BRW_REGISTER_TYPE_UD), 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_imm_ud(0xff00)); 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_pop_insn_state(p); 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(msg_length < BRW_MAX_MRF); 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0)); 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_urb_message(p, 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org allocate, 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org used, 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org msg_length, 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length, 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eot, 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org writes_complete, 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset, 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle); 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_find_next_block_end(struct brw_compile *p, int start) 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ip; 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ip = start + 1; ip < p->nr_insn; ip++) { 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = &p->store[ip]; 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->header.opcode) { 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_OPCODE_ENDIF: 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_OPCODE_ELSE: 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_OPCODE_WHILE: 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ip; 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"not reached"); 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return start + 1; 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* There is no DO instruction on gen6, so to find the end of the loop 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we have to see if the loop is jumping back before our start 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instruction. 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_find_loop_end(struct brw_compile *p, int start) 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ip; 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int br = 2; 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ip = start + 1; ip < p->nr_insn; ip++) { 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = &p->store[ip]; 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->header.opcode == BRW_OPCODE_WHILE) { 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int jip = intel->gen == 6 ? insn->bits1.branch_gen6.jump_count 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : insn->bits3.break_cont.jip; 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ip + jip / br <= start) 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ip; 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"not reached"); 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return start + 1; 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* After program generation, go back and update the UIP and JIP of 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BREAK and CONT instructions to their correct locations. 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_set_uip_jip(struct brw_compile *p) 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ip; 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int br = 2; 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ip = 0; ip < p->nr_insn; ip++) { 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn = &p->store[ip]; 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->header.opcode) { 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_OPCODE_BREAK: 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = br * (brw_find_next_block_end(p, ip) - ip); 2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Gen7 UIP points to WHILE; Gen6 points just after it */ 2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.uip = 2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org br * (brw_find_loop_end(p, ip) - ip + (intel->gen == 6 ? 1 : 0)); 2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case BRW_OPCODE_CONTINUE: 2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.jip = br * (brw_find_next_block_end(p, ip) - ip); 2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bits3.break_cont.uip = br * (brw_find_loop_end(p, ip) - ip); 2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->bits3.break_cont.uip != 0); 2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->bits3.break_cont.jip != 0); 2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_ff_sync(struct brw_compile *p, 2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool allocate, 2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint response_length, 2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool eot) 2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &p->brw->intel; 2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_resolve_implied_move(p, &src0, msg_reg_nr); 2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0)); 2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->header.destreg__conditionalmod = msg_reg_nr; 2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_ff_sync_message(p, 2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn, 2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org allocate, 2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org response_length, 2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eot); 2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit the SEND instruction necessary to generate stream output data on Gen6 2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (for transform feedback). 2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If send_commit_msg is true, this is the last piece of stream output data 2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from this thread, so send the data as a committed write. According to the 2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sandy Bridge PRM (volume 2 part 1, section 4.5.1): 2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Prior to End of Thread with a URB_WRITE, the kernel must ensure all 2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * writes are complete by sending the final write as a committed write." 2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_svb_write(struct brw_compile *p, 2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg dest, 2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint msg_reg_nr, 2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_reg src0, 2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint binding_table_index, 2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool send_commit_msg) 2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_instruction *insn; 2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gen6_resolve_implied_move(p, &src0, msg_reg_nr); 2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn = next_insn(p, BRW_OPCODE_SEND); 2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dest(p, insn, dest); 2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src0(p, insn, src0); 2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_src1(p, insn, brw_imm_d(0)); 2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_set_dp_write_message(p, insn, 2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org binding_table_index, 2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* msg_control: ignored */ 2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE, 2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, /* msg_length */ 2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org true, /* header_present */ 2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* last_render_target: ignored */ 2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg, /* response_length */ 2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* end_of_thread */ 2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org send_commit_msg); /* send_commit_msg */ 2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2621