1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_sq.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_llvm.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_formats.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_opcodes.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600d.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_info.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_scan.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <byteswap.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* CAYMAN notes 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWhy CAYMAN got loops for lots of instructions is explained here. 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org-These 8xx t-slot only ops are implemented in all vector slots. 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThese 8xx t-slot only opcodes become vector ops, with all four 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgslots expecting the arguments on sources a and b. Result is 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbroadcast to all channels. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThese 8xx t-slot only opcodes become vector ops in the z, y, and 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx slots. 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSQRT_IEEE/_64 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSIN/COS 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe w slot may have an independent co-issued operation, or if the 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgresult is required to be in the w slot, the opcode above may be 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgissued in the w slot as well. 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe compiler must issue the source argument to slots z, y, and x 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader *rshader = &shader->shader; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *ptr; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy new shader */ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->bo == NULL) { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->bo = (struct r600_resource*) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->bo == NULL) { 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -ENOMEM; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R600_BIG_ENDIAN) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rshader->bc.ndw; ++i) { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr[i] = bswap_32(rshader->bc.bytecode[i]); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr)); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->ws->buffer_unmap(shader->bo->cs_buf); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* build state */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rshader->processor_type) { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROCESSOR_VERTEX: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->chip_class >= EVERGREEN) { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org evergreen_pipe_shader_vs(ctx, shader); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_pipe_shader_vs(ctx, shader); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROCESSOR_FRAGMENT: 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rctx->chip_class >= EVERGREEN) { 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org evergreen_pipe_shader_ps(ctx, shader); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_pipe_shader_ps(ctx, shader); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static int dump_shaders = -1; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *rctx = (struct r600_context *)ctx; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_pipe_shader_selector *sel = shader->selector; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Would like some magic "get_bool_option_once" routine. 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dump_shaders == -1) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dump_shaders) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "--------------------------------------------------------------\n"); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(sel->tokens, 0); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sel->so.num_outputs) { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "STREAMOUT\n"); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < sel->so.num_outputs; i++) { 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask = ((1 << sel->so.output[i].num_components) - 1) << 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->so.output[i].start_component; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i, 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel->so.output[i].output_buffer, sel->so.output[i].register_index, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask & 1 ? "x" : "_", 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (mask >> 1) & 1 ? "y" : "_", 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (mask >> 2) & 1 ? "z" : "_", 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (mask >> 3) & 1 ? "w" : "_"); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_shader_from_tgsi(rctx, shader); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("translation from TGSI failed !\n"); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_build(&shader->shader.bc); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("building bytecode failed !\n"); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dump_shaders) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_dump(&shader->shader.bc); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "______________________________________________________________\n"); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r600_pipe_shader(ctx, shader); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_clear(&shader->shader.bc); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tgsi -> r600 shader 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_tgsi_instruction; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_src { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sel; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle[4]; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned neg; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned abs; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned rel; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t value[4]; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_ctx { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_shader_info info; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_parse_context parse; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_token *tokens; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned type; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned file_offset[TGSI_FILE_COUNT]; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned temp_reg; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader_tgsi_instruction *inst_info; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode *bc; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader *shader; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader_src src[4]; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *literals; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t nliterals; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t max_driver_temp_used; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* needed for evergreen interpolation */ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean input_centroid; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean input_linear; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean input_perspective; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_interp_gpr; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int face_gpr; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int colors_used; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean clip_vertex_write; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned cv_output; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fragcoord_input; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int native_integers; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r600_shader_tgsi_instruction { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tgsi_opcode; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_op3; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned r600_opcode; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int (*process)(struct r600_shader_ctx *ctx); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_else(struct r600_shader_ctx *ctx); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endif(struct r600_shader_ctx *ctx); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endloop(struct r600_shader_ctx *ctx); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bytestream -> r600 shader 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These functions are used to transform the output of the LLVM backend into 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * struct r600_bytecode. 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned num_bytes); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_OPENCL 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint r600_compute_shader_create(struct pipe_context * ctx, 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMModuleRef mod, struct r600_bytecode * bytecode) 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_context *r600_ctx = (struct r600_context *)ctx; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned byte_count; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader_ctx shader_ctx; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dump = 0; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump = 1; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_llvm_compile(mod, &bytes, &byte_count, r600_ctx->family , dump); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_ctx.bc = bytecode; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_init(shader_ctx.bc, r600_ctx->chip_class, r600_ctx->family); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_ctx.bc->type = TGSI_PROCESSOR_COMPUTE; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_from_byte_stream(&shader_ctx, bytes, byte_count); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader_ctx.bc->chip_class == CAYMAN) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cm_bytecode_add_cf_end(shader_ctx.bc); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_build(shader_ctx.bc); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dump) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_dump(shader_ctx.bc); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* HAVE_OPENCL */ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t i32_from_byte_stream(unsigned char * bytes, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned * bytes_read) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t out = 0; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out |= bytes[(*bytes_read)++] << (8 * i); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return out; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_src_from_byte_stream(unsigned char * bytes, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sel0, sel1; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel0 = bytes[bytes_read++]; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel1 = bytes[bytes_read++]; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].sel = sel0 | (sel1 << 8); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].chan = bytes[bytes_read++]; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].neg = bytes[bytes_read++]; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].abs = bytes[bytes_read++]; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].rel = bytes[bytes_read++]; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].kc_bank = bytes[bytes_read++]; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bytes_read; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx, 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned bytes_read) 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_idx; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned inst0, inst1; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned push_modifier; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(src_idx = 0; src_idx < 3; src_idx++) { 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_src_from_byte_stream(bytes, bytes_read, 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &alu, src_idx); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = bytes[bytes_read++]; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = bytes[bytes_read++]; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.clamp = bytes[bytes_read++]; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = bytes[bytes_read++]; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.rel = bytes[bytes_read++]; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst0 = bytes[bytes_read++]; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst1 = bytes[bytes_read++]; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = inst0 | (inst1 << 8); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = bytes[bytes_read++]; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = bytes[bytes_read++]; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org push_modifier = bytes[bytes_read++]; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.pred_sel = bytes[bytes_read++]; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.bank_swizzle = bytes[bytes_read++]; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.bank_swizzle_force = bytes[bytes_read++]; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.omod = bytes[bytes_read++]; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.index_mode = bytes[bytes_read++]; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE) || 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE) || 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT) || 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)) { 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.update_pred = 1; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 0; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (push_modifier) { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.pred_sel = 0; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.execute_mask = 1; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_alu(ctx->bc, &alu); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Handle other KILL instructions */ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) { 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->uses_kill = 1; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: This should be enforced in the LLVM backend. */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->force_add_cf = 1; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bytes_read; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu, 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pred_inst) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_pushlevel(ctx, FC_IF); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_check_depth(ctx, FC_PUSH_VPM, 0); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx, 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu *alu, unsigned compare_opcode) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opcode = TGSI_OPCODE_BRK; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->bc->chip_class >= EVERGREEN) 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm_if(ctx, alu, compare_opcode); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_loop_brk_cont(ctx); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_endif(ctx); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned bytes_read) 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned inst; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst = bytes[bytes_read++]; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: /* FC_IF */ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm_if(ctx, &alu, 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: /* FC_IF_INT */ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvm_if(ctx, &alu, 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: /* FC_ELSE */ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_else(ctx); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: /* FC_ENDIF */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_endif(ctx); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: /* FC_BGNLOOP */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_bgnloop(ctx); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 5: /* FC_ENDLOOP */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_endloop(ctx); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 6: /* FC_BREAK */ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_break_from_byte_stream(ctx, &alu, 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 7: /* FC_BREAK_NZ_INT */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_break_from_byte_stream(ctx, &alu, 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: /* FC_CONTINUE */ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opcode = TGSI_OPCODE_CONT; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &cm_shader_tgsi_instruction[opcode]; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->bc->chip_class >= EVERGREEN) { 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &eg_shader_tgsi_instruction[opcode]; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->inst_info = 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &r600_shader_tgsi_instruction[opcode]; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_loop_brk_cont(ctx); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 9: /* FC_BREAK_Z_INT */ 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_break_from_byte_stream(ctx, &alu, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 10: /* FC_BREAK_NZ */ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_break_from_byte_stream(ctx, &alu, 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bytes_read; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx, 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned bytes_read) 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_tex tex; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.inst = bytes[bytes_read++]; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.resource_id = bytes[bytes_read++]; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_gpr = bytes[bytes_read++]; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_rel = bytes[bytes_read++]; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_gpr = bytes[bytes_read++]; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_rel = bytes[bytes_read++]; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_x = bytes[bytes_read++]; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_y = bytes[bytes_read++]; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_z = bytes[bytes_read++]; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_w = bytes[bytes_read++]; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.lod_bias = bytes[bytes_read++]; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_x = bytes[bytes_read++]; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_y = bytes[bytes_read++]; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_z = bytes[bytes_read++]; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_w = bytes[bytes_read++]; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_x = bytes[bytes_read++]; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_y = bytes[bytes_read++]; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_z = bytes[bytes_read++]; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.sampler_id = bytes[bytes_read++]; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = bytes[bytes_read++]; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = bytes[bytes_read++]; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = bytes[bytes_read++]; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = bytes[bytes_read++]; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_tex(ctx->bc, &tex); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bytes_read; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx, 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned bytes_read) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_vtx vtx; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&vtx, 0, sizeof(vtx)); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* WORD0 */ 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* WORD1 */ 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* WORD 2*/ 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r600_bytecode_add_vtx(ctx->bc, &vtx)) { 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "Error adding vtx\n"); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the Texture Cache */ 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bytes_read; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * bytes, unsigned num_bytes) 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bytes_read = 0; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, byte; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (bytes_read < num_bytes) { 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char inst_type = bytes[bytes_read++]; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst_type) { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_alu_from_byte_stream(ctx, bytes, 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_tex_from_byte_stream(ctx, bytes, 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_fc_from_byte_stream(ctx, bytes, 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (byte = 0 ; byte < 4; byte++) { 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->isa[i] |= 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (bytes[bytes_read++] << (byte * 8)); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read = r600_vtx_from_byte_stream(ctx, bytes, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytes_read); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Error here */ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* End bytestream -> r600 shader functions*/ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int j; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->Instruction.NumDstRegs > 1) { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->Instruction.Predicate) { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("predicate unsupported\n"); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->Instruction.Label) { 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("label unsupported\n"); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->Src[j].Register.Dimension) { 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported src %d (dimension %d)\n", j, 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->Src[j].Register.Dimension); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < i->Instruction.NumDstRegs; j++) { 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->Dst[j].Register.Dimension) { 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported dst (dimension)\n"); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int gpr = 0, base_chan = 0; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ij_index = 0; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index = 0; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[input].centroid) 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index++; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index = 0; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we have perspective add one */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->input_perspective) { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index++; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we have perspective centroid */ 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->input_centroid) 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index++; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[input].centroid) 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ij_index++; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* work out gpr and base_chan from index */ 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gpr = ij_index / 2; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base_chan = (2 * (ij_index % 2)) + 1; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; i++) { 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < 4) 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((i > 1) && (i < 6)) { 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->shader->input[input].gpr; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i % 4; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = gpr; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = (base_chan - (i % 2)); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.bank_swizzle_force = SQ_ALU_VEC_210; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((i % 4) == 3) 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->shader->input[input].gpr; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special export handling in shaders 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shader export ARRAY_BASE for EXPORT_POS: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 60 is position 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 61 is misc vector 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 62, 63 are clip distance vectors 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_POINT_SIZE - point size in the X channel of export 61 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exclusive from render target index) 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shader export ARRAY_BASE for EXPORT_PIXEL: 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 0-7 CB targets 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 61 computed Z vector 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The use of the values exported in the computed Z vector are controlled 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * by DB_SHADER_CONTROL: 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Z_EXPORT_ENABLE - Z as a float in RED 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DB_SOURCE_FORMAT - export control restrictions 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_spi_sid(struct r600_shader_io * io) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index, name = io->name; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These params are handled differently, they don't need 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * semantic indices, so we'll use 0 for them. 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (name == TGSI_SEMANTIC_POSITION || 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name == TGSI_SEMANTIC_PSIZE || 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name == TGSI_SEMANTIC_FACE) 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = 0; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (name == TGSI_SEMANTIC_GENERIC) { 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For generic params simply use sid from tgsi */ 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = io->sid; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For non-generic params - pack name and sid into 8 bits */ 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = 0x80 | (name<<3) | (io->sid); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Make sure that all really used indices have nonzero value, so 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we can just compare it to 0 later instead of comparing the name 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with different values to detect special cases. */ 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index++; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return index; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* turn input into interpolate on EG */ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r = 0; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[index].spi_sid) { 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[index].lds_pos = ctx->shader->nlds++; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[index].interpolate > 0) { 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = evergreen_interp_alu(ctx, index); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = evergreen_interp_flat(ctx, index); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back) 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int gpr_front = ctx->shader->input[front].gpr; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int gpr_back = ctx->shader->input[back].gpr; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = gpr_front; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->face_gpr; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = gpr_front; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = gpr_back; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = i; 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (i==3); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_declaration(struct r600_shader_ctx *ctx) 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (d->Declaration.File) { 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = ctx->shader->ninput++; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].name = d->Semantic.Name; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].sid = d->Semantic.Index; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].interpolate = d->Interp.Interpolate; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].centroid = d->Interp.Centroid; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->shader->input[i].name) { 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_FACE: 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->face_gpr = ctx->shader->input[i].gpr; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_COLOR: 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->colors_used++; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_POSITION: 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->fragcoord_input = i; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class >= EVERGREEN) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = evergreen_interp_input(ctx, i))) 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = ctx->shader->noutput++; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].name = d->Semantic.Name; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].sid = d->Semantic.Index; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].interpolate = d->Interp.Interpolate; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->output[i].write_mask = d->Declaration.UsageMask; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->type == TGSI_PROCESSOR_VERTEX) { 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (d->Semantic.Name) { 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPDIST: 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_PSIZE: 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->vs_out_misc_write = 1; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->vs_out_point_size = 1; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPVERTEX: 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->clip_vertex_write = TRUE; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->cv_output = i; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (d->Semantic.Name) { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_COLOR: 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->nr_ps_max_color_exports++; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SAMPLER: 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SYSTEM_VALUE: 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->native_integers) { 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = 0; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = 0; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_get_temp(struct r600_shader_ctx *ctx) 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->temp_reg + ctx->max_driver_temp_used++; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for evergreen we need to scan the shader to find the number of GPRs we need to 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reserve for interpolation. 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we need to know if we are going to emit 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any centroid inputs 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if perspective and linear are required 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_baryc; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_linear = FALSE; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_perspective = FALSE; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_centroid = FALSE; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->num_interp_gpr = 1; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* any centroid inputs */ 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->info.num_inputs; i++) { 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* skip position/face */ 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_linear = TRUE; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_perspective = TRUE; 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->info.input_centroid[i]) 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->input_centroid = TRUE; 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_baryc = 0; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ignoring sample for now */ 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->input_perspective) 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_baryc++; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->input_linear) 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_baryc++; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->input_centroid) 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_baryc *= 2; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->num_interp_gpr += (num_baryc + 1) >> 1; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */ 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->num_interp_gpr; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void tgsi_src(struct r600_shader_ctx *ctx, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register *tgsi_src, 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader_src *r600_src) 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(r600_src, 0, sizeof(*r600_src)); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->neg = tgsi_src->Register.Negate; 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->abs = tgsi_src->Register.Absolute; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = tgsi_src->Register.Index; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->sel = V_SQ_ALU_SRC_LITERAL; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[0] = 3; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[1] = 3; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[2] = 3; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[3] = 3; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->sel = 0; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[0] = 0; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[1] = 0; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[2] = 0; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->swizzle[3] = 0; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->sel = 0; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi_src->Register.Indirect) 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->rel = V_SQ_REL_RELATIVE; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->sel = tgsi_src->Register.Index; 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_vtx vtx; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int ar_reg; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offset) { 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->bc->ar_reg; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].value = offset; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = dst_reg; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ar_reg = dst_reg; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ar_reg = ctx->bc->ar_reg; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&vtx, 0, sizeof(vtx)); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.src_gpr = ar_reg; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.mega_fetch_count = 16; 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_gpr = dst_reg; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_x = 0; /* SEL_X */ 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_y = 1; /* SEL_Y */ 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_z = 2; /* SEL_Z */ 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.dst_sel_w = 3; /* SEL_W */ 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.data_format = FMT_32_32_32_32_FLOAT; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx.endian = r600_endian_swap(32); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, k, nconst, r; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconst++; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->src[i].rel) { 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int treg = r600_get_temp(ctx); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[i].sel = treg; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[i].rel = 0; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j--; 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (j > 0) { 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int treg = r600_get_temp(ctx); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < 4; k++) { 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->src[i].sel; 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = k; 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].rel = ctx->src[i].rel; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = treg; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = k; 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (k == 3) 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[i].sel = treg; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[i].rel =0; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j--; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, k, nliteral, r; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nliteral++; 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int treg = r600_get_temp(ctx); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < 4; k++) { 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->src[i].sel; 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = k; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].value = ctx->src[i].value[k]; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = treg; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = k; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (k == 3) 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[i].sel = treg; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j--; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx) 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r, count = ctx->shader->ninput; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* additional inputs will be allocated right after the existing inputs, 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we won't need them after the color selection, so we don't need to 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reserve these gprs for the rest of the shader code and to adjust 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * output offsets etc. */ 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int gpr = ctx->file_offset[TGSI_FILE_INPUT] + 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->info.file_max[TGSI_FILE_INPUT] + 1; 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->face_gpr == -1) { 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = ctx->shader->ninput++; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].name = TGSI_SEMANTIC_FACE; 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].spi_sid = 0; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[i].gpr = gpr++; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->face_gpr = ctx->shader->input[i].gpr; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) { 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ni = ctx->shader->ninput++; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io)); 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->input[ni].gpr = gpr++; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class >= EVERGREEN) { 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = evergreen_interp_input(ctx, ni); 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = select_twoside_color(ctx, i, ni); 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader *shader = &pipeshader->shader; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_token *tokens = pipeshader->selector->tokens; 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_info so = pipeshader->selector->so; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_immediate *immediate; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_property *property; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_shader_ctx ctx; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_output output[32]; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned output_done, noutput; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opcode; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, k, r = 0; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0; 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Declarations used by llvm code */ 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool use_llvm = false; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char * inst_bytes = NULL; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned inst_byte_count = 0; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef R600_USE_LLVM 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_llvm = debug_get_bool_option("R600_LLVM", TRUE); 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.bc = &shader->bc; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.shader = shader; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.native_integers = true; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family); 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.tokens = tokens; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_scan_shader(tokens, &ctx.info); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_init(&ctx.parse, tokens); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.type = ctx.parse.FullHeader.Processor.Processor; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->processor_type = ctx.type; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.bc->type = shader->processor_type; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.face_gpr = -1; 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.fragcoord_input = -1; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.colors_used = 0; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.clip_vertex_write = 0; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->nr_ps_color_exports = 0; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->nr_ps_max_color_exports = 0; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side; 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* register allocations */ 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Values [0,127] correspond to GPR[0..127]. 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Values [128,159] correspond to constant buffer bank 0 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Values [160,191] correspond to constant buffer bank 1 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Values [256,287] correspond to constant buffer bank 2 (EG) 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Values [288,319] correspond to constant buffer bank 3 (EG) 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Other special values are shown in the list below. 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 248 SQ_ALU_SRC_0: special constant 0.0. 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 249 SQ_ALU_SRC_1: special constant 1.0 float. 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 253 SQ_ALU_SRC_LITERAL: literal constant. 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 254 SQ_ALU_SRC_PV: previous vector result. 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 255 SQ_ALU_SRC_PS: previous scalar result. 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_FILE_COUNT; i++) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[i] = 0; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_INPUT] = 1; 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class >= EVERGREEN) { 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* LLVM backend setup */ 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef R600_USE_LLVM 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_llvm && ctx.info.indirect_files) { 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "Warning: R600 LLVM backend does not support " 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "indirect adressing. Falling back to TGSI " 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "backend.\n"); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_llvm = 0; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_llvm) { 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_llvm_context radeon_llvm_ctx; 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMModuleRef mod; 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dump = 0; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx)); 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT]; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump = 1; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count, 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rctx->family, dump)) { 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(inst_bytes); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_llvm_dispose(&radeon_llvm_ctx); 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_llvm = 0; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "R600 LLVM backend failed to compile " 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "shader. Falling back to TGSI\n"); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_OUTPUT] = 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_INPUT]; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_llvm_dispose(&radeon_llvm_ctx); 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* End of LLVM backend setup */ 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!use_llvm) { 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_OUTPUT] = 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_INPUT] + 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.info.file_max[TGSI_FILE_INPUT] + 1; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Outside the GPR range. This will be translated to one of the 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * kcache banks later. */ 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.temp_reg = ctx.bc->ar_reg + 1; 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.nliterals = 0; 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals = NULL; 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->fs_write_all = FALSE; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_token(&ctx.parse); 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx.parse.FullToken.Token.Type) { 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_IMMEDIATE: 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immediate = &ctx.parse.FullToken.FullImmediate; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx.literals == NULL) { 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -ENOMEM; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.nliterals++; 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_DECLARATION: 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_declaration(&ctx); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_INSTRUCTION: 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_PROPERTY: 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org property = &ctx.parse.FullToken.FullProperty; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (property->Property.PropertyName) { 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (property->u[0].Data == 1) 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->fs_write_all = TRUE; 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (property->u[0].Data == 1) 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->vs_prohibit_ucps = TRUE; 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -EINVAL; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->fs_write_all && rctx->chip_class >= EVERGREEN) 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->nr_ps_max_color_exports = 8; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.fragcoord_input >= 0) { 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class == CAYMAN) { 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 3); 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->two_side && ctx.colors_used) { 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = process_twoside_color_inputs(&ctx))) 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_init(&ctx.parse, tokens); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_token(&ctx.parse); 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx.parse.FullToken.Token.Type) { 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_INSTRUCTION: 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_llvm) { 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_is_supported(&ctx); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.max_driver_temp_used = 0; 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reserve first tmp for everyone */ 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_get_temp(&ctx); 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = tgsi_split_constant(&ctx))) 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = tgsi_split_literal_constant(&ctx))) 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class == CAYMAN) 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx.bc->chip_class >= EVERGREEN) 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = ctx.inst_info->process(&ctx); 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Get instructions if we are using the LLVM backend. */ 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_llvm) { 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count); 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(inst_bytes); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noutput = shader->noutput; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.clip_vertex_write) { 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to convert a clipvertex write into clipdistance writes and not export 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the clip vertex anymore */ 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io)); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->output[noutput].gpr = ctx.temp_reg; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noutput++; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->output[noutput].gpr = ctx.temp_reg+1; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noutput++; 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reset spi_sid for clipvertex output to avoid confusing spi */ 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->output[ctx.cv_output].spi_sid = 0; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->clip_dist_write = 0xFF; 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; i++) { 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int oreg = i >> 2; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ochan = i & 3; 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4); 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = shader->output[ctx.cv_output].gpr; 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = j; 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = 512 + i; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].kc_bank = 1; 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = j; 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx.temp_reg + oreg; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == ochan); 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == 3) 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx.bc, &alu); 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add stream outputs. */ 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < so.num_outputs; i++) { 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_output output; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (so.output[i].output_buffer >= 4) { 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.output[i].output_buffer); 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -EINVAL; 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (so.output[i].dst_offset < so.output[i].start_component) { 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("stream_output - dst_offset cannot be less than start_component\n"); 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -EINVAL; 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&output, 0, sizeof(struct r600_bytecode_output)); 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.gpr = shader->output[so.output[i].register_index].gpr; 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.elem_size = 0; 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.array_base = so.output[i].dst_offset - so.output[i].start_component; 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.burst_count = 1; 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.barrier = 1; 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* array_size is an upper limit for the burst_count 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with MEM_STREAM instructions */ 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.array_size = 0xFFF; 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component; 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class >= EVERGREEN) { 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (so.output[i].output_buffer) { 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (so.output[i].output_buffer) { 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_output(ctx.bc, &output); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* export output */ 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, j = 0; i < noutput; i++, j++) { 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].gpr = shader->output[i].gpr; 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].elem_size = 3; 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 0; 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 1; 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = 2; 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = 3; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].burst_count = 1; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].barrier = 1; 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = -1; 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx.type) { 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROCESSOR_VERTEX: 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (shader->output[i].name) { 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_POSITION: 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_pos_base++; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_PSIZE: 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_pos_base++; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPVERTEX: 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j--; 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPDIST: 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_pos_base++; 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* spi_sid is 0 for clipdistance outputs that were generated 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for clipvertex - we don't need to pass them to PS */ 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->output[i].spi_sid) { 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j++; 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* duplicate it as PARAM to pass to the pixel shader */ 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output)); 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_param_base++; 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_FOG: 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 4; /* 0 */ 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = 4; /* 0 */ 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = 5; /* 1 */ 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROCESSOR_FRAGMENT: 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* never export more colors than the number of CBs */ 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) { 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* skip export */ 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j--; 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_pixel_base++; 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->nr_ps_color_exports++; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 1; k < rctx->nr_cbufs; k++) { 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j++; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].gpr = shader->output[i].gpr; 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].elem_size = 3; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 0; 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 1; 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = 2; 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].burst_count = 1; 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].barrier = 1; 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_pixel_base++; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->nr_ps_color_exports++; 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = 61; 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 2; 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 7; 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = output[j].swizzle_w = 7; 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = 61; 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 7; 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 1; 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = output[j].swizzle_w = 7; 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -EINVAL; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("unsupported processor type %d\n", ctx.type); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -EINVAL; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (output[j].type==-1) { 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = next_param_base++; 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add fake param output for vertex shader if no param is exported */ 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) { 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].gpr = 0; 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].elem_size = 3; 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 7; 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 7; 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = 7; 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = 7; 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].burst_count = 1; 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].barrier = 1; 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = 0; 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j++; 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add fake pixel export */ 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) { 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].gpr = 0; 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].elem_size = 3; 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_x = 7; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_y = 7; 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_z = 7; 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].swizzle_w = 7; 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].burst_count = 1; 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].barrier = 1; 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].array_base = 0; 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j++; 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noutput = j; 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set export done on last export of each type */ 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = noutput - 1, output_done = 0; i >= 0; i--) { 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class < CAYMAN) { 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == (noutput - 1)) { 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[i].end_of_program = 1; 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(output_done & (1 << output[i].type))) { 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output_done |= (1 << output[i].type); 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add output to bytecode */ 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < noutput; i++) { 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_output(ctx.bc, &output[i]); 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add program end */ 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->chip_class == CAYMAN) 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cm_bytecode_add_cf_end(ctx.bc); 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check GPR limit - we have 124 = 128 - 4 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (4 are reserved as alu clause temporary registers) */ 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx.bc->ngpr > 124) { 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr); 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = -ENOMEM; 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out_err; 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(ctx.literals); 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_free(&ctx.parse); 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout_err: 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(ctx.literals); 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_free(&ctx.parse); 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("%s tgsi opcode unsupported\n", 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_end(struct r600_shader_ctx *ctx) 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct r600_shader_src *shader_src, 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan) 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->sel = shader_src->sel; 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->chan = shader_src->swizzle[chan]; 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->neg = shader_src->neg; 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->abs = shader_src->abs; 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->rel = shader_src->rel; 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->value = shader_src->value[bc_src->chan]; 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->abs = 1; 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->neg = 0; 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bc_src->neg = !bc_src->neg; 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void tgsi_dst(struct r600_shader_ctx *ctx, 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_dst_register *tgsi_dst, 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle, 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu_dst *r600_dst) 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->sel = tgsi_dst->Register.Index; 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->chan = swizzle; 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->write = 1; 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi_dst->Register.Indirect) 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->rel = V_SQ_REL_RELATIVE; 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Instruction.Saturate) { 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_dst->clamp = 1; 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_last_instruction(unsigned writemask) 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, lasti = 0; 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writemask & (1 << i)) { 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lasti = i; 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lasti; 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, r; 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!swap) { 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* handle some special cases */ 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->inst_info->tgsi_opcode) { 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SUB: 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_toggle_neg(&alu.src[1]); 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ABS: 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti || trans_only) { 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2(struct r600_shader_ctx *ctx) 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_op2_s(ctx, 0, 0); 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_op2_s(ctx, 1, 0); 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_op2_s(ctx, 0, 1); 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, r; 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < last_slot; i++) { 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RSQ should take the absolute value of src */ 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_RSQ) { 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[j]); 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_slot - 1) 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx) 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, k, r; 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < last_slot; k++) { 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << k))) 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < 4; i++) { 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], k); 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (i == k); 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * r600 - trunc to -PI..PI range 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * r700 - normalize by dividing by 2PI 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * see fdo bug 27901 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static float half_inv_pi = 1.0 /(3.1415926535 * 2); 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static float double_pi = 3.1415926535 * 2; 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static float neg_pi = -3.1415926535; 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].value = *(uint32_t *)&half_inv_pi; 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == R600) { 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].value = *(uint32_t *)&double_pi; 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].value = *(uint32_t *)&neg_pi; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1; 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].neg = 1; 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_trig(struct r600_shader_ctx *ctx) 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_setup_trig(ctx); 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < last_slot; i++) { 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_slot - 1) 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_trig(struct r600_shader_ctx *ctx) 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_setup_trig(ctx); 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replicate result */ 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_scs(struct r600_shader_ctx *ctx) 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We'll only need the trig stuff if we are going to write to the 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X or Y components of the destination vector. 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_setup_trig(ctx); 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.x = COS */ 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < 3; i++) { 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0) 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 0; 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.y = SIN */ 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < 3; i++) { 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 1) 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 0; 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.z = 0.0; */ 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.w = 1.0; */ 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_kill(struct r600_shader_ctx *ctx) 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1; 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].neg = 1; 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) { 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* kill must be last in ALU */ 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->force_add_cf = 1; 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->shader->uses_kill = TRUE; 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_lit(struct r600_shader_ctx *ctx) 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp.x = max(src.y, 0.0) */ 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & (1 << 2)) 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int chan; 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int sel; 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp.z = log(tmp.x) */ 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) { 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 0; 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp.z = log(tmp.x) */ 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan = alu.dst.chan; 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sel = alu.dst.sel; 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = sel; 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = chan; 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.z = exp(tmp.x) */ 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) { 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 0; 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.z = exp(tmp.x) */ 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.x, <- 1.0 */ 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.y = max(src.x, 0.0) */ 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.w, <- 1.0 */ 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For state trackers other than OpenGL, we'll want to use 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _RECIPSQRT_IEEE instead. 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[i]); 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replicate result */ 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_tempx_replicate(ctx); 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replicate result */ 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_tempx_replicate(ctx); 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int cayman_pow(struct r600_shader_ctx *ctx) 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* b * LOG2(a) */ 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = ctx->temp_reg; 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < last_slot; i++) { 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* POW(a,b) = EXP2(b * LOG2(a))*/ 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_slot - 1) 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_pow(struct r600_shader_ctx *ctx) 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* LOG2(a) */ 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* b * LOG2(a) */ 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = ctx->temp_reg; 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* POW(a,b) = EXP2(b * LOG2(a))*/ 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_tempx_replicate(ctx); 2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op) 2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r, j; 2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned write_mask = inst->Dst[0].Register.WriteMask; 2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp0 = ctx->temp_reg; 2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp1 = r600_get_temp(ctx); 2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp2 = r600_get_temp(ctx); 2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tmp3 = r600_get_temp(ctx); 2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unsigned path: 2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we need to represent src1 as src2*q + r, where q - quotient, r - remainder 2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1. tmp0.x = rcp (src2) = 2^32/src2 + e, where e is rounding error 2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2. tmp0.z = lo (tmp0.x * src2) 2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3. tmp0.w = -tmp0.z 2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4. tmp0.y = hi (tmp0.x * src2) 2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src2)) 2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error 2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7. tmp1.x = tmp0.x - tmp0.w 2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8. tmp1.y = tmp0.x + tmp0.w 2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) 2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 10. tmp0.z = hi(tmp0.x * src1) = q 2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11. tmp0.y = lo (tmp0.z * src2) = src2*q = src1 - r 2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12. tmp0.w = src1 - tmp0.y = r 2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13. tmp1.x = tmp0.w >= src2 = r >= src2 (uint comparison) 2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14. tmp1.y = src1 >= tmp0.y = r >= 0 (uint comparison) 2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if DIV 2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15. tmp1.z = tmp0.z + 1 = q + 1 2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16. tmp1.w = tmp0.z - 1 = q - 1 2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else MOD 2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15. tmp1.z = tmp0.w - src2 = r - src2 2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16. tmp1.w = tmp0.w + src2 = r + src2 2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * endif 2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17. tmp1.x = tmp1.x & tmp1.y 2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z 2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z 2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z 2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 20. dst = src2==0 ? MAX_UINT : tmp0.z 2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Signed path: 2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Same as unsigned, using abs values of the operands, 2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and fixing the sign of the result in the end. 2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp2.x = -src0 */ 2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp2; 2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp2.y = -src1 */ 2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp2; 2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp2.z sign bit is set if src0 and src2 signs are different */ 2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* it will be a sign of the quotient */ 2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mod) { 2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT); 2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp2; 2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp2.x = |src0| */ 2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp2; 2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp2; 2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp2.y = |src1| */ 2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp2; 2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp2; 2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 1; 2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1. tmp0.x = rcp_u (src2) = 2^32/src2 + e, where e is rounding error */ 2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp3.x = u2f(src2) */ 2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT); 2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp3; 2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp0.x = recip(tmp3.x) */ 2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 3; j++) { 2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 0); 2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp3; 2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == 2) 2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].value = 0x4f800000; 2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp3; 2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT); 2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp3; 2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT); 2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 2. tmp0.z = lo (tmp0.x * src2) */ 2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 2); 2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (j == 3); 2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3. tmp0.w = -tmp0.z */ 2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 4. tmp0.y = hi (tmp0.x * src2) */ 2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 1); 2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (j == 3); 2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src)) */ 2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 3; 2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp0; 2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 2; 2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error */ 2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 3); 2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (j == 3); 2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 7. tmp1.x = tmp0.x - tmp0.w */ 2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 3; 2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 8. tmp1.y = tmp0.x + tmp0.w */ 2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 3; 2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */ 2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp1; 2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp1; 2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 10. tmp0.z = hi(tmp0.x * src1) = q */ 3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 2); 3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (j == 3); 3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 11. tmp0.y = lo (src2 * tmp0.z) = src2*q = src1 - r */ 3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0 ; j < 4; j++) { 3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (j == 1); 3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = (j == 3); 3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 12. tmp0.w = src1 - tmp0.y = r */ 3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 13. tmp1.x = tmp0.w >= src2 = r >= src2 */ 3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 14. tmp1.y = src1 >= tmp0.y = r >= 0 */ 3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mod) { /* UMOD */ 3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 15. tmp1.z = tmp0.w - src2 = r - src2 */ 3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 16. tmp1.w = tmp0.w + src2 = r + src2 */ 3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 3; 3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp2; 3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { /* UDIV */ 3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 15. tmp1.z = tmp0.z + 1 = q + 1 DIV */ 3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 16. tmp1.w = tmp0.z - 1 = q - 1 */ 3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp0; 3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT; 3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 17. tmp1.x = tmp1.x & tmp1.y */ 3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT); 3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp1; 3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp1; 3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp1; 3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z DIV */ 3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z MOD */ 3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp1; 3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = mod ? 3 : 2; 3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp1; 3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 2; 3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */ 3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp1; 3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp1; 3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 3; 3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp0; 3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 2; 3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (signed_op) { 3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fix the sign of the result */ 3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mod) { 3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp0.x = -tmp0.z */ 3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sign of the remainder is the same as the sign of src0 */ 3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */ 3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp0; 3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp0.x = -tmp0.z */ 3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tmp0; 3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fix the quotient sign (same as the sign of src0*src1) */ 3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */ 3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = tmp2; 3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = tmp0; 3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = tmp0; 3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_udiv(struct r600_shader_ctx *ctx) 3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_divmod(ctx, 0, 0); 3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_umod(struct r600_shader_ctx *ctx) 3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_divmod(ctx, 1, 0); 3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_idiv(struct r600_shader_ctx *ctx) 3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_divmod(ctx, 0, 1); 3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_imod(struct r600_shader_ctx *ctx) 3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_divmod(ctx, 1, 1); 3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned write_mask = inst->Dst[0].Register.WriteMask; 3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_inst = tgsi_last_instruction(write_mask); 3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst) 3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT) 3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned write_mask = inst->Dst[0].Register.WriteMask; 3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_inst = tgsi_last_instruction(write_mask); 3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp = -src */ 3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst) 3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst = (src >= 0 ? src : tmp) */ 3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = ctx->temp_reg; 3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst) 3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_issg(struct r600_shader_ctx *ctx) 3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned write_mask = inst->Dst[0].Register.WriteMask; 3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int last_inst = tgsi_last_instruction(write_mask); 3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp = (src >= 0 ? src : -1) */ 3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT; 3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst) 3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst = (tmp > 0 ? 1 : tmp) */ 3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(write_mask & (1<<i))) 3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT); 3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = ctx->temp_reg; 3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == last_inst) 3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_ssg(struct r600_shader_ctx *ctx) 3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp = (src > 0 ? 1 : src) */ 3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1; 3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst = (-tmp > 0 ? -1 : tmp) */ 3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].neg = 1; 3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1; 3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].neg = 1; 3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = ctx->temp_reg; 3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) { 3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_op3(struct r600_shader_ctx *ctx) 3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, r; 3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_dp(struct r600_shader_ctx *ctx) 3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, r; 3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = ctx->inst_info->r600_opcode; 3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* handle some special cases */ 3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->inst_info->tgsi_opcode) { 3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP2: 3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i > 1) { 3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = alu.src[1].chan = 0; 3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP3: 3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i > 2) { 3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = alu.src[1].chan = 0; 3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DPH: 3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) { 3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].neg = 0; 3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) { 3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index) 3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Src[index].Register.File != TGSI_FILE_INPUT && 3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Src[index].Register.File != TGSI_FILE_OUTPUT) || 3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->src[index].neg || ctx->src[index].abs; 3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index) 3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_tex(struct r600_shader_ctx *ctx) 3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static float one_point_five = 1.5f; 3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_tex tex; 3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_gpr; 3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r, i, j; 3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int opcode; 3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Texture fetch instructions can only use gprs as source. 3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also they cannot negate the source or take the absolute value */ 3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ && 3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_tex_src_requires_loading(ctx, 0); 3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean src_loaded = FALSE; 3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1; 3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t offset_x = 0, offset_y = 0, offset_z = 0; 3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get offset values */ 3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.NumOffsets) { 3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(inst->Texture.NumOffsets == 1); 3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TGSI moves the sampler to src reg 3 for TXD */ 3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_src_reg = 3; 3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1; i < 3; i++) { 3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set gradients h/v */ 3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SQ_TEX_INST_SET_GRADIENTS_V; 3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi_tex_src_requires_loading(ctx, i)) { 3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_gpr = r600_get_temp(ctx); 3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = 0; 3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = 1; 3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = 2; 3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = 3; 3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = tex.src_gpr; 3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = j; 3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == 3) 3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = ctx->src[i].swizzle[0]; 3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = ctx->src[i].swizzle[1]; 3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = ctx->src[i].swizzle[2]; 3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = ctx->src[i].swizzle[3]; 3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_rel = ctx->src[i].rel; 3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_x = 1; 3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_y = 1; 3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_z = 1; 3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_w = 1; 3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_tex(ctx->bc, &tex); 3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int out_chan; 3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add perspective divide */ 3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out_chan = 2; 3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (out_chan == i) 3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out_chan = 3; 3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = out_chan; 3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = out_chan; 3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_loaded = TRUE; 3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_gpr = ctx->temp_reg; 3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE || 3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) && 3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Instruction.Opcode != TGSI_OPCODE_TXQ && 3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) { 3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tmp1.z = RCP_e(|tmp1.z|) */ 3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].abs = 1; 3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 2; 3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].abs = 1; 3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * muladd has no writemask, have to use another temp 3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = ctx->temp_reg; 3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].value = *(uint32_t *)&one_point_five; 3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = ctx->temp_reg; 3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 2; 3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = 0; 3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].value = *(uint32_t *)&one_point_five; 3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* write initial W value into Z component */ 4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for cube forms of lod and bias we need to route the lod 4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value into Z */ 4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Instruction.Opcode == TGSI_OPCODE_TXB || 4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Instruction.Opcode == TGSI_OPCODE_TXL) { 4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_loaded = TRUE; 4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_gpr = ctx->temp_reg; 4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src_requires_loading && !src_loaded) { 4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_loaded = TRUE; 4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_gpr = ctx->temp_reg; 4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = ctx->inst_info->r600_opcode; 4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || 4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (opcode) { 4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SQ_TEX_INST_SAMPLE: 4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = SQ_TEX_INST_SAMPLE_C; 4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SQ_TEX_INST_SAMPLE_L: 4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = SQ_TEX_INST_SAMPLE_C_L; 4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SQ_TEX_INST_SAMPLE_LB: 4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = SQ_TEX_INST_SAMPLE_C_LB; 4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SQ_TEX_INST_SAMPLE_G: 4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = SQ_TEX_INST_SAMPLE_C_G; 4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 4078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.inst = opcode; 4079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 4081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 4082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_gpr = src_gpr; 4083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 4084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 4085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 4086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 4087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 4088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) { 4090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = 4; 4091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = 4; 4092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = 4; 4093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = 4; 4094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (src_loaded) { 4095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = 0; 4096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = 1; 4097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = 2; 4098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = 3; 4099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = ctx->src[0].swizzle[0]; 4101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = ctx->src[0].swizzle[1]; 4102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = ctx->src[0].swizzle[2]; 4103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = ctx->src[0].swizzle[3]; 4104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_rel = ctx->src[0].rel; 4105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture == TGSI_TEXTURE_CUBE || 4108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 4109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_x = 1; 4110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_y = 0; 4111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = 3; 4112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = 2; /* route Z compare or Lod value into W */ 4113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 4116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 4117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_x = 1; 4118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_y = 1; 4119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_z = 1; 4121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_w = 1; 4122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_x = offset_x; 4124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_y = offset_y; 4125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.offset_z = offset_z; 4126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Put the depth for comparison in W. 4128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 4129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Some instructions expect the depth in Z. */ 4130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 4132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 4133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 4134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode != SQ_TEX_INST_SAMPLE_C_L && 4135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode != SQ_TEX_INST_SAMPLE_C_LB) { 4136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_w = tex.src_sel_z; 4137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 4140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 4141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opcode == SQ_TEX_INST_SAMPLE_C_L || 4142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == SQ_TEX_INST_SAMPLE_C_LB) { 4143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the array index is read from Y */ 4144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_y = 0; 4145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the array index is read from Z */ 4147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_z = 0; 4148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.src_sel_z = tex.src_sel_y; 4149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 4151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 4152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the array index is read from Z */ 4153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex.coord_type_z = 0; 4154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_tex(ctx->bc, &tex); 4156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add shadow ambient support - gallium doesn't do it yet */ 4160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_lrp(struct r600_shader_ctx *ctx) 4164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 4169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* optimize if it's just an equal balance */ 4172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 4173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 4174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 4176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 4179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 4180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.omod = 3; 4182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 4185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1 - src0 */ 4195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 4196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 4198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 4201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 4202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 4204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_toggle_neg(&alu.src[1]); 4205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 4208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* (1 - src0) * src2 */ 4217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 4218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 4220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 4225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 4229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src0 * src1 + (1 - src0) * src2 */ 4238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 4239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 4241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 4244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 4245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 4247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = ctx->temp_reg; 4248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 4249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 4253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_cmp(struct r600_shader_ctx *ctx) 4263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 4267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 4270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 4272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 4275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 4278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 4282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) 4283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_xpd(struct r600_shader_ctx *ctx) 4292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const unsigned int src0_swizzle[] = {2, 0, 1}; 4295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const unsigned int src1_swizzle[] = {1, 2, 0}; 4296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t use_temp = 0; 4298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r; 4299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask != 0xf) 4301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_temp = 1; 4302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 4304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < 3) { 4307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 4308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 4309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 4311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 4312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; 4313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = i; 4314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 4321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 4328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 4330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i < 3) { 4332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 4333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 4334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_0; 4336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 4337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; 4338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = i; 4339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].sel = ctx->temp_reg; 4342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].neg = 1; 4343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[2].chan = i; 4344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_temp) 4346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 4348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.is_op3 = 1; 4352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 4353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_temp) 4359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_copy(ctx, inst); 4360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_exp(struct r600_shader_ctx *ctx) 4364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 4369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.x = 2^floor(src); */ 4371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & 1) { 4372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 4379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = i == 0; 4394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = i == 2; 4395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 4406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.y = tmp - floor(tmp); */ 4415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 4416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 4419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 4423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 4427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.z = RoughApprox2ToX(tmp);*/ 4438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 4439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) { 4448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 4464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.w = 1.0;*/ 4474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 4475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 4479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 4483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_copy(ctx, inst); 4490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_log(struct r600_shader_ctx *ctx) 4493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 4498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.x = floor(log2(|src|)); */ 4500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Dst[0].Register.WriteMask & 1) { 4501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0) 4512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 4529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 4542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 4551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 4552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 1) 4564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 4594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 4610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 1) 4614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 4625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 4627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 4642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 4644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 1) 4648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 4659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 4660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 1; 4661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = ctx->temp_reg; 4680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 1; 4681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 1; 4684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.z = log2(|src|);*/ 4693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 4694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->chip_class == CAYMAN) { 4695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 4696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 4706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 2) 4707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 4717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src_set_abs(&alu.src[0]); 4719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 2; 4723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result.w = 1.0; */ 4732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 4733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 4737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = 0; 4738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 3; 4741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_helper_copy(ctx, inst); 4750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 4753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst->Instruction.Opcode) { 4761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ARL: 4762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 4763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ARR: 4765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 4766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UARL: 4768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 4769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 4772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 4773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->bc->ar_reg; 4778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->ar_loaded = 0; 4784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 4787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst->Instruction.Opcode) { 4793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ARL: 4794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 4795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 4796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->bc->ar_reg; 4798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 4805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 4806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->bc->ar_reg; 4807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->bc->ar_reg; 4808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ARR: 4815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 4816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 4817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->bc->ar_reg; 4819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UARL: 4826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(alu)); 4827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 4828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->bc->ar_reg; 4830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 4838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 4839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->ar_loaded = 0; 4842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_opdst(struct r600_shader_ctx *ctx) 4846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, r = 0; 4850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 4852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0 || i == 3) { 4858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = V_SQ_ALU_SRC_1; 4859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0 || i == 2) { 4864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_1; 4865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 4867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 3) 4869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 4871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 4878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 4880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; 4881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = opcode; 4884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.execute_mask = 1; 4885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.update_pred = 1; 4886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 4888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 4889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = 0; 4890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].sel = V_SQ_ALU_SRC_0; 4893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[1].chan = 0; 4894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 4896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 4898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 4899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 4900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int pops(struct r600_shader_ctx *ctx, int pops) 4904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned force_pop = ctx->bc->force_add_cf; 4906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!force_pop) { 4908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int alu_pop = 3; 4909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->cf_last) { 4910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 4911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu_pop = 0; 4912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 4913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu_pop = 1; 4914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu_pop += pops; 4916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alu_pop == 1) { 4917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 4918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->force_add_cf = 1; 4919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (alu_pop == 2) { 4920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 4921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->force_add_cf = 1; 4922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 4923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org force_pop = 1; 4924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (force_pop) { 4928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 4929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->pop_count = pops; 4930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 4931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 4934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 4937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(reason) { 4939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_VPM: 4940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current--; 4941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_WQM: 4943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_LOOP: 4944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 4945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_REP: 4947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TOODO : for 16 vp asic should -= 2; */ 4948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current --; 4949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 4954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (check_max_only) { 4956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int diff; 4957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (reason) { 4958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_VPM: 4959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org diff = 1; 4960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_WQM: 4962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org diff = 4; 4963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 4966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org diff = 0; 4967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 4969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].max) { 4970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].max = 4971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current + diff; 4972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (reason) { 4976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_VPM: 4977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current++; 4978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_PUSH_WQM: 4980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_LOOP: 4981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current += 4; 4982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FC_REP: 4984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current++; 4985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 4989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].max) { 4990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].max = 4991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->callstack[ctx->bc->call_sp].current; 4992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 4996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 4998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 5000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 5001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->mid[sp->num_mid] = ctx->bc->cf_last; 5002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->num_mid++; 5003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 5006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_sp++; 5008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 5009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 5010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fc_poplevel(struct r600_shader_ctx *ctx) 5013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 5015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sp->mid) { 5016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(sp->mid); 5017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->mid = NULL; 5018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->num_mid = 0; 5020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->start = NULL; 5021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sp->type = 0; 5022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_sp--; 5023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 5026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_return(struct r600_shader_ctx *ctx) 5027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 5029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 5033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 5036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->pop_count = pops; 5037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX work out offset */ 5038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 5042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_testflag(struct r600_shader_ctx *ctx) 5047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 5052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_testflag(ctx); 5054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_jump_to_offset(ctx, 1, 4); 5055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 5056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pops(ctx, ifidx + 1); 5057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_return(ctx); 5058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 5061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_testflag(ctx); 5063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 5065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->pop_count = 1; 5066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_set_mid(ctx, fc_sp); 5068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pops(ctx, 1); 5070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 5072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_if(struct r600_shader_ctx *ctx) 5074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 5076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 5078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_pushlevel(ctx, FC_IF); 5080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_check_depth(ctx, FC_PUSH_VPM, 0); 5082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_else(struct r600_shader_ctx *ctx) 5086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 5088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->pop_count = 1; 5089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_set_mid(ctx, ctx->bc->fc_sp); 5091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 5092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endif(struct r600_shader_ctx *ctx) 5096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pops(ctx, 1); 5098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 5099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("if/endif unbalanced in shader\n"); 5100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 5101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 5104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 5105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 5106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 5107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 5108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_poplevel(ctx); 5110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_decrease_current(ctx, FC_PUSH_VPM); 5112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 5116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* LOOP_START_DX10 ignores the LOOP_CONFIG* registers, so it is not 5118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * limited to 4096 iterations, like the other LOOP_* instructions. */ 5119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10)); 5120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_pushlevel(ctx, FC_LOOP); 5122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check stack depth */ 5124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_check_depth(ctx, FC_LOOP, 0); 5125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_endloop(struct r600_shader_ctx *ctx) 5129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 5131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 5133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 5135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("loop/endloop in shader code are not paired.\n"); 5136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 5137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fixup loop pointers - from r600isa 5140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOOP END points to CF after LOOP START, 5141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LOOP START point to CF after LOOP END 5142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRK/CONT point to LOOP END CF 5143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 5145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 5147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 5149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 5150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX add LOOPRET support */ 5152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_poplevel(ctx); 5153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_decrease_current(ctx, FC_LOOP); 5154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 5158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int fscp; 5160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 5162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 5163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 5164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 5165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fscp == 0) { 5168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R600_ERR("Break not inside loop/endloop pair\n"); 5169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -EINVAL; 5170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 5173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fc_set_mid(ctx, fscp); 5175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org callstack_check_depth(ctx, FC_PUSH_VPM, 1); 5177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int tgsi_umad(struct r600_shader_ctx *ctx) 5181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 5182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r600_bytecode_alu alu; 5184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, r; 5185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 5186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src0 * src1 */ 5188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 5189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 5191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.chan = i; 5195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.sel = ctx->temp_reg; 5196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.dst.write = 1; 5197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 5199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 2; j++) { 5200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 5201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 5204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 5205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 5206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 5207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < lasti + 1; i++) { 5211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 5213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 5216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].sel = ctx->temp_reg; 5220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.src[0].chan = i; 5221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 5223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == lasti) { 5224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alu.last = 1; 5225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = r600_bytecode_add_alu(ctx->bc, &alu); 5227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r) 5228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return r; 5229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 5230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 5231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 5232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 5234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: 5239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For state trackers other than OpenGL, we'll want to use 5240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _RECIP_IEEE instead. 5241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 5243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 5245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 5270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 5271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 5272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 5273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 5280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 5281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 5282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 5291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 5292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 5293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 5309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 5310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 5316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 5331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans}, 5333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 5337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 5341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 5369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans}, 5375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans}, 5377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 5379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 5383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans}, 5388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 5390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 5407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 5412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 5414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 5415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 5418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 5419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 5444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 5445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 5446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 5447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 5454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 5455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 5456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 5465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 5466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 5467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 5479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 5483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 5484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 5490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 5505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 5507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 5511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 5515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 5543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 5551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 5553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 5557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 5562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 5564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 5581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 5586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 5587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 5588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 5589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 5592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 5593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 5618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 5619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 5620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 5621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 5628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 5629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 5630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 5639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 5640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 5641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 5653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 5657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 5658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 5664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2}, 5678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 5679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 5681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 5685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 5689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gap */ 5715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 5717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 5725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 5726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 5727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 5731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr}, 5733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 5736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 5738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 5755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 5760