r600_shader.c revision 39491d1d31d9f03437816fbb4f2872761ae1157c
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 18810d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 18820d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 18830d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18844a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1885921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 18860d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18870d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 18880d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 18894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1890a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 18910d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1892cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 18930d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1894cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 18950d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 1897921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 18984a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 18990d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19000d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 19010d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 19024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19030d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 19040d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 19050d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 19060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19070d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 19080d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 19094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 19110d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 191280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 19130d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19140d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1915cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 19160d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 19170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1918921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 19190d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 19200d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19210d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1922cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 19230d48925a56ad4fb253386110b545abda82a25464Dave Airlie 19240d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 19250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 19264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19270d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 19280d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 19290d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 19300d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 19310d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 19320d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 19354a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 19394a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1941a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 19426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1944a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 194580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1946cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1947cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1948cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1949cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1950cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1951cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 19524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1953cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1954cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1955cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1956cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1957cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1958cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19624a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1964dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 19667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 19677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 19687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 19697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 19704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 19734a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 197680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1978cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 19807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1988cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19934a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1994cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1995cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 19974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 20004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 2001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2002a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 200380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 2005a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2006cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 2007cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 2008cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 2009cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 2010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 2011cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 2012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2014cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 2015cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 2016921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 2017cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 2018cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2019cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2020e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 2021e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 2022e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 2023e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 2024e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 2025e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 2026e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 2027cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 2028cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 2030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 2031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 2032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 20334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 2035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 2036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 20377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 2038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 2039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 20406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 20416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 20426415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 20436415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 20456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 20466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 20476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 20486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 20496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 20506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 20516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 20526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 20546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 20556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 205633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 205733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 205896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 205933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 20614a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2062641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 206340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 2065da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 2066da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 20676415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 206878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 206913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 20701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 2071641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 20726415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 2073641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 20741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 20751d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 20761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 20771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 20781d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 20791d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 20801d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 20811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 20821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 20831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 208413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 208513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 208613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 208740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 208840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 20894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 209040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 209140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 209240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 209340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 209440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 209540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 209640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 209740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 209840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 209940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 210040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 210140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 210240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 21034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 210440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 21054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 210640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 210740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 210840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 210940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 211040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 21114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 211240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 211340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 211440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 211513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 211640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 211740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 211840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 211940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 212040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 212140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 212240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 212340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 212440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 212540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 212640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 212740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 212840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 212940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 213040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 213140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 21324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 213340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 213440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 213513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 213613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 2138b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 213989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 21424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 2145bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 21487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 21577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 21594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 21627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 21637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 21657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21719d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 2172b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 21734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2174a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2175b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 21767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 21774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2178b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2179b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2180b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 21814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2182b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2183b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2184b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 21854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2186a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2187921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2188b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 2189b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2190b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 2191b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2192b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 21934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2194b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2195b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 219678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2197b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2200bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 22010e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 22020e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 2203bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 2205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 22064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2207a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 22084a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 22094a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 2210bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2211bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 2212bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 2213bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 2214bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 22154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2216bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2217bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2218bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2219bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2220bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 222189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 22227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 22234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 22257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 22267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 22277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 22287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 22297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 22307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 22317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 22337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 22394a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 22417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 22427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 22437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 22447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 22467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2253bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 2254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 22557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 2256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 22574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2258a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2261bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2262bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 2263bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2264bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 22657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2266bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2267bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2268a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2269bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2270bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2271bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 2272bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2273bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2276bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2279a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2280bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2281bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 2284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2285bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 22867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2290bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2291bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2292bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 2293bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2294bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2295bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 22964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2297bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2298bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2299bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 230078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2301bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2302bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2303bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 230478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 23064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2307a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 23084a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2313b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 23144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 231878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 23217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2322bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2323929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2324929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 23256b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2326929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 2327929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 2328de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2329de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2330de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2331de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2332de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2333de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2334de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2335c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 2336c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 2337c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 2338de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2339de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2340de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2341de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2342de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 234333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 23444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 2345bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 23466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 23476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2348077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2349641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 23506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 23519d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 23529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 23539d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 23549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 235578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 235678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 235778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 235878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 235978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 236078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 236178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 236278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 236378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 236478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2365244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 236678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 23679a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2368bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2369bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2370bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2371bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2372bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2373bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2374bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23756b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 23766b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 237701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 237801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 237901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 23806b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 23816b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 2382bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 23841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 23851d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 238669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2387929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 2388929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 2389929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 2390929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2391929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 23926b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2393929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 2394929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 2395929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 239678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2397929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2398929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 2399929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2400929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 2401929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 2402929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 2403929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 2404929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 2405929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 2406929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2407929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2408929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 2409929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2410929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2411929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2412929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2413929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2414bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 24154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 2416bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2417bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2418bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2419bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2420bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 242133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 242233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24264a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2427dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2431c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 24321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2433c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2434c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2435c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2436c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 24374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2438c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 24394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 24404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2441c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 244280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2443c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2444c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2445c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2446c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 24474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2448c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2449c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2450c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2451c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2452c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2453c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2455dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2456dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2457dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2458dffad730df17983cfaef0808555a8c26cad0aa15Christian König 24594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2460a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2461921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2462b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 24634a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 24644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 2465b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2466b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2467dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2470b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 24714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2473b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2477dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2478dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2479dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2480dffad730df17983cfaef0808555a8c26cad0aa15Christian König 24814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2482a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2483b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2484b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 24854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2486b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2487b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2488dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2490b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2491b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 24924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2494b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2495b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2497b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2498dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2499dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2500dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2501dffad730df17983cfaef0808555a8c26cad0aa15Christian König 25024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2504b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 25054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 25064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2507b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2508b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2509dffad730df17983cfaef0808555a8c26cad0aa15Christian König 251080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2511b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2512dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2513b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2514b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 25154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2516b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2517b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2518b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2519dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2520b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2521b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 252287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 252387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 252487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 25254a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 252687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2527dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 252887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 25297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 25307be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 25317be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 253287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 25334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 25354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 25364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 25374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 253880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 253987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 254087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 254187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 25427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 254387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 25444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 254587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 254687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 25477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 254887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 254987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 255087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 25510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 25520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 25530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 25540e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 25550e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 25564a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 25570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 25580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 25590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 25610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 25620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 25644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2565a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 25660e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 25674a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 25684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 25690e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 25700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 25710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 25720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 25730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 25740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 25770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 25780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 25790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 25810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 25824a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 25840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 25850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 25884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 25900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25910e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 25924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 25934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 25940e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 25950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 25960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 25970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 25980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 25990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 26000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 26020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 26030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 26040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 26050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 26060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 260780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 260880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 26090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 26100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 26110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 26120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 26130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 26144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 26160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 26170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 26180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 26190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 26200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 26210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 26220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 262336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 262436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 262536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26264a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 262936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 263036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 263136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 26324a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 263336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2634a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 26354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 263636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 263736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 263836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 263936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 264036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 26414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 264236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 264336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 264436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 264589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 265036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 26547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26574a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 26617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 26637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 26647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 26657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 26687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 267436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 26757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 267636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 267736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 26784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 267936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 26814a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 268236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 268336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2684b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2685b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2686b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2687b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2688b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 268936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 269036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 269136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 269236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 269336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 269536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 269636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 269736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 269836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 269936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 270036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 270189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 270636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 27077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 271336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 27144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 272236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 27237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 273336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 273436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 273536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 273636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 27374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 273836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2739a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 274036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 274136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 274236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 274336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 274436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 274536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 274636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 27474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 274836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 274936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 275036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 275136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 275236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 275387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2754460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2755460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2756460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 27574a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2758460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2760460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2761f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 2762460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 276389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27654a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27694a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 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 } 2781460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 27827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27864a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 27887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 27917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2797460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2799460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2800460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2801460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2802460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2803460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2804460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2805460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2806460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2808460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2809460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2810460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2811460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2812f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 2813460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2814460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 281589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 281896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 282296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 28267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28304a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 28437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 285096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 285296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 285396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 285496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 285596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 285696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 285796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 285896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 285996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 286096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 286196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 286396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 286496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 286596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 286689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 28707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 28727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 28767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 287996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 288996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 28927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 289496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 289996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 290089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 29017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 29024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 29047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 29057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 29067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 29097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 29107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 29127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 29187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 29194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 29217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 29227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 292396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 29267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 292896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 293396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 293596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 293696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 293796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 29384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 294096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 294196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 294296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2943460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2944460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2945460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2946460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2947460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2948460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2950460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2951460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2952460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2953460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2954f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 2955460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 295689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 29577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 29584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2959460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 29614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 2963460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 29667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 29687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 29697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 2970460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 29757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 29764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 29794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 29817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 29837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 29847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 29857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2991460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2992460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2993460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2994460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 29954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2996460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2997460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2998460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2999460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 3000460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3001460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3002460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 3003460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3004460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3005460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 30064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3007460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3008460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3009460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3010460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3011460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 3012460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 3013460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 301498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 301598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 301698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30174a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 301898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 3019a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 30204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 302198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 302252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 302352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 302452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 302552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 302652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 302752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 302852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 30299b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 30308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 30319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 303252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 303352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 303452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 303552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 303652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 30378e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 303898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 30398e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 30408e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 30414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 304298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 304398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 30448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 30458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 304698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 304798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 304898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 304947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 305047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30514a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 305247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 3053a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 30547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 30557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 3056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 30584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3060077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3061077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3062077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 30634a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3064077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 3065077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 3066077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3067077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 30688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 30698e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3070077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3071077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3072077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 30734a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3074077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 30757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 30767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 3077077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 3078077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 30794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 3081077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 3082077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 3083077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 30844a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3085077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 30867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 30879b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 30888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 30898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 30908e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 30928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 30938e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 30948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 30958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 30968e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 30979b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 30987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 30997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 31007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 31017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 31027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 31038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 310447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 310547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 310647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 310757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 310857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 310957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 31104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 311157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 311257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 311357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 31144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 311557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3116a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 311780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 31187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 31197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 312057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 312157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 31224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 312357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 312457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3125a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 312657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 312757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 31284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 312957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 313057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 313157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 31324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 313357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 313457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 313557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 313657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 313757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 313857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3139a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 3140a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 31414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3142a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 3143a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 31444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 3146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 3147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 3149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 3150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 3151a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 31524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 3153a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 3154a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 31557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3156a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 3157a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 31584a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3159a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 3160a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 3161a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3163a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3164a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 3165a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 31662bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 31672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 31682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 31692bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 31702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 31714f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 31722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 31734f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 31742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 31752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 31762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 31772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 31784f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 31792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 31802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 31814f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 31822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 31832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 31842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 31852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 31862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 31872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 31882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 31894a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 31908813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 31918813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 31928813842121d46d1be476807c98b0ba0b771f0c91Christian König } 31932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 3194a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3195a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3196a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 3198a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 320309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 321009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3213a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 321509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 321809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 321909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 322309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 3225a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 3226a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 3227a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 322809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 323009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 323209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 32357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 323909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 324309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 324609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 325009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 325209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 325609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 325709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 325809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 325909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32604a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 32614a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 326209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 326309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 326409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3265a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 326609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 326709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 326909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 327009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 327109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 327209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 327309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 327409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 327509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 327609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 327709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 327809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 327909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 328009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 328109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 328309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 328509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32894f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 329209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 329509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32964f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3301a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 330309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 330509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 33097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 333209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 333309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 333409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 33368b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 334209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3343a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3344a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3345a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3346a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3347a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 33484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3349a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3350a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3353a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3355a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3356a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3357a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3358a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3359a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3360a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3361a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3362a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3363a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3364a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3365a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3366a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3367a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 336809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3369a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 337009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 337109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 337209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 337309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 337409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 337509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 337609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 337709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 33784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 337909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 338009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3381a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 338209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 338309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 338409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 338509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 338609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 338709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 338809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 338909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 339009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 339209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 339309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 339409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 339509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 339609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 339709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 339809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 339909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 340009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 340109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 340209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 340309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 340409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 340509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 340609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 340709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 340809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 340909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 341009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 341109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 341209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 341309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 341409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 341509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 341609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 341709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 341809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 341909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 342009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 342109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 342209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 342309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 342409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 342509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 342609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 342709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 342809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 342909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 343009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 34314a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 343209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 343309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 343409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 343509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 343609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 343709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3438a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3439a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3440a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3441cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 3442cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 3443cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3444cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 3445cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 3446cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3447cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3448cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 3449cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3450cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3451cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3452cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3453cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3454cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3455cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 3456cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 3457cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 3458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3459c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 3460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 3461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3462cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3463cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 34649b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 3465cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3471cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3472cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3475cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3478c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3479cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3480cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 3481cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 3482cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3483cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3484cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3485cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3486cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3487cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3488cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3489cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3490cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3491cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 3492cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 3493cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 349598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 34970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3498df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3499df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3500df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3501df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3502df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3503df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3504df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 350542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 350636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3510cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 351257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3513dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3515d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3516be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3519b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35273af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35293af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3530df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 35317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 35324558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3533a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 35340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3539e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 354088f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 35413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 35423af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 35434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35490d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35510d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 355288f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3553d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 35540d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3556b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 355713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3558b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35659f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35690d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 357087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 357192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3572c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 3573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3576ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 357709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3590c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3591cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 35920ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3596c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3597c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 3598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3599cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 3600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36011d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 36021d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 360309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3625094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3629bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 3630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3631c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3632c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3633c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2}, 3634c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 3635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3636c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2}, 3637c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 36389a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 3639c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 3640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3641c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3642c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3643c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 3644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3645c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2}, 3646c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3647c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 3648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3649c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3650c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 3651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3655cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3656cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3657cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3658cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3659cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3660cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3661cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3662cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3663cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3665cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 36679b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 36689b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 367150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 367250526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 367398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 367450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 367550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 367650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 36778ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 367850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3679112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 368050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 368150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 368250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 368350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 368450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 368550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 368650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 368750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 368850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 368950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 369050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 369150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 369250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 369350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 369450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 369550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 369650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 369750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 369850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 369950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 370050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 370150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3702df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 370350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 370450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 370550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 370650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 370750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 370850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 370950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 371050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 371250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 371350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 371450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 371550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 371650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 371950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 372050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 372150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 372250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 372350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 372450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 372550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 372650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 372750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 372850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 372913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 373050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 373150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 37427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 37437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3744c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 37457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 37507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 37517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3762608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3763cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3768cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3769cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3771cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37731d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 37741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3803cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3804cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 3806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 38077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3808cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3810cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3811cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3813cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3814cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3815cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 3818cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3819cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 38207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3821cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3822cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 38237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3827cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3828cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3829cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3830cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3831cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3832cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3833cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3834cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3835cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3836cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3837cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3838cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 38399b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 38409b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3874df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 38797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 38997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 390113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 391050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 391450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 391550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3916c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 391750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3920ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 392150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 392250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 392350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 392450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 392550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 392650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 392750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 392850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 392950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3935cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 39360ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 393750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 393850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 393950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 394050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 394150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 394250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3943cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 394450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 39451d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 39461d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 394750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 394850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 394950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 395150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 395350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 395550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 395950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 396150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 396950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 397050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 397150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 397250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 397350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 397450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3975cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3976cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 397750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 397850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 397950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 398950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 399850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3999cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 4000cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 4001cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 4002cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 4003cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 4004cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 4005cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 4006cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 4007cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 4008cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 4009cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 4010cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 40119b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, 0, tgsi_unsupported}, 40129b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 401350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 401450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 4015