r600_shader.c revision 6b44470bb2103d5a9c3cf5f2fb4490566971476c
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h" 24f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák#include "tgsi/tgsi_info.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 28de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 299c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 32077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h" 33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h> 38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano 397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes 407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here. 417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots. 437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT 447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four 457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is 467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels. 477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT 487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and 497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots. 507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64 517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64 527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64 537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS 547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the 557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be 567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well. 577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x 587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/ 597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 60a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 611235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 64843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano uint32_t *ptr; 65843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano int i; 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák shader->bo = (struct r600_resource*) 706101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4); 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 746101b6d442b06a347c001fe85848d636ab7df260Marek Olšák ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->buf, rctx->ctx.cs, PIPE_TRANSFER_WRITE); 75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet if (R600_BIG_ENDIAN) { 76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet for (i = 0; i < rshader->bc.ndw; ++i) { 77d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet ptr[i] = bswap_32(rshader->bc.bytecode[i]); 78d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } 79d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } else { 80d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr)); 81843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 826101b6d442b06a347c001fe85848d636ab7df260Marek Olšák rctx->ws->buffer_unmap(shader->bo->buf); 831235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 841235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 851235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 861235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 874f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 881235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 891235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 901235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 911235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 921235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 931235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 944f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 951235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 961235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 971235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse 106eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader); 1073b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet 108eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 110052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse 114c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* Would like some magic "get_bool_option_once" routine. 115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse */ 116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (dump_shaders == -1) 117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 118052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin tgsi_dump(shader->tokens, 0); 122543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (shader->so.num_outputs) { 124543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák unsigned i; 125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák fprintf(stderr, "STREAMOUT\n"); 126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < shader->so.num_outputs; i++) { 1272449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák unsigned mask = ((1 << shader->so.output[i].num_components) - 1) << 1282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák shader->so.output[i].start_component; 129543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák fprintf(stderr, " %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i, 130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák shader->so.output[i].output_buffer, shader->so.output[i].register_index, 1312449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák mask & 1 ? "x" : "_", 1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 1) & 1 ? "y" : "_", 1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 2) & 1 ? "z" : "_", 1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 3) & 1 ? "w" : "_"); 135543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 138eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin r = r600_shader_from_tgsi(rctx, shader); 1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_build(&shader->shader.bc); 1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 148052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 1494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_dump(&shader->shader.bc); 150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 152afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse 15569251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 156ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 1576101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL); 1584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_clear(&shader->shader.bc); 159eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 160eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin memset(&shader->shader,0,sizeof(struct r600_shader)); 161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 1854a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode *bc; 1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 18740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy struct r600_shader_src src[4]; 188cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 189cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 190e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 1962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 20642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 220c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 2288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 2298260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 23547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 23647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 243fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 24450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 24550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 2464a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 247fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 2667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 27050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 2724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 280fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 285fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 286fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 29050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 2944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 2997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 3007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0; 31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 3277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3280a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 3290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 3605b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* FIXME: two-side rendering is broken in r600g, this will 3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * keep old functionality */ 3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_BCOLOR) 3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name = TGSI_SEMANTIC_COLOR; 3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 3935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 3965b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 3975b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 39972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 40296bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 40372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 4095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 41035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4118a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 412024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 41389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) { 41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 4155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (ctx->shader->input[i].spi_sid) { 41621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 41921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } else { 42021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie evergreen_interp_flat(ctx, i); 421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 42350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 4295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 430024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 43135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 43533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 43647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 43896bbc627f369c0100b950f81531b1fe9ef586c34Christian König 439c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 440c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 4414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44396bbc627f369c0100b950f81531b1fe9ef586c34Christian König 444c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 445c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 446c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 44796bbc627f369c0100b950f81531b1fe9ef586c34Christian König 44896bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 44996bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 45096bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 45296bbc627f369c0100b950f81531b1fe9ef586c34Christian König 4534a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 454c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 455c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 45639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 45739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie break; 458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 46372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 46472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 465be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 466be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 467be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 468be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 469be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 502fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 503fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 504fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 505fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 506fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 507fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 510fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 511fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 512fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 513fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 514fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 515fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 516fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 5171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 5181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 5191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 5201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 5211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 5221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 5231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 5241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 5251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 5261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 5271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 52896bbc627f369c0100b950f81531b1fe9ef586c34Christian König 5291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 5301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 5311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 5321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 5331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 5341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 5351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 5364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 5371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 5381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 5391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 5401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 5411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 5421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 54396bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 54439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 54539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 3; 54639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 3; 54739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 3; 54839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 3; 54939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 55039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 55139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 0; 55239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 0; 55339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 0; 55439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 0; 55539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 55639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } 557c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 5581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 5591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 5601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 5611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 5621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 5631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 5641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 565077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 566077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 5674a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 568077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 569077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 570077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 571077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 5724a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 573077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 574077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 575077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 576077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 578077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 579077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 580077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 581077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 582077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 583077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 584077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 585077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5864a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 587077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 588077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 589077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 590077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 5918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 592077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 593077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 594077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 595077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 596077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 597077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 598077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 599077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 600077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 601077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 602077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 603077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 604077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 605077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 606077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 607d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 608077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 6094a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 610077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 611077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 612077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 613077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 614077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 6157687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 6167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 6177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6184a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 6197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 6207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 6247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 6267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 629077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 634077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 638077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 6417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 6487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 6497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 6507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 6517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 6527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 6534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 6547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 6557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 6567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 6587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 6597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 6607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 6637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 6647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 6667687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6694a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 6707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 6867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 6877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 6887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 6897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 6907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 6914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 6927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 6937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 6947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 6967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 6977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 702eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader) 70372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 704eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 705eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct tgsi_token *tokens = pipeshader->tokens; 706543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct pipe_stream_output_info so = pipeshader->so; 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 7085555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 7104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 711457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 713feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher int i, j, r = 0, pos0; 71472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 7174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_init(ctx.bc, rctx->chip_class); 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 723f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 725eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) || 726eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin ((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color)); 727eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 728feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 729feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 731076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 732076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 733076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 734f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 735f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 736f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 738076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 739076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 740076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 741076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 75689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 7574a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 758f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 7594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 760f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 76289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 763fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 76484457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 7664d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_INPUT] + 1; 767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 7684d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 769d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 77097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 77197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 77297e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 773d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 7747728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 7758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 7764d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 7778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 779cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 780cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 7815555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 787cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 788cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 789cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 790cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 791cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 792cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 793cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 794cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 795cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 796cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 807be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 808be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 809be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 8101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 8117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 8127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 8137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 8147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 8157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 81689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 8177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 81889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 81950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 82050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 82150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 826876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 8275555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 8285555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 8295555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 8305555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 8315555cd776b970bce020be59193054474a2a63317Dave Airlie } 832876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 839eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 840457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 841eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 842eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* clamp color outputs */ 843eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->clamp_color) { 844eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (i = 0; i < noutput; i++) { 845eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->output[i].name == TGSI_SEMANTIC_COLOR || 846eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->output[i].name == TGSI_SEMANTIC_BCOLOR) { 847eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 848eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin int j; 849eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (j = 0; j < 4; j++) { 8504a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 8514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 852eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 853eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* MOV_SAT R, R */ 854eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 855eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.sel = shader->output[i].gpr; 856eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.chan = j; 857eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.write = 1; 858eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.clamp = 1; 859eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].sel = alu.dst.sel; 860eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].chan = j; 861eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 862eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (j == 3) { 863eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.last = 1; 864eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 8654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx.bc, &alu); 866eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (r) 867eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin return r; 868eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 869eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 870eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 871eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 872eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 873543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák /* Add stream outputs. */ 874543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 875543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < so.num_outputs; i++) { 876543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct r600_bytecode_output output; 877543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 878543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (so.output[i].output_buffer >= 4) { 879543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 880543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák so.output[i].output_buffer); 881543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = -EINVAL; 882543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 883543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 8842449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák if (so.output[i].start_component) { 8852449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák R600_ERR("stream_output - start_component cannot be non-zero\n"); 8862449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák r = -EINVAL; 8872449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák goto out_err; 888543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 889543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 890543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák memset(&output, 0, sizeof(struct r600_bytecode_output)); 891543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.gpr = shader->output[so.output[i].register_index].gpr; 892543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.elem_size = 0; 8932449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák output.array_base = so.output[i].dst_offset; 894543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 895543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.burst_count = 1; 896543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.barrier = 1; 897543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.array_size = 0; 8982449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák output.comp_mask = (1 << so.output[i].num_components) - 1; 899543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.bc->chip_class >= EVERGREEN) { 900543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 901543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 902543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 903543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 904543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 905543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 906543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 907543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 908543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 909543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 910543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 911543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 912543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 913543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 914543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } else { 915543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 916543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 917543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 918543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 919543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 920543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 921543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 922543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 923543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 924543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 925543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 926543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 927543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 928543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 929543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 930543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output); 931543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (r) 932543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 933543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 934543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 935543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 936eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 937feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j = 0; 938457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 9394a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 940feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 941feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 942feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 943feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 944feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 945feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 946feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 947feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 948feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 949feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = i - pos0; 950feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 951457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 954feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 60; 955feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 957457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 958457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 959457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 960feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 961feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 962457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 963457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 968feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid; 969feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 9704f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 971feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher for (j = 1; j < shader->nr_cbufs; j++) { 9724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i + j], 0, sizeof(struct r600_bytecode_output)); 973feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 974feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 975feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 976feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 977feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 978feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 979feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 980feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 981feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid + j; 982feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 983feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 984feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 98560302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák j = shader->nr_cbufs-1; 986feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 9875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 988feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 989feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 2; 990feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 7; 991feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 992feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 99339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 994feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 995feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 7; 996feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 997feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 998feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 1000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 100972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1010457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1011feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher noutput += j; 1012457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 1013457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1014457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 1015457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 1016457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 1017457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 1018457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1019457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1020457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 10214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 1022457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 1023457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 1024a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_x = 7; 1025a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_y = 7; 1026a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_z = 7; 1027a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_w = 7; 10288ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 1029457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 1030457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 1031457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 10327e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1033457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 1034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1035c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1036481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 1037481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 10384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[0], 0, sizeof(struct r600_bytecode_output)); 1039481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 1040481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 1041481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 1042481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 1043481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 1044481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 10458ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 1046481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 1047608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1048481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 1049a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1050481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 1051481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 1052457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 1053457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 105489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 10557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 10567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 10577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 1058457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1059b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 1060b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 1061a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1062c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1063c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1064457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 1065457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 10664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 1067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 10707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 107189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 10724a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 10737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10743b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 1078cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1085f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1086f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 10954a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1096a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1097a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1098a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1099a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1100a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1101a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1102a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1103a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1104a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1105a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1106a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 11074a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1108f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1109f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1110f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1111f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1112f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 11134a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 11143efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 11153efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 11163efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 11173efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 111880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 111980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 112080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 11214a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 11237a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11247a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 112947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 113047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 11317a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 11327a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 11337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1136dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1138dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1139d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1140d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1141dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1142d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1143d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1144d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1145dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1146dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1147dffad730df17983cfaef0808555a8c26cad0aa15Christian König 11489b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1149dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1150dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11514a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1152dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1153dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1155d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1156d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1157d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1158d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 11594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 116080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1162d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1163d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 11654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1167d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 11684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 11694a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 11744a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 11767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 11774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 11787a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 11829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 11854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1192d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1193d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 11949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1195d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1196d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1197d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1198d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 11999b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 12009b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 12019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 12029b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 12039b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 12049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1205d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1206d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1208cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1209cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1210cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1211cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1212cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1213cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1214cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1215cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1216cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1217cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1218cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1219cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1220cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1221cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1222cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1223cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1224cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1225cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1226cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1227cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1228cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1229cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1230cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1231cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1232cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1233cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1234cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1235cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1236cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1237cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 12387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 12397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 12407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 12424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 12447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 12464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 12477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 12487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 12507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 12537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 12557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 12617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 12627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 126488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 126588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 126688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 126788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 12681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 126988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 127096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 127196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 127296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 127396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 127496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 12754a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 12774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1278a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 127988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 128088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 128188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 128288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 128388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 128488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 12867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1287921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 128888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 129096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1291ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 129288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 129488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 129588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 129688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 12997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 130088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 130188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 130288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 130388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 130488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 130588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 130688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 13074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 130888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 130988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 131088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 13114a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1312a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 131388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 131488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 131588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 131688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 131788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 131888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 131988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 132088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 13217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1322921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 132388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1324921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1325ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 132696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 132789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1328a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1329a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 133096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 133196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 133296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 133396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 133496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 133596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 133688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 13374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 133888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 133988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 134092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 134192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 134292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 13437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 13447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13464a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 13564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 13627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 137492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 137592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 137692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13774a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 137892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1379dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 138092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 13811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 138292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 138392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 138488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 13854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 138688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 138788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 138888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 138988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 139088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 139188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 139288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 139388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 13944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 139588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 139688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 139788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 139888f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1399be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1400be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1401be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1402be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 14034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1404a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1405be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1406be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 140780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1408be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 140988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 14104a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 141188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 141288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 141388f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 141488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 141588f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 141688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 141792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 141892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 141992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14204a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 142292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 142357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 142457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 142557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 142657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 14271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 142857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 142957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 143057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 143192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 143292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 143357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 143489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 14357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 14364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 14387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 14417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 14427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 14437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 14447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 14457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 14467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 14477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 14527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 14534a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 14557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 145692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 14587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 14597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14604a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 146457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 146592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 146692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 146757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 146889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 14697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 14704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 14727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 14747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 14757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 14767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 14777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 14787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 14797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 14807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 14857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 14864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 148957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 14907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 14917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 14927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 149757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 149892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1499ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1500ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 15014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1502ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1503ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1504ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 150580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1506ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1507ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1508ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1509ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1510ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1511ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 15124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1513ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1514ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1515ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1516ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1517ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1518ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 15194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1520ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1521ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1522ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 152380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1524ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1525ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1526ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1527ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1528ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1529ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 15304a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1531ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1532ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1533ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1534ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 153592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 153692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 153792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1538094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1539094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 15404a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1541094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1542094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1543094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 15444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1545094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 15464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1547094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 15484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1549921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 15504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 15514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 15524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 15534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 15544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 15554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 15564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1557094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1558094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1559094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 15604a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1561094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1562094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1563094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 15644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 15654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 15664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 15674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1568094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1569094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1570094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 15710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 15720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 15730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 15750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 15760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1577f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 15784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1579f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 15804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 1581f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1582f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 1583f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1584f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1585f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 1586f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 1587f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1588f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 15894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1590f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 1591f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 1592f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 15930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 15940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 15956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 15966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 15977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 15986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 159989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 16007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 1601f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 16024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1604f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1605f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 1606f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1607f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 16087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 16097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 16127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 16137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 1619f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 16204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1622f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1623f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 16242fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 16252fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 16262fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 16277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 16336a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 16346a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 16350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 163686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 16374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1638a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 163986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 164086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 16414a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 16424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 16430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 16440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 16450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 16460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 16470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 16484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 16500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 16510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 165289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 16537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 16547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 16554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 16577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 16587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 16597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 16654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 16714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 16737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 16767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16774a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1682abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 16838567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 16844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16858567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 16868567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 16878567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 16888567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 16898567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 16904a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16918567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 16928567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 16938567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 1694abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 16954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1696abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 16974a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1698abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1699abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1700abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1701abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 17024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1703abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1704abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1705abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1706abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 17074a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1708abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1709abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1710abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1711abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1712abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1713abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 17144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1715abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1716abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1717abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 17180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 17190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 17200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 172142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 172242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 172342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17244a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 172542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 172642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 17274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1728df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1729df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1730df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1731df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1732df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1733df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1734df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 173542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 17364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 17374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 173842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 173942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 174042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 174142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 17424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 174342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 174442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 174542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 174642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 174742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 174842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1749a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 17507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 17517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17524a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1753a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 17547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 17557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 17564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1758a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 17597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 176080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 17627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 17637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 17644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 17667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 17677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 17687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 17697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 17707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1771a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1772a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1773a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1775a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1776a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1778a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1779a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 17804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 1781a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1782a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1783a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1784a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1786a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1787a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1788a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1789a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1790a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1791a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 17937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 17947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 17964a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 17977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 18004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 18024a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 18047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 18057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 18067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 18077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 18144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 18164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 18177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 18187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 18267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 18274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 18297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 18307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 18347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1842a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1843a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 18444a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1845a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1846a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1847a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 18484a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1849a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 18504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1851a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1852a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1853a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 18544a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1855a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1856a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1857a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 18584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 185966f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 18604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 1861a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1862a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1863a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1864a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 18654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1866a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1867a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1868a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 18694a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1870a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1871a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1872a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1873a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1874a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 18754a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1876a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1877a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1878a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1879a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1880a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1881a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 1882a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin{ 1883a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1884a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin struct r600_bytecode_alu alu; 1885a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin int i, r; 1886a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 1887a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 1888a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1889a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin for (i = 0; i < 4; i++) { 1890a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (!(write_mask & (1<<i))) 1891a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin continue; 1892a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1893a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1894a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 1895a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1896a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.sel = ctx->temp_reg; 1897a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.chan = i; 1898a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.write = 1; 1899a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1900a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 1901a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (i == last_inst) 1902a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.last = 1; 1903a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 1904a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (r) 1905a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return r; 1906a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin } 1907a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1908a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin for (i = 0; i < 4; i++) { 1909a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (!(write_mask & (1<<i))) 1910a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin continue; 1911a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1912a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1913beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin alu.inst = ctx->inst_info->r600_opcode; 1914a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1915a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1916a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1917a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1918a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.src[0].chan = i; 1919a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1920a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (i == last_inst) 1921a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.last = 1; 1922a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 1923a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (r) 1924a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return r; 1925a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin } 1926a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 1927a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return 0; 1928a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin} 1929a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 19306b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 19316b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{ 19326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19336b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct r600_bytecode_alu alu; 19346b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int i, r; 19356b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 19366b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 19376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* tmp = -src */ 19396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 19406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 19416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 19426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 19456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.sel = ctx->temp_reg; 19476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.chan = i; 19486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 19496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 19516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 19526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 19546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 19556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 19566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 19576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 19586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 19596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* dst = (src >= 0 ? src : tmp) */ 19616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 19626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 19636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 19646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 19676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.is_op3 = 1; 19686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 19696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 19716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 19736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 19746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].sel = ctx->temp_reg; 19756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].chan = i; 19766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 19786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 19796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 19806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 19816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 19826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 19836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return 0; 19846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin} 19856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 19880d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 19890d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 19900d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19914a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1992921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 19930d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19940d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 19950d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 19964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1997a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 19980d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1999cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 20000d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 2001cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 20020d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2004921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 20054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 20060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20070d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 20080d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 20094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20100d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 20110d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 20120d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 20130d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20140d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 20150d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 20164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2017a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 20180d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 201980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20200d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20210d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 2022cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 20230d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 20240d48925a56ad4fb253386110b545abda82a25464Dave Airlie 2025921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 20260d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 20270d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20280d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 2029cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 20300d48925a56ad4fb253386110b545abda82a25464Dave Airlie 20310d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 20320d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 20334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20340d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 20350d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 20360d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 20370d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 20380d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 20390d48925a56ad4fb253386110b545abda82a25464Dave Airlie 2040cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 2041cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 20424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2043cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 2044cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2045cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 20464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2047cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 2048a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 20496c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 2050cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 2051a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 205280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2053cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2054cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 2055cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2056cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 2057cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 2058cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 20594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2060cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 2061cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 2062cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2063cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 2064cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 2065cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 2067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 2068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20694a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 2071dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 20737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 20747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 20757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 20767be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 20774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 20804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 2081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 20827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 208380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 2085cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 2086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 20877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 2088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 2089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 20904a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 2092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 2093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 20947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 2095cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 2096cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2097cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 2098cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 2099cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21004a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2101cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 2102cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 21044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2105cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2106cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 21074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 2108cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2109a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 211080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2111cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 2112a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2113cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 2114cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 2115cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 2116cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 2117921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 2118cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 2119cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2120cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2121cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 2122cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 2123921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 2124cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 2125cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2126cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2127e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 2128e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 2129e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 2130e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 2131e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 2132e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 2133e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 2134cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 2135cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 2137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 2138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 2139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 21404a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 2142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 2143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 21447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 2145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 2146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 21476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 21486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 21496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 21506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 21526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 21536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 21546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 21556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 21566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 21576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 21586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 21596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 21616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 21626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 216333241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 216433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 216596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 216633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21674a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 21684a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2169641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 217040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 2171bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 2172da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 2173da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 21746415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 217578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 217613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 21771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 2178641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 21796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 2180641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 21811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 21821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 21831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 21841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 21851d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 21861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 21871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 21881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 21891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 21901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 219113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 219213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 219313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 219440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 219540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 21964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 219740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 219840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 219940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 220040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 220140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 220240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 220340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 220440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 220540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 220640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 220740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 220840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 220940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 22104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 221140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 22124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 221340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 221440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 221540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 221640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 221740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 22184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 221940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 222040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 222140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 222213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 222340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 222440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 222540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 222640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 222740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 222840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 222940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 223040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 223140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 223240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 223340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 223440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 223540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 223640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 223740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 223840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 22394a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 224040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 224140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 224213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 224313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 22447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 2245b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 224689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 22477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 22494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 22514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 2252bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 22547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 22664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 22684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 22707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22789d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 2279b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 22804a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2281a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2282b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 22837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 22844a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2285b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2286b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2287b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 22884a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2289b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2291b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 22924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2293a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2294921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 2296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 2298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2299b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 23004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 230378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2305bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2306bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2307bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 23080e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 23090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 2310bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2311bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 2312bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 23134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 23154a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 23164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 2317bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2318bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 2319bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 2320bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 2321bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 23224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2323bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2324bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2325bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2326bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2327bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 232889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 23297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 23304a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 23357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 23464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 23487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 23507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 23517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 23537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2360bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 2361bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 23627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 2363bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 23644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2365a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2366bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2367bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2368bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2369bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 2370bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2371bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 23727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2373bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2374bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2375a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2376bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2377bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2378bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 2379bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2380bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2382bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2383bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2384bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2386a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2387bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2388bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2389bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2390bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 2391bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2392bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 23937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2394bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2395bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2396a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2397bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2398bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2399bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 2400bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2401bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2402bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 24034a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2404bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2405bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2406bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 240778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2408bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2409bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2410bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 241178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2412b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 24134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2414a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 24154a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2416b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2417b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2418b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2419b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2420b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 24214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2422b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2423b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2424b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 242578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2426b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2427b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 24287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2429bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2430929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2431929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 24326b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2433929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 2434929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 2435de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2436de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2437de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2438de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2439de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2440de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2441de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2442c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 2443c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 2444c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 2445de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2446de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2447de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2448de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2449de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 245033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 24514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 2452bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 24536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 24546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2455077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2456641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 24576c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 24589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 24599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 24609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 24619d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 246278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 246378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 246478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 246578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 246678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 246778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 246878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 246978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 247078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 247178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2472244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 247378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 24749a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2475bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2476bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2477bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2478bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2479bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2480bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2481bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 24826b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 24836b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 248401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 248501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 248601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 24876b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 24886b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 2489bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 24901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 24911d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 24921d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 249369d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2494929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 2495929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 2496929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 2497929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2498929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 24996b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2500929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 2501929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 2502929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 250378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2504929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2505929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 2506929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2507929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 2508929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 2509929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 2510929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 2511929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 2512929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 2513929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2514929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2515929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 2516929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2517929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2518929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2519929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2520929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2521bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 25224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 2523bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2524bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2525bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2526bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2527bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 252833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 252933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2530b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2531b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2532b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 25334a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2534dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2535b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2536b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2537b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2538c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 25391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2540c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2541c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2542c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2543c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 25444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2545c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 25464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 25474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2548c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 254980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2550c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2551c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2552c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2553c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 25544a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2555c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2556c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2557c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2558c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2559c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2560c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2561b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2562dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2563dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2564dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2565dffad730df17983cfaef0808555a8c26cad0aa15Christian König 25664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2567a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2568921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2569b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 25704a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 25714a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 2572b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2573b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2574dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2575b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2576b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2577b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 25784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2579b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2580b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2581b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2582b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2583b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2584dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2585dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2586dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2587dffad730df17983cfaef0808555a8c26cad0aa15Christian König 25884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2590b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2591b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 25924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2593b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2594b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2595dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2596b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2597b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2598b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 25994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2600b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2601b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2602b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2603b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2604b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2605dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2606dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2607dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2608dffad730df17983cfaef0808555a8c26cad0aa15Christian König 26094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2610a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2611b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 26124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26134a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2614b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2615b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2616dffad730df17983cfaef0808555a8c26cad0aa15Christian König 261780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2618b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2619dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2620b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2621b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 26224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2623b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2624b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2625b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2626dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2627b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2628b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 262987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 263087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 263187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26324a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 263387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2634dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 263587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 26367be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 26377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 26387be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 263987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 26404a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2641a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 26424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 26444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 264580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 264687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 264787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 264887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 26497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 265087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 26514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 265287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 265387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 26547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 265587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 265687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 265787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 26580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 26590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 26600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 26620e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 26634a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 26640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 26650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 26660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 26680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 26690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 26714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2672a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 26730e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 26744a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 26754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 26760e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 26770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 26780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 26790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 26800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 26810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 26820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 26840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 26850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 26860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 26880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 26894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 26910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 26920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 26930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 26954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2696a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 26970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26980e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 26994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 27004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 27010e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 27020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 27030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 27040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 27050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 27060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 27070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 27080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 27090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 27100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 27110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 27120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 27130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 271480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 271580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 27160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 27170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 27180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 27190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 27200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 27214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 27230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 27240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 27250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 27260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 27270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 27280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 27290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 273036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 273136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 273236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 27334a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 27357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 273636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 273736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 273836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 27394a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 274036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2741a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 27424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 274336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 274436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 274536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 274636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 274736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 27484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 274936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 275036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 275136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 275289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 275736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 27757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27774a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 278136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 27827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 278336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 278436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 27854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 278636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 27884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 278936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 279036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2791b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2792b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2793b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2794b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2795b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 279636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 279736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 279836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 279936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 280036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 28014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 280236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 280336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 280436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 280536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 280636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 280736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 280889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 28124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 281336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 28147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 282036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 28214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 28284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 282936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 28307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 28337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28364a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 284036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 284136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 284236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 284336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 28444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 284536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 284736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 284836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 284936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 285036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 285136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 285236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 285336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 28544a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 285536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 285636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 285736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 285836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 285936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 286087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2861460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2862460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2863460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 28644a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2865460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 28667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2867460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2868f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 2869460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 287089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2873460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2888460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2904460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2905460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2906460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2907460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2908460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2909460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2910460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2911460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2912460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2913460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2915460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2916460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2917460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2918460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2919f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 2920460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2921460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 292289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 29237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 29244a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 292596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 29274a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 292996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 29327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 29337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 29357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 29417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 29424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 29454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 29477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 29507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 295796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 295996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 296096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 296196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 296296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 296396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 296496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 296596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 296696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 296796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 296896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 297096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 297196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 297296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 297389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 29747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 29754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 29777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 29787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 29797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 29827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 29837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 29857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 298696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 29917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 29924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 29947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 29957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 299696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 29997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 30007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 300196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 30024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 30037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 30047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 30057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 300696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 300789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 30087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 30094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 30117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 30127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 30137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 30147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 30157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 30167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 30177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 30187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 30197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 30207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 30214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 30227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 30237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 30247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 30257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 30264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 30287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 30297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 303096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 30317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 30327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 30337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 30347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 303596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 30364a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 30377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 30387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 30397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 304096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 30414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 304296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 304396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 304496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 30454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 304796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 304896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 304996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 3050460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3051460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3052460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 3053460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3054460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3055460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 30564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3057460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3058460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3059460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3060460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3061f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 3062460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 306389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 30647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 30654a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3066460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 30677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 30684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30694a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 3070460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 30717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 30727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 30737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 30747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 30757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 30767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 3077460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 30784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 30797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 30807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 30817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 30827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 30834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 30857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 30864a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 30887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 30897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 30907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 30917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 30927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 30937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 30944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 30957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 30967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 30977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 3098460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3099460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3100460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 3101460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 31024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3103460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3104460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3105460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 3106460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 3107460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3108460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3109460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 3110460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3111460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3112460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 31134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3114460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3115460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3117460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3118460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 3119460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 3120460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 312198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 312298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 312398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 31244a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 312598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 3126a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 31274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 312898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 312952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 313052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 313152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 313252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 313352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 313452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 313552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 31369b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 31378e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 31389b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 313952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 314052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 314152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 314252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 314352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 31448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 314598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 31468e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 31478e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 31484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 314998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 315098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 31518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 31528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 315398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 315498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 315598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 315647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 315747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 31584a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 315947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 3160a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 31617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 31627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 3163077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3164077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 31654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 31668e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3167077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3168077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3169077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 31704a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3171077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 3172077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 3173077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3174077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 31758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 31768e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3177077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3178077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3179077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 31804a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3181077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 31827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 31837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 3184077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3185077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 31864a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 31878e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3188077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3189077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3190077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 31914a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3192077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 31937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 31949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 31958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 31968e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 31978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 31988e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 31998e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 32008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 32018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 32028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 32049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 32057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 32067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 32077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 32087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 32097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 32108e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 321147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 321247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 321347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 321457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 321557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 321657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 32174a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 321857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 321957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 322057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 32214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 322257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3223a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 322480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 32257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 32267ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 322757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 322857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 32294a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 323057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 323157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3232a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 323357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 323457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 32354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 323657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 323757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 323857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 32394a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 324057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 324157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 324257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 324357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 324457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 324557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 3247a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 32484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3249a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 3250a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 32514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3252a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 3253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 3254a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3255a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 3256a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 3257a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 3258a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 32594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 3260a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 3261a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 32627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3263a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 3264a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 32654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3266a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 3267a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3269a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3270a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 3272a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 32732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 32742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 32752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 32762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 32772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 32784f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 32792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 32804f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 32812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 32822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 32832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 32842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 32854f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 32862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 32872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 32884f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 32892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 32902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 32912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 32922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 32932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 32942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 32952bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 32964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 32978813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 32988813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 32998813842121d46d1be476807c98b0ba0b771f0c91Christian König } 33002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 3301a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3302a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3303a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 3305a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 330909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3320a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 332509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 3332a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 3333a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 3334a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 333609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 333809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 33427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 334309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 334409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 334509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 334609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 334709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 334809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 334909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 335009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 335209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 335309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 335409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 335509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 335609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 335709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 335809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 335909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 336009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 336109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 336209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 336309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 336409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 336509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 336609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33674a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 33684a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 336909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 337009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 337109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 337309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 337409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3375a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 337609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 337709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 337809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 337909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 338009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 338109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 338209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 338309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 338409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 338509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 338609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 338709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 338809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 338909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 339009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 339109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 339209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 339309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 339409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 339509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 33964f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 339709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 339809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 339909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 340009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 340109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 340209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 34034f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 340409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 340509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 340609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 340709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3408a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 340909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 341009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 341109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 341209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 341309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 341409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 341509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 34167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 341709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 341809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 341909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 342009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 342109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 342209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 342309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 342409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 342509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 342609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 342709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 342809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 342909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 343009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 343109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 34324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 343309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 343409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 343509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 343609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 343709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 343809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 343909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 344009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 344109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 344209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 34438b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 344409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 34454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 344609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 344709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 344809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 344909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3450a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3451a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3452a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3453a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3454a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 34554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3456a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3457a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 345809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3459a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3460a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3461a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3462a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3463a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3464a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3465a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3466a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3467a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3468a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3469a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3470a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3471a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3472a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3473a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3474a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 347509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3476a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 347709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 347809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 347909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 348009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 348109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 348209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 348309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 348409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 34854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 348609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 348709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3488a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 348909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 349009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 349109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 349209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 349309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 349409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 349509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 349609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 349709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 34984a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 349909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 350009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 350109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 350209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 350309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 350409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 350509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 350609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 350709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 350809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 350909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 351009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 351109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 351209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 351309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 351409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 351509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 351609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 351709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 351809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 351909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 352009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 352109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 352209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 352309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 352409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 352509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 352609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 352709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 352809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 352909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 353009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 353109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 353209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 353309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 353409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 353509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 353609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 353709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 35384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 353909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 354009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 354109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 354209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 354309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 354409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3545a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3546a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3547a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3548cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 3549cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 3550cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3551cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 3552cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 3553cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3554cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3555cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 3556cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3557cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3558cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3559cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3560cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3561cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3562cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 3563cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 3564cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 3565cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3566c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 3567cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 3568cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3569cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3570cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 35719b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 3572cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3573cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3574cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3575cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3576cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3577cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3578cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3579cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3580cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3581cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3582cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3583cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3584cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3585c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3586cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3587cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 3588cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 3589cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3590cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3591cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3592cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3593cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3594cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3595cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3596cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3597cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3598cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 3599cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 3600cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 360298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 36040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3605df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3606df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3607df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3608df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3609df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3610df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3611df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 361242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 361336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 361957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3620dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3622d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3623be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3626b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36343af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36363af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3637df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 36387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 36394558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3640a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 36410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3646e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 364788f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 36483af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 36493af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 36504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36560d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36580d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 365988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3660d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 36610d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3663b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 366413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3665b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36729f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36760d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 367787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 367892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3679c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 3680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3683ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 368409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3697c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3698cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 36990ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3703c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3704c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 3705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3706cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 3707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 37091d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 371009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3732094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3736bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 3737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3738c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3739c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3740c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2}, 3741c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 3742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3743c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2}, 3744c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 37459a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 3746c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 3747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3748c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3749c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3750c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 3751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3752c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2}, 3753c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3754c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 3755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3756c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3757c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 3758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3762cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3763cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3764cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3765cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3766cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3767cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3768cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3769cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3770cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3771cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3772cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3773cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 37749b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 37759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 37766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 3777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 377950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 378050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 378198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 378250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 378350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 378450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 37858ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 378650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3787112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 378850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 378950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 379050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 379150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 379250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 379350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 379450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 379550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 379650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 379750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 379850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 379950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 380050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 380250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 380550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 380850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3810df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 381150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 381250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 381350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 381450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 381550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 381650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 382350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 383050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 383450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 383550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 383713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 383850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 383950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3852c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3870608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3871cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3876cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3877cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3879cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 38821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 39067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 39087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3909a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3911cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3912cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3913cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 3914cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3916cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3917beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 3918cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3919cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3921cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3922cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3923cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 3926cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3927cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3929cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3930cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3935cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3936cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3937cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3938cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3939cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3940cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3941cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3942cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3943cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3944cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3945cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3946cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 39479b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 39489b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 39496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 39557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 39567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 39577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 39587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 39597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 39607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 39617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 39627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 39637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 39647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 39657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 39667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 39677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 39687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 39697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 39707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 39717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 39727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 39737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 39757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 39787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 39817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3983df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 39847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 39857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 39867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 39877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 39887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 39897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 39917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 39937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 39947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 39957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 39967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 39977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 40037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 40057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 40067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 40077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 40087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 401013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 40117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 40127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 401950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 402050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 402150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 402250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 402350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 402450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 4025c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 402650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 402750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 402850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 4029ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 403050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 403150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 403250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 403350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 403450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 403550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 403650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 403750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 403850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 403950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4044cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 40450ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 404650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 404850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 404950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 405050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 405150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4052cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 405350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 40541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 40551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 405650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 405750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 405850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 405950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 406050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 406250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 406450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 406950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 407050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 407850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 407950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 408050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 408150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 408250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 408350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4084cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 4085cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 408650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 408750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 408850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 408950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 409950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 410750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4108cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 4109cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 4110cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 4111cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 4112cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 4113cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 4114cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 4115cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 4116cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 4117cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 4118cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 4119cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 41209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, 0, tgsi_unsupported}, 41219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 412250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 412350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 4124