r600_shader.c revision 4acf71f01ea1edb253cd38cc059d4af1a2a40bf4
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 "r600_sq.h" 24ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "r600_llvm.h" 25077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h" 26a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 28330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák 29ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "pipe/p_shader_tokens.h" 30330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_info.h" 31330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_parse.h" 32330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_scan.h" 33330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_dump.h" 34ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "util/u_memory.h" 35ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#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{ 62e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_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 } 740a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->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 } 820a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák rctx->ws->buffer_unmap(shader->bo->cs_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 106e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_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; 111e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1124acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct r600_pipe_shader_selector *sel = shader->selector; 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse 115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* Would like some magic "get_bool_option_once" routine. 116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse */ 117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (dump_shaders == -1) 118c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 121052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 1224acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin tgsi_dump(sel->tokens, 0); 123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1244acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin if (sel->so.num_outputs) { 125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák unsigned i; 126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák fprintf(stderr, "STREAMOUT\n"); 1274acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin for (i = 0; i < sel->so.num_outputs; i++) { 1284acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin unsigned mask = ((1 << sel->so.output[i].num_components) - 1) << 1294acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin sel->so.output[i].start_component; 130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák fprintf(stderr, " %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i, 1314acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin sel->so.output[i].output_buffer, sel->so.output[i].register_index, 1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák mask & 1 ? "x" : "_", 1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 1) & 1 ? "y" : "_", 1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 2) & 1 ? "z" : "_", 1352449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák (mask >> 3) & 1 ? "w" : "_"); 136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 137543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 138052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 139eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin r = r600_shader_from_tgsi(rctx, shader); 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_build(&shader->shader.bc); 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 149052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 1504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_dump(&shader->shader.bc); 151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 153afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse 15669251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 1586101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL); 1594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_clear(&shader->shader.bc); 160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 1652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 167a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 18478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák struct r600_bytecode *bc; 1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 18640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy struct r600_shader_src src[4]; 18778293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t *literals; 18878293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t nliterals; 18978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t max_driver_temp_used; 190fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 195725a820b926575265e6790601a0defd9c30947dcVadim Girlin int face_gpr; 196725a820b926575265e6790601a0defd9c30947dcVadim Girlin int colors_used; 19754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin boolean clip_vertex_write; 19854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin unsigned cv_output; 199c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin int fragcoord_input; 200951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin int native_integers; 2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 21142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 212ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only); 213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type); 214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_else(struct r600_shader_ctx *ctx); 215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endif(struct r600_shader_ctx *ctx); 216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx); 217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endloop(struct r600_shader_ctx *ctx); 218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx); 219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* 221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * bytestream -> r600 shader 222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * 223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * These functions are used to transform the output of the LLVM backend into 224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * struct r600_bytecode. 225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard */ 226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 2276a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 2286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak unsigned char * bytes, unsigned num_bytes); 2296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL 2316a829a1b724ca0d960decee217d260b4de8a5463Adam Rakint r600_compute_shader_create(struct pipe_context * ctx, 2326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak LLVMModuleRef mod, struct r600_bytecode * bytecode) 2336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{ 2346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct r600_context *r600_ctx = (struct r600_context *)ctx; 2356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak unsigned char * bytes; 2366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak unsigned byte_count; 2376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak struct r600_shader_ctx shader_ctx; 2386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak unsigned dump = 0; 2396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 2416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak dump = 1; 2426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak r600_llvm_compile(mod, &bytes, &byte_count, r600_ctx->family , dump); 2456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak shader_ctx.bc = bytecode; 2466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak r600_bytecode_init(shader_ctx.bc, r600_ctx->chip_class, r600_ctx->family); 2476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak shader_ctx.bc->type = TGSI_PROCESSOR_COMPUTE; 2486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak r600_bytecode_from_byte_stream(&shader_ctx, bytes, byte_count); 2490c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard if (shader_ctx.bc->chip_class == CAYMAN) { 2500c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard cm_bytecode_add_cf_end(shader_ctx.bc); 2510c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard } 2526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak r600_bytecode_build(shader_ctx.bc); 2536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak if (dump) { 2546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak r600_bytecode_dump(shader_ctx.bc); 2556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 2566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return 1; 2576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak} 2586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 2596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif /* HAVE_OPENCL */ 2606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes, 262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx) 263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned i; 265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned sel0, sel1; 266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard sel0 = bytes[bytes_read++]; 267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard sel1 = bytes[bytes_read++]; 268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].sel = sel0 | (sel1 << 8); 269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].chan = bytes[bytes_read++]; 270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].neg = bytes[bytes_read++]; 271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].abs = bytes[bytes_read++]; 272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].rel = bytes[bytes_read++]; 273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].kc_bank = bytes[bytes_read++]; 274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard for (i = 0; i < 4; i++) { 275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8); 276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx, 281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned src_idx; 284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned inst0, inst1; 285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard for(src_idx = 0; src_idx < 3; src_idx++) { 288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, 289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &alu, src_idx); 290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.sel = bytes[bytes_read++]; 293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.chan = bytes[bytes_read++]; 294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.clamp = bytes[bytes_read++]; 295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.write = bytes[bytes_read++]; 296ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.rel = bytes[bytes_read++]; 297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst0 = bytes[bytes_read++]; 298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst1 = bytes[bytes_read++]; 299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.inst = inst0 | (inst1 << 8); 300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.last = bytes[bytes_read++]; 301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.is_op3 = bytes[bytes_read++]; 302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.predicate = bytes[bytes_read++]; 303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle = bytes[bytes_read++]; 304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle_force = bytes[bytes_read++]; 305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.omod = bytes[bytes_read++]; 306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.index_mode = bytes[bytes_read++]; 307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_alu(ctx->bc, &alu); 308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Handle other KILL instructions */ 310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) { 311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->shader->uses_kill = 1; 312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: This should be enforced in the LLVM backend. */ 313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->bc->force_add_cf = 1; 314ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 315ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu, 319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned pred_inst) 320ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 321ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->inst = pred_inst; 322ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->predicate = 1; 323b4789860c4416ba700ac5edeb692b59e33d45276Tom Stellard alu->dst.write = 0; 324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[1].sel = V_SQ_ALU_SRC_0; 325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[1].chan = 0; 326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->last = 1; 327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_alu_type(ctx->bc, alu, 328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 329ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 330ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 331ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fc_pushlevel(ctx, FC_IF); 332ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard callstack_check_depth(ctx, FC_PUSH_VPM, 0); 333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 334ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx, 336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu *alu, unsigned compare_opcode) 337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_BRK; 339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) 340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; 341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else if (ctx->bc->chip_class >= EVERGREEN) 342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; 343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else 344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; 345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, alu, compare_opcode); 346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_endif(ctx); 348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, 351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned inst; 355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0); 357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst = bytes[bytes_read++]; 358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst) { 359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 0: 360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, &alu, 361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 1: 364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_else(ctx); 365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 2: 367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_endif(ctx); 368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 3: 370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_bgnloop(ctx); 371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 4: 373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_endloop(ctx); 374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 5: 376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_break_from_byte_stream(ctx, &alu, 377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE)); 378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 6: 380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_break_from_byte_stream(ctx, &alu, 381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 382ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 7: 384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard { 385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_CONT; 386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) { 387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 388ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &cm_shader_tgsi_instruction[opcode]; 389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else if (ctx->bc->chip_class >= EVERGREEN) { 390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 391ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &eg_shader_tgsi_instruction[opcode]; 392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 393ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &r600_shader_tgsi_instruction[opcode]; 395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 396ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 397ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 39918617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard case 8: 40018617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard r600_break_from_byte_stream(ctx, &alu, 40118617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 40218617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard break; 403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx, 409ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 410ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_tex tex; 412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.inst = bytes[bytes_read++]; 414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.resource_id = bytes[bytes_read++]; 415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_gpr = bytes[bytes_read++]; 416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_rel = bytes[bytes_read++]; 417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_gpr = bytes[bytes_read++]; 418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_rel = bytes[bytes_read++]; 419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_x = bytes[bytes_read++]; 420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_y = bytes[bytes_read++]; 421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_z = bytes[bytes_read++]; 422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_w = bytes[bytes_read++]; 423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.lod_bias = bytes[bytes_read++]; 424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_x = bytes[bytes_read++]; 425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_y = bytes[bytes_read++]; 426ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_z = bytes[bytes_read++]; 427ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_w = bytes[bytes_read++]; 428ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_x = bytes[bytes_read++]; 429ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_y = bytes[bytes_read++]; 430ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_z = bytes[bytes_read++]; 431ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.sampler_id = bytes[bytes_read++]; 432ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_x = bytes[bytes_read++]; 433ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_y = bytes[bytes_read++]; 434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_z = bytes[bytes_read++]; 435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_w = bytes[bytes_read++]; 436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_tex(ctx->bc, &tex); 438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 442e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx, 443e42df8e10a83e76565474f82330d34403da71b49Tom Stellard unsigned char * bytes, unsigned bytes_read) 444e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{ 445e42df8e10a83e76565474f82330d34403da71b49Tom Stellard struct r600_bytecode_vtx vtx; 446e42df8e10a83e76565474f82330d34403da71b49Tom Stellard memset(&vtx, 0, sizeof(vtx)); 447e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.inst = bytes[bytes_read++]; 448e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.fetch_type = bytes[bytes_read++]; 449e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.buffer_id = bytes[bytes_read++]; 450e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.src_gpr = bytes[bytes_read++]; 451e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.src_sel_x = bytes[bytes_read++]; 452e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.mega_fetch_count = bytes[bytes_read++]; 453e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.dst_gpr = bytes[bytes_read++]; 454e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.dst_sel_x = bytes[bytes_read++]; 455e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.dst_sel_y = bytes[bytes_read++]; 456e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.dst_sel_z = bytes[bytes_read++]; 457e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.dst_sel_w = bytes[bytes_read++]; 458e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.use_const_fields = bytes[bytes_read++]; 459e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.data_format = bytes[bytes_read++]; 460e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.num_format_all = bytes[bytes_read++]; 461e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.format_comp_all = bytes[bytes_read++]; 462e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.srf_mode_all = bytes[bytes_read++]; 463c108831d4451f624167d2c433282c6ac63541a79Tom Stellard /* offset is 2 bytes wide */ 464e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.offset = bytes[bytes_read++]; 4655cd6ce939d1158d0ee3dd376e2c95aeff49c6e27Tom Stellard vtx.offset |= (bytes[bytes_read++] << 8); 466e42df8e10a83e76565474f82330d34403da71b49Tom Stellard vtx.endian = bytes[bytes_read++]; 467e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 468e42df8e10a83e76565474f82330d34403da71b49Tom Stellard if (r600_bytecode_add_vtx(ctx->bc, &vtx)) { 469e42df8e10a83e76565474f82330d34403da71b49Tom Stellard fprintf(stderr, "Error adding vtx\n"); 470e42df8e10a83e76565474f82330d34403da71b49Tom Stellard } 471e42df8e10a83e76565474f82330d34403da71b49Tom Stellard /* Use the Texture Cache */ 472e42df8e10a83e76565474f82330d34403da71b49Tom Stellard ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX; 473e42df8e10a83e76565474f82330d34403da71b49Tom Stellard return bytes_read; 474e42df8e10a83e76565474f82330d34403da71b49Tom Stellard} 475e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 476ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 477ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned num_bytes) 478ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 479ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned bytes_read = 0; 4806f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard unsigned i, byte; 481ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard while (bytes_read < num_bytes) { 482ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard char inst_type = bytes[bytes_read++]; 483ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst_type) { 484ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 0: 485ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_alu_from_byte_stream(ctx, bytes, 486ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 487ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 488ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 1: 489ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_tex_from_byte_stream(ctx, bytes, 490ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 491ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 492ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 2: 493ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_fc_from_byte_stream(ctx, bytes, 494ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 495ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 4966f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard case 3: 4976f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE); 4986f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (i = 0; i < 2; i++) { 4996f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (byte = 0 ; byte < 4; byte++) { 5006f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard ctx->bc->cf_last->isa[i] |= 5016f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard (bytes[bytes_read++] << (byte * 8)); 5026f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5036f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5046f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard break; 505e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 506e42df8e10a83e76565474f82330d34403da71b49Tom Stellard case 4: 507e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read = r600_vtx_from_byte_stream(ctx, bytes, 508e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read); 509e42df8e10a83e76565474f82330d34403da71b49Tom Stellard break; 510ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard default: 511ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Error here */ 512ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 513ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 514ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 515ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/ 518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 52772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 531c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 532a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 53672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 537a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 5398260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 5408260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 5418260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 54647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 54747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 55272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 55372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 55550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 55650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 5574a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 5777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 58150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 58250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 5834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 586738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW; 58750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 588738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY; 58950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 59050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 59250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 59350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 59450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 59550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 60150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 60250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 60350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 60450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 6054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 60650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 60750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 60850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 60950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 6107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 6117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 61221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 61321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 61421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 61521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 61621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 61721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 61821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 61921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 620738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0; 62121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 62221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 62321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 62421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 62521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 62621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 62721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 62821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 62921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 63021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 63121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 63221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 63321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 63421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 63521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 63621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 63721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 6387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 6390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 6400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 6410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 6430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 6440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 6450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 6460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 6480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 6490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 6500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 6510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 6520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 6530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 6540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 6550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 6560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 6590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 6600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 6610a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6620a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 6630a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 6640a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 6650a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 6660a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 6670a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 6680a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 6690a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6700a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 6715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 6725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 6735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 6745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 6755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 6765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 6775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 6785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 6795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 6805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 6815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 6825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 6835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 6845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 6855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 6865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 6875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 6885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 6895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 6905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 6915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 6925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 6935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 6945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 6955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 6965b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 6975b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 6985b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 6995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 7015b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 7025b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 703725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */ 704725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) 705725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 706725a820b926575265e6790601a0defd9c30947dcVadim Girlin int r = 0; 707725a820b926575265e6790601a0defd9c30947dcVadim Girlin 708725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].spi_sid) { 709725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[index].lds_pos = ctx->shader->nlds++; 710725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].interpolate > 0) { 711725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_alu(ctx, index); 712725a820b926575265e6790601a0defd9c30947dcVadim Girlin } else { 713725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_flat(ctx, index); 714725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 715725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 716725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 717725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 718725a820b926575265e6790601a0defd9c30947dcVadim Girlin 719725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back) 720725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 721725a820b926575265e6790601a0defd9c30947dcVadim Girlin struct r600_bytecode_alu alu; 722725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r; 723725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_front = ctx->shader->input[front].gpr; 724725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_back = ctx->shader->input[back].gpr; 725725a820b926575265e6790601a0defd9c30947dcVadim Girlin 726725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < 4; i++) { 727725a820b926575265e6790601a0defd9c30947dcVadim Girlin memset(&alu, 0, sizeof(alu)); 728725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 729725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.is_op3 = 1; 730725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.write = 1; 731725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.sel = gpr_front; 732725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[0].sel = ctx->face_gpr; 733725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].sel = gpr_front; 734725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].sel = gpr_back; 735725a820b926575265e6790601a0defd9c30947dcVadim Girlin 736725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.chan = i; 737725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].chan = i; 738725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].chan = i; 739725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.last = (i==3); 740725a820b926575265e6790601a0defd9c30947dcVadim Girlin 741725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 742725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 743725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 744725a820b926575265e6790601a0defd9c30947dcVadim Girlin 745725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 746725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 747725a820b926575265e6790601a0defd9c30947dcVadim Girlin 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 74972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 75296bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 75372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 7595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 7601279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].interpolate = d->Interp.Interpolate; 7611279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].centroid = d->Interp.Centroid; 762024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 763725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 764c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin switch (ctx->shader->input[i].name) { 765c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_FACE: 766725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 767c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 768c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_COLOR: 769725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->colors_used++; 770c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 771c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_POSITION: 772c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx->fragcoord_input = i; 773c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 774c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 775725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 776c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if ((r = evergreen_interp_input(ctx, i))) 777725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 778fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 77950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 7855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 786024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 7871279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->output[i].interpolate = d->Interp.Interpolate; 78891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->output[i].write_mask = d->Declaration.UsageMask; 78991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (ctx->type == TGSI_PROCESSOR_VERTEX) { 79091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (d->Semantic.Name) { 79191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 79291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2); 79391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 79491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 79591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->vs_out_misc_write = 1; 796e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák ctx->shader->vs_out_point_size = 1; 79791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 79854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 79954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->clip_vertex_write = TRUE; 80054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->cv_output = i; 80154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 80291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 80391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 80733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 80847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 81096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 811c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 812c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 813951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if (!ctx->native_integers) { 814951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin struct r600_bytecode_alu alu; 815951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 81696bbc627f369c0100b950f81531b1fe9ef586c34Christian König 817951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 818951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].sel = 0; 819951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].chan = 3; 82096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 821951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.sel = 0; 822951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.chan = 3; 823951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.write = 1; 824951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.last = 1; 82596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 826951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 827951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin return r; 828951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin } 829c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 83039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 83139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie break; 832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 83772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 83872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 839be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 840be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 841be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 842be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 843be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 8447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 845fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 846fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 847fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 848fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 849fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 850fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 851fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 852fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 853fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 854fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 855fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 856fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 857fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 858fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 859fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 860fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 861fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 862fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 863fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 864fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 865fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 866fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 867fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 868fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 869fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 870fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 871fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 872fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 873fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 874fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 875fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 876fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 877fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 878fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 879fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 880fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 881fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 882fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 883fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 884fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 885fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 886fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 887370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */ 888fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 889fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 890fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 8911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 8921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 8931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 8941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 8951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 8961fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 8971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 8981fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 8991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 9001fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 9011fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 90296bbc627f369c0100b950f81531b1fe9ef586c34Christian König 9031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 9041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 9051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 9061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 9071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 9081fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 9091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 9104a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 9111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 9121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 9131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 9151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 9161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 91796bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 91839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 91939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 3; 92039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 3; 92139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 3; 92239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 3; 92339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 92439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 92539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 0; 92639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 0; 92739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 0; 92839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 0; 92939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 93039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } 931c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 9331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 9361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 939077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 940077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 9414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 942077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 943077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 944077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 945077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 9464a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 947077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 948077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 949077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 950077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 9518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 952077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 953077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 954077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 955077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 956077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 957077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 958077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 959077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 9604a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 961077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 962077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 963077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 964077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 9658e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 966077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 967077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 968077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 969077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 972077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 973077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 976077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 981d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 9834a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 987077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 9897687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 9907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 9917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 9937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 9947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 9957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 9967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 9977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 9987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 9997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 10007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1006077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1011077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 10157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 10167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 10174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 10187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 10197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 10207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 10217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 10227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 10237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 10257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 10274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 10327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 10337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 10347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 10377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 10387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 10407687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 10417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 10427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10434a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 10447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 10477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 10497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 10527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 10547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 10554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 10567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 10577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 10587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 10597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 10607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 10637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 10654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 1076725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx) 1077725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 1078725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r, count = ctx->shader->ninput; 1079725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1080725a820b926575265e6790601a0defd9c30947dcVadim Girlin /* additional inputs will be allocated right after the existing inputs, 1081725a820b926575265e6790601a0defd9c30947dcVadim Girlin * we won't need them after the color selection, so we don't need to 1082725a820b926575265e6790601a0defd9c30947dcVadim Girlin * reserve these gprs for the rest of the shader code and to adjust 1083725a820b926575265e6790601a0defd9c30947dcVadim Girlin * output offsets etc. */ 1084725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr = ctx->file_offset[TGSI_FILE_INPUT] + 1085725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->info.file_max[TGSI_FILE_INPUT] + 1; 1086725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1087725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->face_gpr == -1) { 1088725a820b926575265e6790601a0defd9c30947dcVadim Girlin i = ctx->shader->ninput++; 1089725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].name = TGSI_SEMANTIC_FACE; 1090725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].spi_sid = 0; 1091725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].gpr = gpr++; 1092725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 1093725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1094725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1095725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < count; i++) { 1096725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) { 1097725a820b926575265e6790601a0defd9c30947dcVadim Girlin int ni = ctx->shader->ninput++; 1098725a820b926575265e6790601a0defd9c30947dcVadim Girlin memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io)); 1099725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR; 1100725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]); 1101725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].gpr = gpr++; 1102725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1103725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 1104725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_input(ctx, ni); 1105725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1106725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1107725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1108725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1109725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = select_twoside_color(ctx, i, ni); 1110725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1111725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1113725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 1116725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1117e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader) 111872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1119eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 11204acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct tgsi_token *tokens = pipeshader->selector->tokens; 11214acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct pipe_stream_output_info so = pipeshader->selector->so; 1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 11235555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 1124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 11254a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 1126457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 112854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int i, j, k, r = 0; 112954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0; 1130ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Declarations used by llvm code */ 1131ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bool use_llvm = false; 11327f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned char * inst_bytes = NULL; 11337f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned inst_byte_count = 0; 113472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1135ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1136ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = debug_get_bool_option("R600_LLVM", TRUE); 1137ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 1140951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin ctx.native_integers = (rctx->screen->glsl_feature_level >= 130); 1141951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin 1142c96b9834032952492efbd2d1f5511fe225704918Dave Airlie r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family); 1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 1148f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.face_gpr = -1; 1151c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx.fragcoord_input = -1; 1152725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.colors_used = 0; 115354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx.clip_vertex_write = 0; 1154725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1155725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side; 1156feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 1157feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 1159076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 1160076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 1161076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 1162f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 1163f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 1164f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 1165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 1166076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 1167076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 1168076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 1169076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 1176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 1177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 118489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 11854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1186f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 11874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1188f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 119089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 1191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 119284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 1193ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1194ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* LLVM backend setup */ 1195ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1196ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm && ctx.info.indirect_files) { 1197ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "Warning: R600 LLVM backend does not support " 1198ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "indirect adressing. Falling back to TGSI " 1199ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "backend.\n"); 1200ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1201ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1202ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1203ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct radeon_llvm_context radeon_llvm_ctx; 1204ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard LLVMModuleRef mod; 1205ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned dump = 0; 1206ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx)); 1207ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT]; 1208ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); 1209ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 1210ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard dump = 1; 1211ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1212ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count, 1213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard rctx->family, dump)) { 1214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "R600 LLVM backend failed to compile " 1218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "shader. Falling back to TGSI\n"); 1219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 1220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT]; 1222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* End of LLVM backend setup */ 1227ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1228ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (!use_llvm) { 1229ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT] + 1231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.info.file_max[TGSI_FILE_INPUT] + 1; 1232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 12344d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 1235d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 123697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 123797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 123897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 1239d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 12407728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 12418e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 12424d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 12438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1245cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 1246cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 12475555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 1251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 1253cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 1254cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 1255cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 1256cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 1257cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 1258cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 1259cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 1260cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 1261cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 1262cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 1270725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1271725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_PROPERTY: 1272725a820b926575265e6790601a0defd9c30947dcVadim Girlin property = &ctx.parse.FullToken.FullProperty; 127391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (property->Property.PropertyName) { 127491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 1275725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (property->u[0].Data == 1) 1276725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->fs_write_all = TRUE; 127791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 127891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 127991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (property->u[0].Data == 1) 128091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin shader->vs_prohibit_ucps = TRUE; 128191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 1282725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1283725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1284725a820b926575265e6790601a0defd9c30947dcVadim Girlin default: 1285725a820b926575265e6790601a0defd9c30947dcVadim Girlin R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 1286725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = -EINVAL; 1287725a820b926575265e6790601a0defd9c30947dcVadim Girlin goto out_err; 1288725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1289725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1290725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1291c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if (ctx.fragcoord_input >= 0) { 1292cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if (ctx.bc->chip_class == CAYMAN) { 1293cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie for (j = 0 ; j < 4; j++) { 1294cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1295cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1296cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1297cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1298cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1299cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie 1300cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1301cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = j; 1302cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = (j == 3); 1303cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1304cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1305cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1306cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1307cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } else { 1308cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1309cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1310cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1311cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1312cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1313c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1314cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1315cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = 3; 1316cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = 1; 1317cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1318cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1319cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1320cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1321c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 1322c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (shader->two_side && ctx.colors_used) { 1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = process_twoside_color_inputs(&ctx))) 1325725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1326725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1327725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1328725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_init(&ctx.parse, tokens); 1329725a820b926575265e6790601a0defd9c30947dcVadim Girlin while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1330725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_token(&ctx.parse); 1331725a820b926575265e6790601a0defd9c30947dcVadim Girlin switch (ctx.parse.FullToken.Token.Type) { 1332725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_INSTRUCTION: 1333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1334ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard continue; 1335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 1337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1339be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 1340be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 1341be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 13421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 13437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 13447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 13457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 13467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 13477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 134889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 135089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 135150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 135250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 135350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1359725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1362eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 1363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Get instructions if we are using the LLVM backend. */ 1364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count); 1366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1369457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 1370eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 137154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.clip_vertex_write) { 137254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* need to convert a clipvertex write into clipdistance writes and not export 137354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin the clip vertex anymore */ 137454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 137554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io)); 137654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 137754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg; 137854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 137954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 138054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg+1; 138154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 138254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 13835a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin /* reset spi_sid for clipvertex output to avoid confusing spi */ 13845a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin shader->output[ctx.cv_output].spi_sid = 0; 13855a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin 138654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->clip_dist_write = 0xFF; 138754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 138854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0; i < 8; i++) { 138954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int oreg = i >> 2; 139054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int ochan = i & 3; 139154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 139254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (j = 0; j < 4; j++) { 139354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin struct r600_bytecode_alu alu; 139454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 139554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4); 139654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].sel = shader->output[ctx.cv_output].gpr; 139754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].chan = j; 139854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 139954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].sel = 512 + i; 140054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].kc_bank = 1; 140154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].chan = j; 140254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 140354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.sel = ctx.temp_reg + oreg; 140454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.chan = j; 140554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.write = (j == ochan); 140654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (j == 3) 140754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.last = 1; 140854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin r = r600_bytecode_add_alu(ctx.bc, &alu); 140954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (r) 141054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin return r; 141154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 141254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 141354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 141454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1415543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák /* Add stream outputs. */ 1416543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 1417543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < so.num_outputs; i++) { 1418543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct r600_bytecode_output output; 1419543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1420543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (so.output[i].output_buffer >= 4) { 1421543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 1422543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák so.output[i].output_buffer); 1423543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = -EINVAL; 1424543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1425543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 14268ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák if (so.output[i].dst_offset < so.output[i].start_component) { 14278ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák R600_ERR("stream_output - dst_offset cannot be less than start_component\n"); 14282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák r = -EINVAL; 14292449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák goto out_err; 1430543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1431543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1432543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák memset(&output, 0, sizeof(struct r600_bytecode_output)); 1433543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.gpr = shader->output[so.output[i].register_index].gpr; 1434543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.elem_size = 0; 14358ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.array_base = so.output[i].dst_offset - so.output[i].start_component; 1436543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 1437543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.burst_count = 1; 1438543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.barrier = 1; 1439c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin /* array_size is an upper limit for the burst_count 1440c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin * with MEM_STREAM instructions */ 1441c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin output.array_size = 0xFFF; 14428ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component; 1443543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.bc->chip_class >= EVERGREEN) { 1444543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1445543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1446543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 1447543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1448543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1449543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 1450543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1451543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1452543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 1453543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1454543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1455543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 1456543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1457543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1458543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } else { 1459543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1460543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1461543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 1462543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1463543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1464543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 1465543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output); 1475543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (r) 1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1477543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1478543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1479543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1480eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 148154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0, j = 0; i < noutput; i++, j++) { 148254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 148354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 148454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 148554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 148654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 148754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 148854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 3; 148954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 149054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 149154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = -1; 149254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 1494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 149591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (shader->output[i].name) { 149691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_POSITION: 149754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 149854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 149991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 150091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 150191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 150254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 150354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 150454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 150554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 150654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j--; 150791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 150891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 150954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 151054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 151154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* spi_sid is 0 for clipdistance outputs that were generated 151254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin * for clipvertex - we don't need to pass them to PS */ 151354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (shader->output[i].spi_sid) { 151454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 151554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* duplicate it as PARAM to pass to the pixel shader */ 151654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output)); 151754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 151854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 151954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 152091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 152113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin case TGSI_SEMANTIC_FOG: 152213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_y = 4; /* 0 */ 152313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_z = 4; /* 0 */ 152413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_w = 5; /* 1 */ 152513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin break; 1526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 153054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 153154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 15324f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (k = 1; k < shader->nr_cbufs; k++) { 153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 3; 154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1547feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 1548feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 15495f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 2; 155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 155539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 155854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 155954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 1562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 1569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 157172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 157254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 157354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (output[j].type==-1) { 157454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 157554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 157654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 1577457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 157854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1579457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 158054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) { 158154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 158254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 158354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 158454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 158554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 158654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 158754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 158954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 159054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 159154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 159254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1594c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1596481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.type == TGSI_PROCESSOR_FRAGMENT && j == 0) { 159854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 160054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 160454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 160654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 160754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 160854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 160954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 161054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1611481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 161254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 161354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput = j; 161454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1615457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 1616457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 161789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 16197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 16207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 1621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1622b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 1623b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 1624a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1625c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1626c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1627457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 1628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 16294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 163489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 16354a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1637783e4da72aa203a645737dec81b001341951a942Vadim Girlin /* check GPR limit - we have 124 = 128 - 4 1638783e4da72aa203a645737dec81b001341951a942Vadim Girlin * (4 are reserved as alu clause temporary registers) */ 1639783e4da72aa203a645737dec81b001341951a942Vadim Girlin if (ctx.bc->ngpr > 124) { 1640783e4da72aa203a645737dec81b001341951a942Vadim Girlin R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr); 1641783e4da72aa203a645737dec81b001341951a942Vadim Girlin r = -ENOMEM; 1642783e4da72aa203a645737dec81b001341951a942Vadim Girlin goto out_err; 1643783e4da72aa203a645737dec81b001341951a942Vadim Girlin } 1644783e4da72aa203a645737dec81b001341951a942Vadim Girlin 16453b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 1649cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 1650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1656f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1657f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 16664a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1667a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1668a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1669a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1670a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1671a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1672a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1673a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1674a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1675a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1676a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1677a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 16784a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1679f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1680f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1681f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1682f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1683f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 16844a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 16853efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 16863efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 16873efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 16883efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 168980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 169080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 169180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 16924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 16947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 170047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 170147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 17027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 17037a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 17047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1707dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1709dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1710d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1711d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1712dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1713d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1714d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1715d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1716dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1717dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1718dffad730df17983cfaef0808555a8c26cad0aa15Christian König 17199b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1720dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1721dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17224a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1723dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1724dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1726d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 17304a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 173180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1738d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 17394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 17404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 17454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 17477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 17484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 17497a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 17539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 17564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1763d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1764d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 17659b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1766d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1767d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1768d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1769d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 17709b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 17719b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 17729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 17739b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 17749b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 17759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1776d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1778cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1779cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1780cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1781cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1782cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1783cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1784cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1785cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1786cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1787cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1788cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1789cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1790cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1791cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1792cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1793cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1794cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1795cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1796cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1797cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1798cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1799cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1800cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1802cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1803cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1804cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1807cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1808cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 18134a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 18147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 18174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 18217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 18267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1834d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx) 1835d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{ 1836d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1837d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int i, j, k, r; 1838d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct r600_bytecode_alu alu; 1839d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 1840d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (k = 0; k < last_slot; k++) { 1841d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << k))) 1842d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie continue; 1843d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 1844d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (i = 0 ; i < 4; i++) { 1845d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1846d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1847d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1848d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], k); 1849d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1850d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1851d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.dst.write = (i == k); 1852d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (i == 3) 1853d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.last = 1; 1854d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1855d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (r) 1856d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return r; 1857d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1858d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1859d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return 0; 1860d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie} 1861d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 18627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 186388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 186488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 186588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 186688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 18671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 186888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 186996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 187096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 187196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 187296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 187396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 18744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 18757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 18764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1877a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 187888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 187988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 188088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 188188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 188288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 188388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 18844a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 18857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1886921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 188788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 188996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1890ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 189188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 18924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 189388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 189488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 189588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 18964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1897a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 18987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 189988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 190088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 190188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 190288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 190388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 190488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 190588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 190788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 190888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 190988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1911a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 191288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 191388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 191488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 191588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 191688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 191788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 191888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 191988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 19207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1921921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 192288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1923921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1924ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 192596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 192689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1927a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1928a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 192996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 193096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 193196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 193296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 193396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 193496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 193588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19364a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 193788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 193888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 193992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 194092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 194192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 19437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19454a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 19554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 19567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 19577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 19587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 19607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 19617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 19637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 19647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 19657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 19677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 19707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 19717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 19727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 197392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 197492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 197592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19764a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 197792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1978dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 197992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 19801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 198192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 198292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 198388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 198588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 198688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 198888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 198988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 199088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 199188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 199288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 199488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 199588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 199688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 199788f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1998be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2000be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 2001be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 20024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2003a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2004be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 2005be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 200680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2007be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 200888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 20094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 201088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 201188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 201288f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 201388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 201488f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 201588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 201692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 201792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 201892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20194a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 202192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 202257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 202357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 202457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 202557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 20261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 202757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 202857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 202957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 203092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 203192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 203257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 203389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 20354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 20407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 20427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 20437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 205592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 20567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 206357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 206492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 206592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 206657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 206789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 20694a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 20717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 20737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 20757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 20767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 208857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 209657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 209792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2098ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 2099ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 21004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2101ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2102ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2103ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 210480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 2105ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2106ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 2107ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2108ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2109ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2110ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2112ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2113ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2114ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2115ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2116ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 2117ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 21184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2119ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2120ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2121ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 212280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2123ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2124ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2125ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2126ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2127ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2128ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2130ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2131ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2132ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2133ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 213492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 213592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 213692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2137094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 2138094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 21394a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2140094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 2141094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 2142094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 21434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2144094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 21454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2146094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 21474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2148921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 21494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 21504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 21514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 21524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 21534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 21544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 21554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 2156094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 2157094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 2158094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 21594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2160094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 2161094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 2162094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 21634502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 21644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 21654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 21664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 2167094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 2168094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 2169094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 21700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 21710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 21720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 21734a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 21740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 21750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 2176f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 21774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2178f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 21794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 2180f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2181f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 2182f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2183f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2184f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 2185f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 2186f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2187f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 21884a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2189f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 2190f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 2191f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 21920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 21930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 21946a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 21956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 21967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 21976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 219889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 2200f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2203f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2204f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 2205f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2206f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 22077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 22087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 22117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 22127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 22134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 2218f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2221f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2222f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 22232fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 22242fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 22252fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 22267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 22326a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 22336a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 22340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 223586f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 22364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2237a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 223886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 223986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 22404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 22414a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 22420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 22430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 22440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 22450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 22460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 22474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 22490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 22500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 225189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 22527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 22544a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 22644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 22704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 22747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 2281abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 22828567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 22834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22848567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 22858567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 22868567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 22878567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 22888567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 22894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22908567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 22918567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 22928567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 2293abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 22944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2295abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 22964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2297abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2298abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 2299abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 2300abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 23014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2302abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2303abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2304abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 2305abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 23064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2307abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2308abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 2309abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 2310abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2311abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 2312abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 23134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2314abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2315abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2316abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 23170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 23180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 23190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 232042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 232142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 232242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23234a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 232442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 232542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 23264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2327df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2328370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 2329df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2330df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 2331df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2332df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 2333df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 233442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 23354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 23364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 233742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 233842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 233942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 234042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 23414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 234242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 234342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 234442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 234542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 234642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 234742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 2348a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 23497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 23507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23514a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2352a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 23537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 23547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 23554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2357a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 23587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 235980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 23607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 23617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 23627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 23634a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 23657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 23667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 23677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 23687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 23697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 2370a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 2371a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 2372a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23734a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2374a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 2375a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 23764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2377a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2378a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 23794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 2380a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 2381a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2382a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2383a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 23844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2385a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2386a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 2388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2389a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2390a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 23917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 23927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 23937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 23954a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 23967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 23977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 23987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 23994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24014a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 24027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 24047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 24067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 24117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 24134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24154a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 24167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 24177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24204a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 24257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 24264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 24287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 24327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 24387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 24397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 2441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 2442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 24434a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 2445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 2446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 24474a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2448a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 24534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2456a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 24574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 245866f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 2461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 24644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 24684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 24744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op) 2481332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{ 2482332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2483332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct r600_bytecode_alu alu; 248429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int i, r, j; 2485332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 2486332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp0 = ctx->temp_reg; 2487332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp1 = r600_get_temp(ctx); 24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin int tmp2 = r600_get_temp(ctx); 248929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int tmp3 = r600_get_temp(ctx); 24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* Unsigned path: 24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * we need to represent src1 as src2*q + r, where q - quotient, r - remainder 24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 1. tmp0.x = rcp (src2) = 2^32/src2 + e, where e is rounding error 24954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 2. tmp0.z = lo (tmp0.x * src2) 24964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 3. tmp0.w = -tmp0.z 24974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 4. tmp0.y = hi (tmp0.x * src2) 24984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src2)) 24994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error 25004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 7. tmp1.x = tmp0.x - tmp0.w 25014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 8. tmp1.y = tmp0.x + tmp0.w 25024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) 25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 10. tmp0.z = hi(tmp0.x * src1) = q 25044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 11. tmp0.y = lo (tmp0.z * src2) = src2*q = src1 - r 25054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 12. tmp0.w = src1 - tmp0.y = r 25074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 13. tmp1.x = tmp0.w >= src2 = r >= src2 (uint comparison) 25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 14. tmp1.y = src1 >= tmp0.y = r >= 0 (uint comparison) 25094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * if DIV 25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.z + 1 = q + 1 25134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.z - 1 = q - 1 25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * else MOD 25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.w - src2 = r - src2 25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.w + src2 = r + src2 25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * endif 25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 17. tmp1.x = tmp1.x & tmp1.y 25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z 25254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z 25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z 25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20. dst = src2==0 ? MAX_UINT : tmp0.z 25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Signed path: 25314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Same as unsigned, using abs values of the operands, 25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * and fixing the sign of the result in the end. 25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin */ 2535332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2536332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin for (i = 0; i < 4; i++) { 2537332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin if (!(write_mask & (1<<i))) 2538332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin continue; 2539332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 2541332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = -src0 */ 25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2545332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 2549332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2551332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2553332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = -src1 */ 2559332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2561332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2564332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2565332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2567332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2569332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.z sign bit is set if src0 and src2 signs are different */ 25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* it will be a sign of the quotient */ 25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (!mod) { 25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT); 25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2587332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2588332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = |src0| */ 25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2609332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = |src1| */ 26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 1; 26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2629332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2630332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 1. tmp0.x = rcp_u (src2) = 2^32/src2 + e, where e is rounding error */ 263229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 263329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp3.x = u2f(src2) */ 263429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 263529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT); 2636332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 263729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 263829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 263929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 264029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 264129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 264229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 264329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 264429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 264529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 264629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 264729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 264829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 264929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 265029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 265129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 265229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp0.x = recip(tmp3.x) */ 265329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 3; j++) { 265429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 265529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 265629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 265729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 265829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 265929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 0); 266029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 266129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 266229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 266329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 266429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (j == 2) 266529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 266629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 266729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 266829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 266929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 267029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 267129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 267229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 267329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 267429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 267529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 267629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 267729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].value = 0x4f800000; 267829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 267929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 268029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (r) 268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 268529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT); 268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 268929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 26994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT); 27034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 2. tmp0.z = lo (tmp0.x * src2) */ 272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2725332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 2729332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2746332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 3. tmp0.w = -tmp0.z */ 27664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 27704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 27714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 27724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 27744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 27754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 27764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 27784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 27794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 27804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 4. tmp0.y = hi (tmp0.x * src2) */ 278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 27864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 27904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 27934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2807332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 281629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 281929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 282229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 282429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 2826332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src)) */ 28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2831332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 28444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error */ 284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2852332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 285329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 3); 28564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 28594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 28624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 286929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 287229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 3; 287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 287529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 287629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 287729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 287829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 287929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 288029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 288129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 288229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 288329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 288429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 7. tmp1.x = tmp0.x - tmp0.w */ 28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2889332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2890332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 2892332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2893332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2899332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2901332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2902332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 8. tmp1.y = tmp0.x + tmp0.w */ 2904332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 2906332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2907332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2909332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2910332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 29134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 2915332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2916332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2918332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2919332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */ 29214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 29234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2924332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 29264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 29284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 29314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 29324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 29334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 29354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 29384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 29394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 10. tmp0.z = hi(tmp0.x * src1) = q */ 294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 29454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 294629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 294729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 294829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 29494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 295029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 295129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 295329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 295429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 295529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 295629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 295729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 295829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 295929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 296029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 296129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 296229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 296329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 29644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 296529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 296629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 29674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 296829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 296929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 297029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 297129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 297229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 297329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 297429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 297529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 297629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 297729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 297829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 297929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 298029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 298129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 298229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 298329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 298429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 298529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 11. tmp0.y = lo (src2 * tmp0.z) = src2*q = src1 - r */ 298829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 298929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 299329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 299429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 299529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 299729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 299829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 299929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 300029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 300129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 300529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 301029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 30144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 30184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 302929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 12. tmp0.w = src1 - tmp0.y = r */ 30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 30374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 30394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 30404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 30414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 30434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 30444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 30454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 30464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 30474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 30484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 30504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 30514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 30534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 30544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 30554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 13. tmp1.x = tmp0.w >= src2 = r >= src2 */ 30574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 3059332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3060332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 3062332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3063332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 30644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 30654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 30664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 30674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 30684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 30694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 30704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 30714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3072332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 30734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 30744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 30754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 3076332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 30774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 14. tmp1.y = src1 >= tmp0.y = r >= 0 */ 30784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 30804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3097332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3098332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { /* UMOD */ 3100332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.w - src2 = r - src2 */ 3102332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3104332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3105332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 3107332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3108332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 3111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.w + src2 = r + src2 */ 31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { /* UDIV */ 31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.z + 1 = q + 1 DIV */ 31474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.z - 1 = q - 1 */ 31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT; 31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3178332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 3179332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 17. tmp1.x = tmp1.x & tmp1.y */ 31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT); 31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3187332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z DIV */ 31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z MOD */ 3199332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 3202332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3206332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = mod ? 3 : 2; 32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */ 32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3230332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3231332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.src[0].sel = tmp1; 32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 3237332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3240332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3241332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the sign of the result */ 32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { 32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* sign of the remainder is the same as the sign of src0 */ 32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */ 32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the quotient sign (same as the sign of src0*src1) */ 33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */ 33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3321332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return 0; 3322332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin} 3323332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx) 33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 0); 33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx) 33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 0); 33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx) 33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 1); 33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx) 33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 1); 33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3344a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3345a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 3346a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{ 3347a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3348a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct r600_bytecode_alu alu; 3349a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int i, r; 3350a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 3351a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 3352a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3353a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3354a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3355a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3356a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3357a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3358a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 3359a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3360a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.sel = ctx->temp_reg; 3361a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.chan = i; 3362a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.write = 1; 3363a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3364a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3365a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (i == last_inst) 3366a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3367a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3368a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3369a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3370a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3371a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3372a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3373a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3374a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3375a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3376a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3377a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = ctx->inst_info->r600_opcode; 3378a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3379a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3380a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3381a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].sel = ctx->temp_reg; 3382a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].chan = i; 3383a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3384a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (i == last_inst) 3385a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3386a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3387a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3388a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3389a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3390a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3391a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return 0; 3392a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin} 3393a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 33946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 33956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{ 33966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 33976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct r600_bytecode_alu alu; 33986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int i, r; 33996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 34006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 34016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* tmp = -src */ 34036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 34096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.sel = ctx->temp_reg; 34116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.chan = i; 34126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34156b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 34166b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34176b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 34186b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 34196b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 34206b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 34216b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 34226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 34236b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34246b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* dst = (src >= 0 ? src : tmp) */ 34256b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34266b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34276b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34286b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34296b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34306b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 34316b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.is_op3 = 1; 34326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34336b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34346b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 34356b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34366b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 34376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].sel = ctx->temp_reg; 34396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].chan = i; 34406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 34426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 34436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 34446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 34456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 34466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 34476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return 0; 34486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin} 34496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 345042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx) 345142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{ 345242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 345342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct r600_bytecode_alu alu; 345442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int i, r; 345542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 345642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 345742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 345842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* tmp = (src >= 0 ? src : -1) */ 345942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 346042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 346142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 346242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 346342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 346442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 346542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 346642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 346742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.sel = ctx->temp_reg; 346842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.chan = i; 346942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 347042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 347142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 347242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 347342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT; 347442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 347542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 347642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 347742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 347842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 347942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 348042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 348142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 348242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* dst = (tmp > 0 ? 1 : tmp) */ 348342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 348442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 348542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 348642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 348742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 348842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT); 348942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 349042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 349142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 349242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 349342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 349442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].sel = ctx->temp_reg; 349542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].chan = i; 349642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 349742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 349842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 349942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = ctx->temp_reg; 350042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].chan = i; 350142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 350242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 350342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 350442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 350542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 350642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 350742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 350842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return 0; 350942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin} 351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 35116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35130d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 35140d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 35150d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35164a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3517921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 35180d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35190d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 35200d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 35214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3522a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 35230d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 3524cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 35250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 3526cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 35270d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3529921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 35304a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 35310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35320d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 35330d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 35344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 35350d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 35360d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 35370d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 35380d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35390d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 35400d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 35414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3542a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 35430d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 354480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 35450d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35460d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 3547cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 35480d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 35490d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3550921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 35510d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 35520d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35530d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 3554cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 35550d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35560d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 35570d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 35584a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 35590d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 35600d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 35610d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 35620d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 35630d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 35640d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3565cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 3566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 35674a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 3569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 35714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 3573a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 35746c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 3575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 3576a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 357780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3578cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 3579cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 3580cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3581cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 3582cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 3583cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 35844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 3586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 3587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 3589cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3590cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 3592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 3593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35944a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 3596dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 35987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 35997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 36007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 36017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 36024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36077be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 360880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 3610cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 3611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 36127be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 3613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36197be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 3623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 3624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36254a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 3627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 36294a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3634a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 363580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 3637a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 3638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 3639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 3640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 3641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 3642921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 3647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 3648921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3652e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 3653e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 3654e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 3655e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 3656e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 3657e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 3658e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 3659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 3660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 3663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 36726415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 36736415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 36746415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 36756415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36766415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 3677192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_INPUT && 3678192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_OUTPUT) || 36796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 36806415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 36816415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 36826415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 36836415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 36846415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 36856415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36866415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 36876415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 36886415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 368933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 369033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 369196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 369233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36934a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 36944a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3695641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 369640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 3697bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 3698da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 3699da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 37006415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 370178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 370213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 370378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint8_t offset_x = 0, offset_y = 0, offset_z = 0; 3704641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37056415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 3706641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37071d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 37081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 37091d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 37101d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 37111d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 37121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 37131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 37141d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 37151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 37161d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 371713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 371813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 371913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 372040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 372140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 37224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 372340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 372440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 372540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 372640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 372740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 372840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 372940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 373040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 373140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 373240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 373340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 373440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 373540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 37364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 373740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 37384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 373940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 374040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 374140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 374240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 374340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 37444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 374540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 374640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 374740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 374813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 374940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 375040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 375140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 375240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 375340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 375440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 375540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 375640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 375740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 375840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 375940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 376040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 376140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 376240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 376340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 376440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 37654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 376640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 376740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 376813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 376913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 3771b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 377289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 37754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 37774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 37854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 37924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 37944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 3805b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 38064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3807a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 38104a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3812b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3813b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3817b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 38184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3819a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3820921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 3821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 3822b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3823b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 3824b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3825b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3827b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3828b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 382978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3830b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 38339783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE || 38349783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) && 3835261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie inst->Instruction.Opcode != TGSI_OPCODE_TXQ) { 3836261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie 38370e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 38380e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 3839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 3841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 38424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3843a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 38444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 38454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 3846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 3848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 3849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 3850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 38514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 385789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 38754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 38797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38887ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 3890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 38917ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 38934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 3899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3904a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 3908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39104a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3915a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 3920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3925a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 3929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 39324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 39359783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie /* write initial W value into Z component */ 39369783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 39379783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39389783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 39399783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 39409783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.sel = ctx->temp_reg; 39419783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.chan = 2; 39429783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.write = 1; 39439783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.last = 1; 39449783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 39459783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (r) 39469783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie return r; 39479783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 394878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 3950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 395278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 3953b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 39544a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3955a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 39564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3957b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3959b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 3960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3961b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 39624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3963b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3964b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3965b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 396678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3967b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3968b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 39697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 3971929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 3972929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 39736b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 39749783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || 3975929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 3976929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 3977de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 3978de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 3979de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 3980de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3981de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 3982de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 3983de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3984c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 3985c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 3986c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 3987de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 3988de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 3989de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 3990de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 3991de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 399233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 39934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 3994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 39956415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 39966415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 3997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 3998641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 39996c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 40009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 40019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 40029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 40039d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 400478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 400578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 400678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 400778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 400878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 400978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 401078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 401178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 401278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 401378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 4014244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 401578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 40169a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 4017bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 4018bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 4019bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 4020bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 4021bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 4022bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 40239783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 40249783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_x = 1; 40259783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_y = 0; 40269783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_z = 3; 40279783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_w = 2; /* route Z compare value into W */ 40289783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 4029bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 40306b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 40316b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 403201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 403301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 403401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 40356b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 40366b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 4037bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 40381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 40391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 40401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 404169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 4042929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 4043929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 4044929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 4045929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4046929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 40476b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 4048929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 4049929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 4050929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 405178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 4052929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4053929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 4054929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 4055929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 4056929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 4057929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 4058929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 4059929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 4060929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 4061929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4062929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4063929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 4064929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4065929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 4066929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 4067929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4068929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4069bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 40704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 4071bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 4072bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 4073bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 4074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 4075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 407633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 407733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 4078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 4079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 4080b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 40814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4082dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 4084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 4085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4086c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 40871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 4088c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 4089c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4090c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 4091c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 40924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4093c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 40944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 40954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4096c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 409780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4098c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 4099c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 4100c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 4101c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 41024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4103c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 4104c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 4105c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4106c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 4107c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4108c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 4109b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 4110dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4111dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4112dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4113dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4115a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 4116921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 4117b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 41184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 41194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 4120b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4122dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 41264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4131b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 4132dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4133dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4134dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4135dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4137a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 4139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 41404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4143dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 41474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 4153dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4154dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4155dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4156dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4158a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 4159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 41604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 41614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 4162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 4163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 4164dffad730df17983cfaef0808555a8c26cad0aa15Christian König 416580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 41704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4174dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 4175b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 4176b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 417787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 417887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 417987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 41804a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 418187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 4182dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 418387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 41847be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 41857be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 41867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 418787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 41884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4189a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 41904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 41914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 41924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 419380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 419487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 419587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 419687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 41977be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 419887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 41994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 420087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 420187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 42027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 420387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 420487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 420587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 42070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 42080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 42100e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 42114a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 42120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 42130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 42140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 42160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 42170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 42194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 42210e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 42224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 42234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 42240e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 42250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 42260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 42270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 42280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 42290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 42320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 42330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 42340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 42360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 42374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 42380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 42390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 42400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 42434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4244a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 42450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42460e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 42474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 42484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 42490e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 42500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 42510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 42520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 42530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 42540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 42570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 42580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 42590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 42610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 426280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 426380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 42640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 42650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 42660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 42670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 42680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 42694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 42700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 42710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 42720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 42760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 42770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 427836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 427936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 428036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 428209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 42837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 428436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 428536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 428636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 42874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 428836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4289a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 42904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 429136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 429236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 429336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 429436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 429536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 42964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 429736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 429836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 429936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 430089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 43017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 43027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 43047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 430536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 43087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 43097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 43117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 43167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 43177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 43197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 43207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 43217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 43237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43254a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 432936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 43307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 433136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 433236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 43334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 433436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4335a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 43364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 433736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 433836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 4339b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 4340b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4341b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 4342b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 4343b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 434436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 434536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 434636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 434736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 435036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 435136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 435236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 435336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 435436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 435536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 435689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 43577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 43584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 436136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 43647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 43657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 436836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 43737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 43744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 43757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 437736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 43827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 43844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 438836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 438936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 439036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 439136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 43924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 439336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4394a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 439536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 439636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 439736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 439836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 439936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 440036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 440136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 44024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 440336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 440436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 440536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 440636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 440736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 440887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 4409460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 4410460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 4411460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 44124a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4413460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 4415460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4416f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 4417460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 441889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 44197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 44204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 44227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 44257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 44287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 44297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 44317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 44377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44414a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 4455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 4459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 44624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4467f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 4468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 4469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 447089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 44724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 447396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 44747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 447796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 44787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 44807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 44817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 44897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 44957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 44987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 450596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 450796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 450896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 450996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 451096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 451196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 451296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 451396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 451496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 451596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 451696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45174a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 451896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 451996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 452096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 452189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 45257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 45267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 45277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 453496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45404a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 45427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 454496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 45477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 454996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 455496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 455589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 45597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 45607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 45737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 45767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 45777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 457896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 458396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 458896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 459096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 459196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 459296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 459596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 459696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 459796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 4598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 4601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46044a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4609f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 4610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 461189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 46164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 4618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 46237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 4625460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 46314a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 46344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 46407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 46417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4647460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 4649460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 46504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4651460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4652460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4653460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 4654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 4658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46614a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4664460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 4667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 4668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 466998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 467098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 467198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 46724a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 467398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 4674a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 46754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 467698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 467752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 467852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 467952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 468052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 468152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 468252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 468352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 46849b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 46858e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 46869b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 468752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 468852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 468952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 469052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 469152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 46928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 469398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 46948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 46958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 46964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 469798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 469898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 46998e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 47008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 470198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 470298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 470398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 470447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 470547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47064a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 470747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 4708a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 47097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 47107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 4711077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4712077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 47134a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47148e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4715077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4716077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4717077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47184a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4719077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 4720077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 4721077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4722077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 47238e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 47248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4725077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4726077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4727077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47284a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4729077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 47307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 47317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 4732077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4733077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 47344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47358e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4736077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4737077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4738077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47394a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4740077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 47417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 47429b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 47438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 47448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 47458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47468e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 47478e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 47488e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 47498e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 47508e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 47518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 47529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 47537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 47547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 47557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 47567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 47577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 47588e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 475947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 476047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 476147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 476257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 476357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 476457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 476657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 476757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 476857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 47694a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 477057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4771a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 477280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 47737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 47747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 477557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 477657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 47774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 477857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 477957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4780a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 478157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 478257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 47834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 478457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 478557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 478657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 47874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 478857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 478957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 479057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 479157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 479257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 479357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 4795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 47964a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 4798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 47994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 4801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 4802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 4804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 4805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 4806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 4809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 48107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 4812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 4814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 4815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 4816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 4820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 48212bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 48222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 48232bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 48242bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 48252bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 48264f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 48272bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 48284f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 48292bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 48302bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 48312bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 48322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 48334f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 48342bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 48352bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 48364f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 48372bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 48382bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 48392bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 48402bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 48412bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 48422bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 48432bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 48444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 48458813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 48468813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 48478813842121d46d1be476807c98b0ba0b771f0c91Christian König } 48482bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 4849a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4850a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4851a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 485209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 4853a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 485409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 485509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 485609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 485709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 485809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 485909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 486009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 486109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 486209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 486309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 486409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 486509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 486609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 486709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4868a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 486909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 487009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 487109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 487209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 487309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 487409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 487509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 487609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 487709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 487809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 487909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 4880a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 4881a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 4882a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 488309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 488409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 488509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 488609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 488709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 488809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 488909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 48907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 489109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 489209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 489309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 489409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 489509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 489609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 489709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 489809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 489909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 490009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 490109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 490209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 490309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 490409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 490509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 490609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 490709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 490809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 490909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 491009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 491109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 491209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 491309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 491409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49154a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 49164a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 491709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 491809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 491909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4920a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 492209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 4923a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 492409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 492509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 492609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 49444f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49514f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 4953370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX work out offset */ 495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4956a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 49647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 497409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 49918b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 4998a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5000a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5001a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 5002a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 50034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 5004a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 5005a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 5007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 5008a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5009a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5010a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5011a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 5012a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 5013a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 5014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 5015a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 5016a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 5017a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 5018a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5019a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 5020a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 5021a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 5022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 5024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 5036a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 504909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 505109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 505609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 505709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 505809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 505909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 506009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 506109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 506209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 506309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 506409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 5065370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX add LOOPRET support */ 506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 506709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 506809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 506909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 507009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 507109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 507209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 507309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 507409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 507509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 507609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 507709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 507809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 507909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 508009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 508209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 508309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 508409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 508509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50864a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 508709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 508809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 508909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 5091a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5092a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5093a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5094cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 5095cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 5096cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5097cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 5098cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 5099cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 5100cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5101cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 5102cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5103cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5104cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5105cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5106cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5107cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5108cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 5109cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 5110cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 5111cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5112c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 5113cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 5114cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 5115cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5116cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 51179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 5118cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5119cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5120cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5121cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5122cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5123cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5124cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5125cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5126cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5127cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5128cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5129cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 5130cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5131c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5132cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5133cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 5134cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 5135cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5136cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 5137cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 5138cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 5139cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5140cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5141cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5142cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5143cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5144cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 5145cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 5146cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 514898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 51500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5151df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 5152370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 5153df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 5154df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 5155df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 5156df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 5157df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 515842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 515936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5160460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5163cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5164cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 516557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5166dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5168d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5169be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 51803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 51823af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5183df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 51847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 51854558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 5186a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 51870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 51907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5192e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 519388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 51943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 51953af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 51964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52020d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52040d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 520588f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 5206d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 52070d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5209b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 521013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5211b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52189f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52220d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 522387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 522492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5225c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5229ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 523009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5235a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5236a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52428c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5243c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5244cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 52450ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5246d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans}, 5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5249c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5250c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 52514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5252cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 52551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 525609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 525909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 526109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5278094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5282bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 5283332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5284c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5285c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 52865893e686b691013525cb2608c3d605be2d8ea471Dave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5287c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5288d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans}, 52890196433ce55b7e005c483bd7c411844eb44e983bDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5290c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 52919a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5292c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 52934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5294c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5295c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5296c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 52974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5298850021f225f312d55fb6a24a8cef805f527510afDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5299c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5300c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5301d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans}, 53027383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5303c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 5304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5308cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5309a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5310a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5311cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5312cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5313cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5314cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5315cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5316cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5317a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5318cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5319cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 53209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 53219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 53226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 532342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 532650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 532750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 532898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 532950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 533050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 533150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 53328ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 533350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5334112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 533550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 533650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 533750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 533850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 533950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 534050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 534150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 534250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 534350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 534450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 534550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 534650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 534750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 534850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 534950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 535050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 535150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 535250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 535350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 535450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 535550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 535650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5357df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 535850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 535950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 536050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 536150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 536250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 536350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 536450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 536550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 536650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 536750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 536850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 536950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 537050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 537150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 537750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 537850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 537950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 538050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 538150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 538250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 538350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 538413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 538550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 538650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 53937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 53977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 53987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5399c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 54007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 54037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 54047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 54057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 54067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 54107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 54117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54168c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5417608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5418cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 54197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5420d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 54217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5423cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5424cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 54254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 54277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54281d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 54291d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 54307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 54317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 54347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 54367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5456a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 5457332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5459cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5462d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5463cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5464a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 5465b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 54674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 54714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 54729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5475d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 54767383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5482cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5483a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5484a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5485cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5486cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5487cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5488cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5489cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5490cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5491a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5492cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5493cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 54949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 54959b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 54966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 549742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 55027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 55037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 55047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 55067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 55097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 55107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 55117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 55147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 55157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 55167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 55177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 55187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 55197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 55207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 55297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5531df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 55327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 55337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 55347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 55357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 55427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 55437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 55447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 55457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 55517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 55537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 55547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 55557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 55567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 555813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 55597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 55607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 556750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 556950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 557050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 557150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 557250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5573c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 557450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 557550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 557650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5577ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 557850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 557950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 558050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 558150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 558250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 558350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 558450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 558550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 558650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 558750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 558850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 558950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55908c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5591f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2}, 5592cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 55930ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5594f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 559550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 559650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5597f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5598f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 559929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5600cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 560150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56021d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 56031d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 560450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 560550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 560650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 560750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 560850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 560950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 561050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 561250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 561850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 562750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 562850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 562950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5630f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 563129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5632cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5633cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5634f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5635f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5636f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5637f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5638f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 5639f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 5640f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 564129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5642f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5643f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5644f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 564529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5646d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr}, 5647f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5648f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5649f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 5650f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5651f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 565250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5656cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5657a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5658a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5659cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5660cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5661cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5662cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5663cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5665a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5667cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5668f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 56699b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5670f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5671f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 5674