r600_shader.c revision c96b9834032952492efbd2d1f5511fe225704918
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; 196725a820b926575265e6790601a0defd9c30947dcVadim Girlin int face_gpr; 197725a820b926575265e6790601a0defd9c30947dcVadim Girlin int colors_used; 1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 20842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 222c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 2328260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 24750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 2484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 2687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 2744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 282fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 2964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0; 31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 32721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 32821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 3297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 3600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3610a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 3935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 394725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */ 395725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) 396725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 397725a820b926575265e6790601a0defd9c30947dcVadim Girlin int r = 0; 398725a820b926575265e6790601a0defd9c30947dcVadim Girlin 399725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].spi_sid) { 400725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[index].lds_pos = ctx->shader->nlds++; 401725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].interpolate > 0) { 402725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_alu(ctx, index); 403725a820b926575265e6790601a0defd9c30947dcVadim Girlin } else { 404725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_flat(ctx, index); 405725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 406725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 407725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 408725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 409725a820b926575265e6790601a0defd9c30947dcVadim Girlin 410725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back) 411725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 412725a820b926575265e6790601a0defd9c30947dcVadim Girlin struct r600_bytecode_alu alu; 413725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r; 414725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_front = ctx->shader->input[front].gpr; 415725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_back = ctx->shader->input[back].gpr; 416725a820b926575265e6790601a0defd9c30947dcVadim Girlin 417725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < 4; i++) { 418725a820b926575265e6790601a0defd9c30947dcVadim Girlin memset(&alu, 0, sizeof(alu)); 419725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 420725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.is_op3 = 1; 421725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.write = 1; 422725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.sel = gpr_front; 423725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[0].sel = ctx->face_gpr; 424725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].sel = gpr_front; 425725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].sel = gpr_back; 426725a820b926575265e6790601a0defd9c30947dcVadim Girlin 427725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.chan = i; 428725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].chan = i; 429725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].chan = i; 430725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.last = (i==3); 431725a820b926575265e6790601a0defd9c30947dcVadim Girlin 432725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 433725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 434725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 435725a820b926575265e6790601a0defd9c30947dcVadim Girlin 436725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 437725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 438725a820b926575265e6790601a0defd9c30947dcVadim Girlin 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 44396bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 44472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 4505b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 45135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 4528a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 453024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 454725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 455725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[i].name == TGSI_SEMANTIC_FACE) 456725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 457725a820b926575265e6790601a0defd9c30947dcVadim Girlin else if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) 458725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->colors_used++; 459725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 460725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_input(ctx, i); 461725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 462725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 4705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 471024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 47235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 47391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->output[i].write_mask = d->Declaration.UsageMask; 47491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (ctx->type == TGSI_PROCESSOR_VERTEX) { 47591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (d->Semantic.Name) { 47691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 47791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2); 47891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 47991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 48091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->vs_out_misc_write = 1; 48191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 48291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 48391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 48733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 48847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 49096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 491c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 492c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 4934a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 49596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 496c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 497c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 498c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 49996bbc627f369c0100b950f81531b1fe9ef586c34Christian König 50096bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 50196bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 50296bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 503c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 50496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 5054a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 506c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 507c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 50839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 50939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie break; 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 51572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 51672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 517be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 518be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 519be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 520be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 521be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 5227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 523fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 524fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 525fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 526fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 527fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 528fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 529fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 530fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 531fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 532fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 533fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 534fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 535fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 536fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 5691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 5701fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 5711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 5721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 5731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 5741fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 5751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 5761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 5771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 5781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 5791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 58096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 5811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 5821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 5831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 5841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 5851fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 5861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 5871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 5884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 5891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 5901fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 5911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 5921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 5931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 5941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 59596bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 59639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 59739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 3; 59839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 3; 59939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 3; 60039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 3; 60139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 60239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 60339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 0; 60439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 0; 60539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 0; 60639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 0; 60739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 60839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } 609c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 6101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 6111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 6121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 6131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 6141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 6151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 6161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 617077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 618077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 6194a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 620077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 621077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 622077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 623077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 6244a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 625077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 626077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 6298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 634077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 6384a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 641077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 642077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 6438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 644077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 645077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 646077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 647077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 648077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 649077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 650077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 651077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 652077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 653077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 654077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 655077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 656077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 657077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 658077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 659d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 660077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 6614a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 662077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 663077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 665077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 6697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6704a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 680077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 681077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 682077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 683077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 684077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 685077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 686077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 687077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 688077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 689077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 690077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 691077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 692077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 6937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 7027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 7054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 7067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 7077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 7087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 7117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 7157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 7167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 7177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 7187687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 7197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 7207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7214a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 7227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 7237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 7247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 7257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 7267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 7277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 7307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 7317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 7327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 7334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 7347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 7357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 7367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 7377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 7387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 7397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 7407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 7417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 7427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 7434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 7447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 7457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 7467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 7487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 7497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 7517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 7527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 7537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 754725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx) 755725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 756725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r, count = ctx->shader->ninput; 757725a820b926575265e6790601a0defd9c30947dcVadim Girlin 758725a820b926575265e6790601a0defd9c30947dcVadim Girlin /* additional inputs will be allocated right after the existing inputs, 759725a820b926575265e6790601a0defd9c30947dcVadim Girlin * we won't need them after the color selection, so we don't need to 760725a820b926575265e6790601a0defd9c30947dcVadim Girlin * reserve these gprs for the rest of the shader code and to adjust 761725a820b926575265e6790601a0defd9c30947dcVadim Girlin * output offsets etc. */ 762725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr = ctx->file_offset[TGSI_FILE_INPUT] + 763725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->info.file_max[TGSI_FILE_INPUT] + 1; 764725a820b926575265e6790601a0defd9c30947dcVadim Girlin 765725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->face_gpr == -1) { 766725a820b926575265e6790601a0defd9c30947dcVadim Girlin i = ctx->shader->ninput++; 767725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].name = TGSI_SEMANTIC_FACE; 768725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].spi_sid = 0; 769725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].gpr = gpr++; 770725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 771725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 772725a820b926575265e6790601a0defd9c30947dcVadim Girlin 773725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < count; i++) { 774725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) { 775725a820b926575265e6790601a0defd9c30947dcVadim Girlin int ni = ctx->shader->ninput++; 776725a820b926575265e6790601a0defd9c30947dcVadim Girlin memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io)); 777725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR; 778725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]); 779725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].gpr = gpr++; 780725a820b926575265e6790601a0defd9c30947dcVadim Girlin 781725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 782725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_input(ctx, ni); 783725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 784725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 785725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 786725a820b926575265e6790601a0defd9c30947dcVadim Girlin 787725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = select_twoside_color(ctx, i, ni); 788725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 789725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 790725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 791725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 792725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 793725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 794725a820b926575265e6790601a0defd9c30947dcVadim Girlin 795eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader) 79672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 797eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 798eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct tgsi_token *tokens = pipeshader->tokens; 799543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct pipe_stream_output_info so = pipeshader->so; 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 8015555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 8034a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 806feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher int i, j, r = 0, pos0; 80772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 810c96b9834032952492efbd2d1f5511fe225704918Dave Airlie r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family); 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 816f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 818725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.face_gpr = -1; 819725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.colors_used = 0; 820725a820b926575265e6790601a0defd9c30947dcVadim Girlin 821725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side; 822725a820b926575265e6790601a0defd9c30947dcVadim Girlin 823eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) || 824eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin ((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color)); 825eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 826feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 827feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 829076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 830076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 831076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 832f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 833f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 834f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 836076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 837076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 838076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 839076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 85489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 8554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 856f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 8574a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 858f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 86089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 861fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 86284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 8644d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_INPUT] + 1; 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 8664d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 867d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 86897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 86997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 87097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 871d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 8727728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 8738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 8744d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 8758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 877cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 878cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 8795555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 883de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 885cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 887cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 888cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 889cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 890cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 891cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 892cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 893cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 894cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 902725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 903725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_PROPERTY: 904725a820b926575265e6790601a0defd9c30947dcVadim Girlin property = &ctx.parse.FullToken.FullProperty; 90591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (property->Property.PropertyName) { 90691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 907725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (property->u[0].Data == 1) 908725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->fs_write_all = TRUE; 90991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 91091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 91191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (property->u[0].Data == 1) 91291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin shader->vs_prohibit_ucps = TRUE; 91391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 914725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 915725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 916725a820b926575265e6790601a0defd9c30947dcVadim Girlin default: 917725a820b926575265e6790601a0defd9c30947dcVadim Girlin R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 918725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = -EINVAL; 919725a820b926575265e6790601a0defd9c30947dcVadim Girlin goto out_err; 920725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 921725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 922725a820b926575265e6790601a0defd9c30947dcVadim Girlin 923725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (shader->two_side && ctx.colors_used) { 924725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = process_twoside_color_inputs(&ctx))) 925725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 926725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 927725a820b926575265e6790601a0defd9c30947dcVadim Girlin 928725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_init(&ctx.parse, tokens); 929725a820b926575265e6790601a0defd9c30947dcVadim Girlin while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 930725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_token(&ctx.parse); 931725a820b926575265e6790601a0defd9c30947dcVadim Girlin switch (ctx.parse.FullToken.Token.Type) { 932725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_INSTRUCTION: 933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 936be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 937be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 938be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 9407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 9417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 9427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 9437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 9447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 94589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 9467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 94789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 94850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 94950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 95050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 956725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 959eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 960457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 961eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 962eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* clamp color outputs */ 963eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->clamp_color) { 964eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (i = 0; i < noutput; i++) { 965eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->output[i].name == TGSI_SEMANTIC_COLOR || 966eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->output[i].name == TGSI_SEMANTIC_BCOLOR) { 967eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 968eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin int j; 969eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (j = 0; j < 4; j++) { 9704a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 9714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 972eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 973eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* MOV_SAT R, R */ 974eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 975eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.sel = shader->output[i].gpr; 976eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.chan = j; 977eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.write = 1; 978eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.clamp = 1; 979eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].sel = alu.dst.sel; 980eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].chan = j; 981eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 982eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (j == 3) { 983eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.last = 1; 984eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 9854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx.bc, &alu); 986eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (r) 987eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin return r; 988eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 989eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 990eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 991eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 992eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 993543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák /* Add stream outputs. */ 994543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 995543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < so.num_outputs; i++) { 996543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct r600_bytecode_output output; 997543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 998543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (so.output[i].output_buffer >= 4) { 999543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 1000543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák so.output[i].output_buffer); 1001543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = -EINVAL; 1002543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1003543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 10042449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák if (so.output[i].start_component) { 10052449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák R600_ERR("stream_output - start_component cannot be non-zero\n"); 10062449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák r = -EINVAL; 10072449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák goto out_err; 1008543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1009543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1010543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák memset(&output, 0, sizeof(struct r600_bytecode_output)); 1011543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.gpr = shader->output[so.output[i].register_index].gpr; 1012543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.elem_size = 0; 10132449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák output.array_base = so.output[i].dst_offset; 1014543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 1015543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.burst_count = 1; 1016543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.barrier = 1; 1017543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.array_size = 0; 10182449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák output.comp_mask = (1 << so.output[i].num_components) - 1; 1019543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.bc->chip_class >= EVERGREEN) { 1020543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1021543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1022543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 1023543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1024543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1025543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 1026543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1027543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1028543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 1029543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1030543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1031543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 1032543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1033543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1034543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } else { 1035543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1036543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1037543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 1038543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1039543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1040543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 1041543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1042543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1043543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 1044543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1045543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1046543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 1047543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1048543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1049543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1050543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output); 1051543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (r) 1052543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1053543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1054543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1055543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1056eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 1057feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j = 0; 105891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 1059457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 106091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin memset(&output[i+j], 0, sizeof(struct r600_bytecode_output)); 1061feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 1062feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 1063feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 1064feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 1065feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 1066feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 1067feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 1068feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 1069feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 107091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin output[i + j].array_base = i+j - pos0; 1071feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1072457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 107491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (shader->output[i].name) { 107591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_POSITION: 1076feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 60; 1077feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 1079457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 108091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 108191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 108291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 1083feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 1084feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 1085457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 1086457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 108791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 108891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 108991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 109091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin /* array base for enabled OUT_MISC_VEC & CCDIST[0|1]_VEC 109191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin * vectors is allocated sequentially, starting from 61 */ 109291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin output[i + j].array_base = 61 + shader->output[i].sid 109391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin /* +1 if OUT_MISC_VEC is enabled */ 109491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin + shader->vs_out_misc_write 109591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin /* -1 if OUT_CCDIST0_VEC is disabled */ 109691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin - (((shader->clip_dist_write & 0xF) == 0)? 1 : 0); 109791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 109891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin j++; 109991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin pos0++; 110091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin /* duplicate it as PARAM to pass to the pixel shader */ 110191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin memcpy(&output[i+j], &output[i+j-1], sizeof(struct r600_bytecode_output)); 110291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin output[i + j].array_base = i+j-pos0; 110391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 110491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 1109feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid; 1110feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 11114f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 1112feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher for (j = 1; j < shader->nr_cbufs; j++) { 11134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i + j], 0, sizeof(struct r600_bytecode_output)); 1114feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 1115feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 1116feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 1117feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 1118feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 1119feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 1120feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 1121feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 1122feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid + j; 1123feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1124feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1125feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 112660302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák j = shader->nr_cbufs-1; 1127feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 11285f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 1129feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 1130feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 2; 1131feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 7; 1132feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 1133feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 113439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 1135feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 1136feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 7; 1137feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 1138feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 1139feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 1148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 115072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1151457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1152feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher noutput += j; 1153457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 1154457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1155457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 1156457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 1157457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 1158457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 1159457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1160457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 11624a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 1163457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 1164457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 1165a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_x = 7; 1166a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_y = 7; 1167a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_z = 7; 1168a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_w = 7; 11698ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 1170457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 1171457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 1172457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 11737e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1174457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1176c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1177481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 1178481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 11794a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[0], 0, sizeof(struct r600_bytecode_output)); 1180481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 1181481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 1182481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 1183481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 1184481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 1185481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 11868ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 1187481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 1188608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1189481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 1190a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1191481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 1192481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 1193457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 1194457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 119589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 11967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 11977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 11987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 1199457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1200b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 1201b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 1202a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1203c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1204c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1205457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 1206457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 12074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 121289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 12134a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12153b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 1219cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1226f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1227f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 12364a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1237a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1238a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1239a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1240a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1241a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1242a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1243a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1244a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1245a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1246a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1247a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 12484a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1249f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1250f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1251f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1252f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1253f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 12544a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 12553efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 12563efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 12573efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 12583efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 125980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 126080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 126180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 12624a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 12647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12657a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 127047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 127147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 12727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 12737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 12747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1277dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1279dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1280d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1281d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1282dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1283d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1284d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1285d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1286dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1287dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1288dffad730df17983cfaef0808555a8c26cad0aa15Christian König 12899b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1290dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1291dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1293dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1294dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1296d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1297d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1298d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1299d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 13004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 130180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1303d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1304d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 13064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1308d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 13094a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 13104a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 13154a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 13177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 13184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 13197a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 13239b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 13264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1333d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1334d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 13359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1336d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1337d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1338d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1339d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 13409b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 13419b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 13429b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 13439b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 13449b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 13459b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1346d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1347d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1348cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1349cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1350cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1351cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1352cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1353cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1354cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1361cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1362cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1363cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1364cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1365cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1366cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1367cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1372cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1373cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1374cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1375cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1377cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1378cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 13797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 13807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 13817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 13834a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 13847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 13874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 13904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 13947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 13967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13974a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 14037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 140588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 140688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 140788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 140888f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 14091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 141088f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 141196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 141296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 141396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 141496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 141596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 14164a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 14184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1419a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 142088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 142188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 142288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 142388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 142488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 142588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 14264a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 14277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1428921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 142988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1430a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 143196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1432ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 143388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 14344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 143588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 143688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 143788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 14384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1439a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 14407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 144188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 144288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 144388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 144488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 144588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 144688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 144788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 14484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 144988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 145088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 145188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 14524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1453a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 145488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 145588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 145688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 145788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 145888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 145988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 146088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 146188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 14627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1463921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 146488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1465921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1466ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 146796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 146889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1469a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1470a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 147196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 147296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 147396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 147496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 147596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 147696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 147788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 14784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 147988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 148088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 148192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 148292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 148392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 14857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 14867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14874a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 14897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 14907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 14927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 14974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 14997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 15007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 151592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 151692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 151792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15184a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 151992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1520dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 152192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 15221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 152392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 152492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 152588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 15264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 152788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 152888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 152988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 153088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 153188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 153288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 153388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 153488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 15354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 153688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 153788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 153888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 153988f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1540be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1541be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1542be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1543be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 15444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1545a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1546be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1547be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 154880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1549be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 155088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 15514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 155288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 155388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 155488f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 155588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 155688f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 155788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 155892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 155992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 156092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15614a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 15627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 156392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 156457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 156557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 156657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 156757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 15681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 156957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 157057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 157157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 157292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 157392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 157457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 157589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 15767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 15774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 15797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 15827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 15847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 15857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 15887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 15944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 15967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 159792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 15987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 16007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 160557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 160692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 160792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 160857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 160989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 16107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 16114a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 16137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 16157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 16177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 16197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 16207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 16217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 16274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 163057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 16327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 163857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 163992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1640ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1641ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 16424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1643ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1644ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1645ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 164680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1647ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1648ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1649ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1650ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1651ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1652ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 16534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1654ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1655ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1656ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1657ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1658ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1659ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 16604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1661ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1662ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1663ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 166480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1665ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1666ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1667ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1668ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1669ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1670ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 16714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1672ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1673ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1674ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1675ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 167692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 167792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 167892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1679094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1680094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 16814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1682094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1683094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1684094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 16854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1686094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 16874502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1688094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 16894502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1690921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 16914502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 16924502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 16934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 16944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 16954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 16964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 16974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1698094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1699094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1700094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 17014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1702094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1703094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1704094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 17054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 17064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 17074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 17084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1709094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1710094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1711094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 17120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 17130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 17140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17154a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 17160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 17170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1718f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 17194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1720f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 17214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 1722f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1723f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 1724f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1725f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1726f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 1727f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 1728f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1729f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 17304a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1731f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 1732f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 1733f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 17340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 17350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 17366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 17376a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 17387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 17396a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 174089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 17417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 1742f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 17434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1745f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1746f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 1747f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1748f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 17497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 17507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 17517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 17537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 17547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 17597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 1760f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 17614a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1763f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1764f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 17652fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 17662fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 17672fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 17687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 17730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 17746a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 17756a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 17760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 177786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 17784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1779a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 178086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 178186f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 17824a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 17834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 17840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 17850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 17860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 17870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 17880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 17894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 17910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 17920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 179389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 17947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 17957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 17964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 18007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 18027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 18057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 18064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 18124a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 18147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 18167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 18177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1823abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 18248567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 18254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18268567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 18278567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 18288567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 18298567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 18308567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 18314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18328567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 18338567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 18348567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 1835abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 18364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1837abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 18384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1839abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1840abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1841abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1842abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 18434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1844abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1845abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1846abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1847abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 18484a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1849abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1850abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1851abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1852abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1853abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1854abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 18554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1856abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1857abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1858abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 18590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 18600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 18610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 186242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 186342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 186442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 186642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 186742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 18684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1869df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1870df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1871df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1872df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1873df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1874df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1875df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 187642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 18774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 18784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 187942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 188042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 188142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 188242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 18834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 188442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 188542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 188642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 188742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 188842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 188942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1890a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 18917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 18927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18934a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1894a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 18957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 18967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 18974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1899a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 19007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 190180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 19027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 19037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 19047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 19054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 19077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 19087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 19097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 19107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 19117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1912a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1913a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1914a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19154a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1916a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1917a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 19184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1919a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1920a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 19214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 1922a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1923a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1924a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1925a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 19264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1927a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1928a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1929a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1930a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1931a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1932a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 19337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 19347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 19357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 19374a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 19387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 19397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 19414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 19434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 19457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 19537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 19554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 19574a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 19587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 19597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 19607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 19617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 19677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 19684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 19707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 19717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 19737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 19747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 19757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 19807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 19817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 19827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1983a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1984a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 19854a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1986a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1987a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1988a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 19894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1990a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 19914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1992a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1993a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1994a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 19954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1996a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1997a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1998a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 19994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 200066f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 20014a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2002a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 2003a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2004a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2005a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 20064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2007a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2008a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2009a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 20104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2011a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2012a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2013a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2015a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 20164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2017a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2018a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2019a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2020a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2021a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 20224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op) 2023332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{ 2024332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2025332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct r600_bytecode_alu alu; 2026332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int i, r; 2027332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 2028332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp0 = ctx->temp_reg; 2029332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp1 = r600_get_temp(ctx); 20304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin int tmp2 = r600_get_temp(ctx); 20314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 20324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* Unsigned path: 20334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * we need to represent src1 as src2*q + r, where q - quotient, r - remainder 20354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 1. tmp0.x = rcp (src2) = 2^32/src2 + e, where e is rounding error 20374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 2. tmp0.z = lo (tmp0.x * src2) 20384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 3. tmp0.w = -tmp0.z 20394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 4. tmp0.y = hi (tmp0.x * src2) 20404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src2)) 20414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error 20424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 7. tmp1.x = tmp0.x - tmp0.w 20434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 8. tmp1.y = tmp0.x + tmp0.w 20444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) 20454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 10. tmp0.z = hi(tmp0.x * src1) = q 20464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 11. tmp0.y = lo (tmp0.z * src2) = src2*q = src1 - r 20474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 12. tmp0.w = src1 - tmp0.y = r 20494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 13. tmp1.x = tmp0.w >= src2 = r >= src2 (uint comparison) 20504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 14. tmp1.y = src1 >= tmp0.y = r >= 0 (uint comparison) 20514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * if DIV 20534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.z + 1 = q + 1 20554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.z - 1 = q - 1 20564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * else MOD 20584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.w - src2 = r - src2 20604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.w + src2 = r + src2 20614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * endif 20634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 17. tmp1.x = tmp1.x & tmp1.y 20654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z 20674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z 20684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z 20704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20. dst = src2==0 ? MAX_UINT : tmp0.z 20714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Signed path: 20734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Same as unsigned, using abs values of the operands, 20754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * and fixing the sign of the result in the end. 20764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin */ 2077332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2078332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin for (i = 0; i < 4; i++) { 2079332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin if (!(write_mask & (1<<i))) 2080332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin continue; 2081332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 2083332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = -src0 */ 20854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2087332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 20894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 20904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 2091332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2093332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2095332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 20964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 20974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 20984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 20994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = -src1 */ 2101332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2103332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 21054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2106332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2107332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2109332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 21134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 21144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 21154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.z sign bit is set if src0 and src2 signs are different */ 21174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* it will be a sign of the quotient */ 21184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (!mod) { 21194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT); 21224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 21244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 21254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 21264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 21284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2129332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2130332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 21314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 21324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 21334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 21344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = |src0| */ 21364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 21384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 21394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 21414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 21424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 21434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 21454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 21464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 21474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 21484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 21504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2151332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 21524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = |src1| */ 21544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 21564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 21574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 21594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 21604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 21614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 21634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 21644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 21654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 1; 21664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 21684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 21694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 21704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2171332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2172332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 1. tmp0.x = rcp_u (src2) = 2^32/src2 + e, where e is rounding error */ 21744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT); 2176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 21774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 21784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 21794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 21804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 21824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 21834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 21844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 21854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 21864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 21874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 21894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 21904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 21914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 21924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 2. tmp0.z = lo (tmp0.x * src2) */ 2193332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2195332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2196332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp0; 21974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 2198332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2199332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2200332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.src[0].sel = tmp0; 22014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 22024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 22034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 22044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 22054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 22064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 22074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 2208332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 22104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 22114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 22124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 3. tmp0.w = -tmp0.z */ 22144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 22164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 22184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 22194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 22204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 22224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 22234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 22244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 22264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 22274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 22284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 4. tmp0.y = hi (tmp0.x * src2) */ 22304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 22324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 22344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 22354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 22364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 22384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 22394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 22414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 22424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 22434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 22444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2245332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2246332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 22484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2249332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2250332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src)) */ 22524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 22544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2255332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 22574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 22584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 22594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 22614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 22624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 22634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 22644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 22654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 22664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 22684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 22694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 22704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error */ 2272332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2274332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 22764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 22774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 22784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 22804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 22814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 22834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 0; 22844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 22864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 22874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 22884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 22894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 7. tmp1.x = tmp0.x - tmp0.w */ 22904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2292332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2293332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 22944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 2295332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2296332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 22974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 22984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 22994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 23004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 23014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2302332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 23034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2304332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2305332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 23064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 8. tmp1.y = tmp0.x + tmp0.w */ 2307332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 2309332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2310332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 23114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2312332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2313332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 23144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 23154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 23164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 23174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 2318332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2319332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 23204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2321332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2322332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 23234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */ 23244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 23264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2327332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 23284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 23294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 23304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 23314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 23334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 23344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 23354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 23364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 23374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 23384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 23404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 23414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 23424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 10. tmp0.z = hi(tmp0.x * src1) = q */ 2344332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 23464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 23484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 23494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 23504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 23524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 23534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 23554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 23564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 0; 23574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 23584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 23594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 23604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 23624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 23634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 23644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 11. tmp0.y = lo (src2 * tmp0.z) = src2*q = src1 - r */ 23664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 23684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 23704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 23714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 23724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 23744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 23754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 23764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 23774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 23784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 23794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 23814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 23824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 23844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 23854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 23864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 12. tmp0.w = src1 - tmp0.y = r */ 23884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 23904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 23924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 23934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 23944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 23954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 23964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 23974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 23984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 23994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 24004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 24014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 24034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 24044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 24064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 24074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 24084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 13. tmp1.x = tmp0.w >= src2 = r >= src2 */ 24104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 2412332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2413332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 24144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 2415332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2416332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 24184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 24194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 24204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 24214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 24224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 24234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 24244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 2425332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 24274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 24284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 2429332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 14. tmp1.y = src1 >= tmp0.y = r >= 0 */ 24314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 24334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 24354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 24364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 24374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 24394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 24404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 24414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 24424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 24434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 24444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 24464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 24474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 24494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2450332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2451332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { /* UMOD */ 2453332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.w - src2 = r - src2 */ 2455332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2457332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2458332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 24594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 2460332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2461332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 24634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 2464332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 24654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 24664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 24674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 24684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 24694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 24704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 24714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 24734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 24744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 24754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.w + src2 = r + src2 */ 24774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 24794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 24814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 24824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 24834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 24854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 24864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 24874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 24894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 24954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 24964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { /* UDIV */ 24984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 24994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.z + 1 = q + 1 DIV */ 25004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 25024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 25044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 25054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 25064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 25094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.z - 1 = q - 1 */ 25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 25254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT; 25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2529332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2531332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2532332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 17. tmp1.x = tmp1.x & tmp1.y */ 25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT); 25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 2540332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z DIV */ 25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z MOD */ 2552332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2555332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 2559332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = mod ? 3 : 2; 25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */ 25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 2583332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2584332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.src[0].sel = tmp1; 25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 2590332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2593332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2594332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the sign of the result */ 25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { 26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* sign of the remainder is the same as the sign of src0 */ 26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */ 26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the quotient sign (same as the sign of src0*src1) */ 26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */ 26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 2674332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return 0; 2675332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin} 2676332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx) 26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 0); 26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx) 26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 0); 26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx) 26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 1); 26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx) 26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 26944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 1); 26954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 26964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2698a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 2699a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin{ 2700a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2701a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin struct r600_bytecode_alu alu; 2702a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin int i, r; 2703a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 2704a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 2705a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2706a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin for (i = 0; i < 4; i++) { 2707a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (!(write_mask & (1<<i))) 2708a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin continue; 2709a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2710a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2711a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 2712a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2713a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.sel = ctx->temp_reg; 2714a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.chan = i; 2715a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.dst.write = 1; 2716a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2717a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2718a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (i == last_inst) 2719a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.last = 1; 2720a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 2721a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (r) 2722a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return r; 2723a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin } 2724a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2725a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin for (i = 0; i < 4; i++) { 2726a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (!(write_mask & (1<<i))) 2727a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin continue; 2728a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2729a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2730beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin alu.inst = ctx->inst_info->r600_opcode; 2731a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2732a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2733a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2734a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2735a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.src[0].chan = i; 2736a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2737a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (i == last_inst) 2738a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin alu.last = 1; 2739a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 2740a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin if (r) 2741a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return r; 2742a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin } 2743a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 2744a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin return 0; 2745a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin} 2746a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin 27476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 27486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{ 27496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 27506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct r600_bytecode_alu alu; 27516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int i, r; 27526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 27536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 27546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* tmp = -src */ 27566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 27576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 27586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 27596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 27626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.sel = ctx->temp_reg; 27646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.chan = i; 27656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 27666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 27686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 27696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 27716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 27726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 27736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 27746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 27756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 27766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* dst = (src >= 0 ? src : tmp) */ 27786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 27796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 27806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 27816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 27846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.is_op3 = 1; 27856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 27866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 27886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 27906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 27916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].sel = ctx->temp_reg; 27926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].chan = i; 27936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 27946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 27956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 27966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 27976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 27986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 27996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 28006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return 0; 28016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin} 28026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 280342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx) 280442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{ 280542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 280642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct r600_bytecode_alu alu; 280742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int i, r; 280842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 280942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 281042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 281142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* tmp = (src >= 0 ? src : -1) */ 281242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 281342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 281442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 281542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 281642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 281742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 281842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 281942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 282042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.sel = ctx->temp_reg; 282142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.chan = i; 282242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 282342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 282442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 282542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 282642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT; 282742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 282842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 282942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 283042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 283142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 283242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 283342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 283442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 283542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* dst = (tmp > 0 ? 1 : tmp) */ 283642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 283742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 283842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 283942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 284042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 284142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT); 284242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 284342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 284442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 284542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 284642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 284742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].sel = ctx->temp_reg; 284842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].chan = i; 284942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 285042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 285142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 285242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = ctx->temp_reg; 285342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].chan = i; 285442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 285542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 285642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 285742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 285842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 285942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 286042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 286142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return 0; 286242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin} 286342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 28646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 28656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 28660d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 28670d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 28680d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 28694a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2870921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 28710d48925a56ad4fb253386110b545abda82a25464Dave Airlie 28720d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 28730d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 28744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2875a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 28760d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 2877cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 28780d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 2879cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 28800d48925a56ad4fb253386110b545abda82a25464Dave Airlie 28814a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2882921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 28834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 28840d48925a56ad4fb253386110b545abda82a25464Dave Airlie 28850d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 28860d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 28874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28880d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 28890d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 28900d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 28910d48925a56ad4fb253386110b545abda82a25464Dave Airlie 28920d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 28930d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 28944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2895a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 28960d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 289780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 28980d48925a56ad4fb253386110b545abda82a25464Dave Airlie 28990d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 2900cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 29010d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 29020d48925a56ad4fb253386110b545abda82a25464Dave Airlie 2903921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 29040d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 29050d48925a56ad4fb253386110b545abda82a25464Dave Airlie 29060d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 2907cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 29080d48925a56ad4fb253386110b545abda82a25464Dave Airlie 29090d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 29100d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 29114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29120d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 29130d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 29140d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 29150d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 29160d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 29170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 2918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 2919cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 29204a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 2922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 29244a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 2926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 29276c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 2928cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 2929a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 293080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 2933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 2935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 2936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 29374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 2939cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 2940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 2942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 2943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29474a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 2949dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 29517be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 29527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 29537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 29547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 29554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 29584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 29607be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 296180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 2963cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 29657be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 2967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 29684a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 29727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 2973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 2974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2975cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 2976cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 2977cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29784a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2979cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 2980cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 29824a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2984cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 29854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 2986cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2987a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 298880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 2990a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 2991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 2992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 2993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 2994cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 2995921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 2996cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 2997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 2998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 2999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 3000cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 3001921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3005e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 3006e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 3007e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 3008e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 3009e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 3010e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 3011e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 3012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 3013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 30184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 30227be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 30256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 30266415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 30276415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 30286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 30306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 30316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 30326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 30336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 30346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 30356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 30366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 30376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 30396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 30406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 304133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 304233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 304396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 304433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30454a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 30464a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3047641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 304840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 3049bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 3050da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 3051da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 30526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 305378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 305413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 30551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 3056641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 30576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 3058641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 30591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 30601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 30611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 30621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 30631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 30641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 30651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 30661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 30671d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 30681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 306913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 307013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 307113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 307240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 307340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 30744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 307540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 307640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 307740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 307840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 307940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 308040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 308140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 308240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 308340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 308440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 308540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 308640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 308740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 30884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 308940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 30904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 309140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 309240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 309340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 309440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 309540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 30964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 309740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 309840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 309940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 310013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 310140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 310240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 310340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 310440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 310540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 310640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 310740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 310840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 310940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 311040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 311140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 311240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 311340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 311440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 311540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 311640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 31174a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 311840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 311940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 312013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 312113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 31227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 3123b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 312489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 31257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 31267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 31274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 31294a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 31317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 31327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 31337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 31347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 31357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 31367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 31374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 31387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 31397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 31407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 31417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 31427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 31437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 31444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 31464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 31477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 31487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 31497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 31507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 31517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 31524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 31537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 31547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 31557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 31569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 3157b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 31584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3159a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3160b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 31617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 31624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3163b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3164b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3165b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 31664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3168b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3169b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 31704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3171a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3172921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 3173b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 3174b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3175b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 3176b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3177b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 31784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3179b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3180b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 318178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3182b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3184bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3185bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 31860e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 31870e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 3188bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3189bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 3190bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 31914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3192a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 31934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 31944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 3195bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3196bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 3197bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 3198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 3199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 32004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3201bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3202bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3203bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 320689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 32077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 32084a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 32107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 32117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 32127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 32137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 32147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 32157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 32167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 32177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 32187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 32194a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 32207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 32217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 32227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 32237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 32244a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 32267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 32277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 32287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 32297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 32307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 32317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 32327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 32334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 32347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 32357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 32367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 32377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3238bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 3239bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 32407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 3241bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 32424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3243a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3244bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3245bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3246bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3247bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 3248bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3249bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 32507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3251bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3252bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3253a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3255bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 3257bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3258bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 32594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3261bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3262bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 32634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3264a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3265bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3266bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3267bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3268bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 3269bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3270bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 32717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3272bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3273bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3274a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3276bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 3278bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3279bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3280bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 32814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 328578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3286bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 3287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 328978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 3290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 32914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3292a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 32934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3294b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 3297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 32994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3300b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 330378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 33067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3307bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 3308929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 3309929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 33106b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 3311929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 3312929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 3313de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 3314de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 3315de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 3316de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3317de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 3318de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 3319de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3320c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 3321c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 3322c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 3323de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 3324de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 3325de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3326de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 3327de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 332833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 33294a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 3330bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 33316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 33326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 3333077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 3334641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 33356c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 33369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 33379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 33389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 33399d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 334078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 334178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 334278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 334378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 334478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 334578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 334678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 334778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 334878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 334978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 3350244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 335178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 33529a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 3353bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 3354bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 3355bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 3356bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 3357bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 3358bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3359bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 33606b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 33616b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 336201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 336301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 336401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 33656b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 33666b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 3367bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 33681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 33691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 33701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 337169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 3372929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 3373929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 3374929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 3375929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 3376929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 33776b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 3378929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 3379929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 3380929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 338178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 3382929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 3383929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 3384929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 3385929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 3386929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 3387929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 3388929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 3389929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 3390929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 3391929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 3392929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 3393929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 3394929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 3395929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 3396929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 3397929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 3398929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 3399bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 34004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 3401bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3402bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3403bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3404bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 3405bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 340633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 340733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 3408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 3409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 3410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 34114a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3412dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3413b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 3414b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 3415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 3416c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 34171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 3418c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 3419c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3420c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 3421c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 34224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3423c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 34244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 34254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3426c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 342780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3428c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 3429c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 3430c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 3431c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 34324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3433c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 3434c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 3435c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 3436c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 3437c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 3438c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 3439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 3440dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 3441dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3442dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 3443dffad730df17983cfaef0808555a8c26cad0aa15Christian König 34444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3445a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 3446921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 3447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 34484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 3450b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 3451b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 3452dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 3453b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 3454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 3455b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 34564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3457b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 3458b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 3459b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 3460b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 3461b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 3462dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 3463dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3464dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 3465dffad730df17983cfaef0808555a8c26cad0aa15Christian König 34664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3467a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 3469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 34704a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3471b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 3472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 3473dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 3474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 3475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 3476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 34774a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3478b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 3479b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 3480b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 3481b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 3482b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 3483dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 3484dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3485dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 3486dffad730df17983cfaef0808555a8c26cad0aa15Christian König 34874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3488a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 34904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 34914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 3492b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 3493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 3494dffad730df17983cfaef0808555a8c26cad0aa15Christian König 349580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 3497dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 3498b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 3499b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 35004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3501b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 3502b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 3503b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 3504dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 3505b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 3506b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 350787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 350887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 350987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 351187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 3512dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 351387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 35147be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 35157be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 35167be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 351787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 35184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3519a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 35204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 35214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 35224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 352380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 352487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 352587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 352687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 35277be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 352887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 35294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 353087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 353187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 35327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 353387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 353487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 353587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 35360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 35370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 35380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35390e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 35400e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 35414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 35420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 35430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 35440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 35460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 35470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 35494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3550a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 35510e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 35524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 35534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 35540e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 35550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 35560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 35570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 35580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 35590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 35600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 35620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 35630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 35640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 35660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 35674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 35680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 35690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 35700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 35710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 35734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3574a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 35750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35760e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 35774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 35784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 35790e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 35800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 35810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 35820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 35830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 35840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 35850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 35870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 35880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 35890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 35900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 35910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 359280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 359380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 35940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 35950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 35960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 35970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 35980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 35994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 36010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 36020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 36030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 36040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 36050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 36060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 36070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 360836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 360936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 361036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36114a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 361209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 36137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 361436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 361536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 361636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 36174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 361836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 3619a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 36204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 362136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 362236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 362336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 362436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 362536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 36264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 362736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 362836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 362936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 363089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 36317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 36327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 36337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 36347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 363536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 36367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 36377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 36387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 36397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 36407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 36417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 36424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 36447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 36457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 36554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 36587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 365936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 36607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 366136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 366236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 36634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 366436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 3665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 36664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 366736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 366836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 3669b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 3670b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3671b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 3672b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 3673b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 367436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 367536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 367636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 367736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 367836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 36794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 368036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 368136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 368236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 368336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 368436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 368536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 368689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 36877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 36884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 36904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 369136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 36957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 369836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 36994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 37027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 37044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 37064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 370736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 37157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 371836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 371936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 372036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 372136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 37224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 372336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 3724a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 372536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 372636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 372736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 372836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 372936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 373036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 373136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 37324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 373336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 373436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 373536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 373636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 373736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 373887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 3739460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 3740460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 3741460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3743460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 37447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 3745460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3746f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 3747460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 374889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 37504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3751460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 37534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 37544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 37624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 3766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 37684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 37697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 37714a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 37724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 37784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 3782460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3783460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 3784460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 3785460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 3786460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3787460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3788460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 3789460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3790460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3791460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 37924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3793460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3794460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3795460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3796460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3797f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 3798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 3799460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 380089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 380396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 38054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 38064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 380796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 38117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 38204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 38234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 38244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 38287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 383596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 383796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 383896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 383996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 384096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 384196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 384296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 384396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 384496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 384596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 384696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 384896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 384996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 385096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 385189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38534a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 386496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 38704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 387496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 387996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 38804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 388496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 388589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 39044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 39067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 390896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 391396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 39144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 391896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 39194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 392096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 392196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 392296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 39234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 39244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 392596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 392696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 392796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 3928460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3929460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3930460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 3931460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3932460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3933460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 39344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3935460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3936460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3937460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3938460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3939f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 3940460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 394189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 39427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 39434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3944460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 39464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 39474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 3948460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 3955460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 39564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 39614a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 39637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 39644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 39654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 39667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 39677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 39707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 39717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 39724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 3976460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3977460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3978460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 3979460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 39804a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3981460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3982460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3983460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 3984460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 3985460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3986460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 3987460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 3988460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 3989460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 3990460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 39914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3992460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 3993460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 3994460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 3995460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 3996460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 3997460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 3998460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 399998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 400098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 400198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 40024a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 400398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 4004a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 40054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 400698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 400752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 400852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 400952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 401052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 401152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 401252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 401352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 40149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 40158e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 40169b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 401752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 401852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 401952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 402052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 402152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 40228e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 402398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 40248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 40258e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 40264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 402798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 402898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 40298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 40308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 403198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 403298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 403398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 403447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 403547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 40364a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 403747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 4038a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 40397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 40407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 4041077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 40434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 40448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4045077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4046077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4047077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 40484a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 4050077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 4051077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4052077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 40538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 40548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4055077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 40584a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 40607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 40617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 4062077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4063077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 40644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 40658e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4066077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4067077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4068077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 40694a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4070077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 40717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 40729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 40738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 40748e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 40758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 40768e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 40778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 40788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 40798e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 40808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 40818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 40829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 40837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 40847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 40857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 40867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 40877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 40888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 408947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 409047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 409147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 409257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 409357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 409457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 40954a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 409657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 409757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 409857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 40994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 410057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4101a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 410280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 41037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 41047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 410557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 410657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 41074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 410857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 410957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4110a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 411157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 411257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 41134a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 411457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 411557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 411657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 41174a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 411857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 411957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 412057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 412157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 412257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 412357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4124a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 4125a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 41264a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 4128a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 41294a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4130a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 4131a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 4132a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4133a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 4134a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 4135a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 4136a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 41374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4138a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 4139a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 41407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4141a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 4142a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 41434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 4144a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 4145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 4146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 4150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 41512bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 41522bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 41532bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 41542bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 41552bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 41564f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 41572bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 41584f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 41592bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 41602bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 41612bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 41622bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 41634f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 41642bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 41652bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 41664f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 41672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 41682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 41692bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 41702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 41712bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 41722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 41732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 41744a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 41758813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 41768813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 41778813842121d46d1be476807c98b0ba0b771f0c91Christian König } 41782bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 4179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4180a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4181a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 418209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 4183a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 418409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 418509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 418609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 418709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 418809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 418909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 419009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 419109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 419209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 419309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 419409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 419509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 419609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 419709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4198a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 419909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 420009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 420109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 420209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 420309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 420409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 420509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 420609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 420709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 420809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 420909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 4210a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 4211a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 4212a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 421309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 421409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 421509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 421609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 421709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 421809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 421909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 42207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 422109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 422209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 422309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 422409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 422509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 422609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 422709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 422809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 422909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 423009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 423109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 423209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 423309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 423409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 423509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 423609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 423709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 423809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 423909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 424009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 424109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 424209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 424309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 424409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 42454a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 42464a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 424709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 424809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 424909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4250a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 425109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 425209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 4253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 425409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 425509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 425609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 425709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 425809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 425909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 426009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 426109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 426209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 426309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 426409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 426509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 426609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 426709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 426809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 426909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 427009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 427109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 427209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 427309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 42744f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 427509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 427609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 427709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 427809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 427909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 428009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 42814f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 428209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 428309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 428409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 428509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4286a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 428709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 428809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 428909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 429009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 429109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 429209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 429309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 42947ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 429509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 429609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 429709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 429809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 429909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 430009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 430109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 430209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 430309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 430409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 430509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 430609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 430709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 430809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 430909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 43104a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 431109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 431209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 431309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 431409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 431509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 431609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 431709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 431809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 431909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 432009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 43218b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 432209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 43234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 432409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 432509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 432609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 432709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 4328a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4329a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4330a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4331a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 4332a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 43334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 4334a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 4335a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 433609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 4337a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 4338a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4339a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4340a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4341a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 4342a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 4343a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 4344a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 4345a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 4346a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 4347a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 4348a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4349a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 4350a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 4351a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 4352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 435309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 4354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 435509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 435609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 435709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 435809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 435909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 436009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 436109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 436209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 43634a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 436409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 436509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 4366a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 436709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 436809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 436909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 437009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 437109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 437209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 437309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 437409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 437509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 43764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 437709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 437809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 437909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 438009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 438109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 438209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 438309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 438409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 438509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 438609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 438709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 438809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 438909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 439009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 439109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 439209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 439309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 439409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 439509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 439609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 439709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 439809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 439909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 440009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 440109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 440209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 440309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 440409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 440509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 440609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 440709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 440809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 440909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 441009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 441109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 441209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 441309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 441409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 441509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 44164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 441709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 441809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 441909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 442009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 442109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 442209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 4423a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4425a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 4427cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 4428cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 4429cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 4430cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 4431cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4432cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4433cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 4434cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 4435cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4436cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 4437cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4438cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4439cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4440cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 4441cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 4442cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 4443cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4444c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 4445cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 4446cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 4447cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 4448cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 44499b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 4450cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 4451cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 4452cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 4453cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 4454cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4455cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4456cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 4457cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 4459cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4462cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4463c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 4464cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4465cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 4466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 4467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 4470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 4471cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 4472cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 4473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 4474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 4475cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 4476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 4477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 4478cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 4479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 448098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 4481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 44820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 4483df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 4484df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 4485df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 4486df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 4487df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 4488df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 4489df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 449042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 449136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 4492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 4493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 4494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 4495cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 4496cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 449757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 4498dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 4499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 4500d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 4501be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 4502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 4503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 4504b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 4505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45123af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 4513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45143af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 4515df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 45167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 45174558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 4518a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 45190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 4520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45227a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 4523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4524e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 452588f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 45263af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 45273af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 45284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 4529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45340d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 4535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45360d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 453788f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 4538d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 45390d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 4540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4541b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 454213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 4543b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 4544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45509f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 4551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45540d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 455587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 455692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 4557c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 4558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 4561ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 456209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 4563a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 4564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4567a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 4568a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 4569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4575c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 4576cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 45770ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 4578d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans}, 4579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4581c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 4582c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 45834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 4584cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 4585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 45861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 45871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 458809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 4589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 459109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 4592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 459309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 4594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4610094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 4611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 4612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 4613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4614bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 4615332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 4616c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 4617c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 46185893e686b691013525cb2608c3d605be2d8ea471Dave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 4619c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 4620d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans}, 46210196433ce55b7e005c483bd7c411844eb44e983bDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 4622c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 46239a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 4624c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 46254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 4626c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 4627c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 4628c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 46294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 4630850021f225f312d55fb6a24a8cef805f527510afDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 4631c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 4632c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 4633d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans}, 46347383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 4635c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 4636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4640cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 4641cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 4642cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 4643cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 4644cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 4645cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 4646cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 4647cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 4648cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 4649cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 4650cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 4651cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 46529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 46539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 46546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 465542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 4656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 465850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 465950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 466098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 466150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 466250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 466350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 46648ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 466550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 4666112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 466750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 466850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 466950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 467050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 467150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 467250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 467350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 467450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 467550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 467650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 467750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 467850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 467950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 468150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 468450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 468750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 468850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 4689df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 469050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 469150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 469250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 469350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 469450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 469550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 469650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 469750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 469850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 469950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 470050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 470150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 470250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 470350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 470450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 470550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 470650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 470750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 470850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 470950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 471050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 471150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 471250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 471350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 471450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 471550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 471613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 471750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 471850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 47257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 47297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 47307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 4731c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 47327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 47357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 47367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 47377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 47387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 47427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 47437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4749608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 4750cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 47517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 4752d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 47537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4755cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 4756cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 47574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 4758cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 47597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 47611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 47627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 47637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 47667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 47687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 47847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 47857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 47867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 47877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4788a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 4789332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 4790cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 4791cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 4792cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 4793cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 4794d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 4795cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 4796beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 4797b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 4798cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 47994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 4800cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 4801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 4802cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 48034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 48049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 4805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 4806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 4807d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 48087383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 4809cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 48107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4814cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 4815cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 4816cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 4817cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 4818cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 4819cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 4820cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 4821cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 4822cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 4823cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 4824cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 4825cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 48269b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 48279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 48286b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 482942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 48307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 48327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 48337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 48347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 48357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 48367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 48377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 48387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 48397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 48407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 48417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 48427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 48437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 48447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 48457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 48467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 48477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 48487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 48497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 48507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 48517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 48527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 48537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 48557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 48587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 48617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 4863df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 48647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 48657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 48667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 48677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 48687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 48697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 48717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 48737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 48747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 48757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 48767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 48777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 48837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 48857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 48867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 48877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 48887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 48897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 489013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 48917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 48927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 489852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 489950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 490050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 490150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 490250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 490350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 490450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 4905c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 490650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 490750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 490850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 4909ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 491050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 491150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 491250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 491350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 491450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 491550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 491650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 491750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 491850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 491950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4924cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 49250ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 492650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 492850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 492950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 493050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 493150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4932cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 493350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 49341d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 49351d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 493650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 493750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 493850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 493950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 494050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 494250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 494450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 494950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 495050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 495850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 495950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 496050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 496150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 496250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 496350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4964cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 4965cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 496650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 496750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 496850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 496950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 497950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 498750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 4988cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 4989cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 4990cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 4991cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 4992cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 4993cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 4994cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 4995cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 4996cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 4997cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 4998cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 4999cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 50009b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, 0, tgsi_unsupported}, 50019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 500250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 500350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 5004