r600_shader.c revision da676eab93e7dad30b574b4eb4cffd4df952e819
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 2612c485cda2062ca2b9af89ea62618515d960c7904Tom Stellardstatic uint32_t i32_from_byte_stream(unsigned char * bytes, 2622c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard unsigned * bytes_read) 2632c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard{ 2642c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard unsigned i; 2652c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t out = 0; 2662c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard for (i = 0; i < 4; i++) { 2672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard out |= bytes[(*bytes_read)++] << (8 * i); 2682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard } 2692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard return out; 2702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard} 2712c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes, 273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx) 274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned i; 276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned sel0, sel1; 277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard sel0 = bytes[bytes_read++]; 278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard sel1 = bytes[bytes_read++]; 279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].sel = sel0 | (sel1 << 8); 280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].chan = bytes[bytes_read++]; 281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].neg = bytes[bytes_read++]; 282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].abs = bytes[bytes_read++]; 283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].rel = bytes[bytes_read++]; 284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].kc_bank = bytes[bytes_read++]; 285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard for (i = 0; i < 4; i++) { 286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8); 287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx, 292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned src_idx; 295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned inst0, inst1; 296ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard for(src_idx = 0; src_idx < 3; src_idx++) { 299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, 300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &alu, src_idx); 301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.sel = bytes[bytes_read++]; 304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.chan = bytes[bytes_read++]; 305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.clamp = bytes[bytes_read++]; 306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.write = bytes[bytes_read++]; 307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.rel = bytes[bytes_read++]; 308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst0 = bytes[bytes_read++]; 309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst1 = bytes[bytes_read++]; 310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.inst = inst0 | (inst1 << 8); 311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.last = bytes[bytes_read++]; 312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.is_op3 = bytes[bytes_read++]; 313da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.pred_sel = bytes[bytes_read++]; 314ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle = bytes[bytes_read++]; 315ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle_force = bytes[bytes_read++]; 316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.omod = bytes[bytes_read++]; 317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.index_mode = bytes[bytes_read++]; 318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_alu(ctx->bc, &alu); 319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 320ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Handle other KILL instructions */ 321ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) { 322ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->shader->uses_kill = 1; 323ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: This should be enforced in the LLVM backend. */ 324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->bc->force_add_cf = 1; 325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 329ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu, 330ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned pred_inst) 331ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 332ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->inst = pred_inst; 333da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu->execute_mask = 1; 334da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu->update_pred = 1; 335b4789860c4416ba700ac5edeb692b59e33d45276Tom Stellard alu->dst.write = 0; 336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[1].sel = V_SQ_ALU_SRC_0; 337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->src[1].chan = 0; 338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu->last = 1; 339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_alu_type(ctx->bc, alu, 340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fc_pushlevel(ctx, FC_IF); 344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard callstack_check_depth(ctx, FC_PUSH_VPM, 0); 345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx, 348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu *alu, unsigned compare_opcode) 349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_BRK; 351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) 352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; 353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else if (ctx->bc->chip_class >= EVERGREEN) 354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; 355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else 356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; 357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, alu, compare_opcode); 358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_endif(ctx); 360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, 363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned inst; 367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0); 369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst = bytes[bytes_read++]; 370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst) { 3712fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 0: /* FC_IF */ 372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, &alu, 373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3752fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 1: /* FC_IF_INT */ 376bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune llvm_if(ctx, &alu, 377bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3792fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 2: /* FC_ELSE */ 380bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_else(ctx); 381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3822fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 3: /* FC_ENDIF */ 383bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_endif(ctx); 384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3852fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 4: /* FC_BGNLOOP */ 386bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_bgnloop(ctx); 387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3882fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 5: /* FC_ENDLOOP */ 389bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_endloop(ctx); 390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3912fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 6: /* FC_BREAK */ 392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_break_from_byte_stream(ctx, &alu, 393bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3952fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 7: /* FC_BREAK_NZ_INT */ 396bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune r600_break_from_byte_stream(ctx, &alu, 3972fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 398bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune break; 3992fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 8: /* FC_CONTINUE */ 400ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard { 401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_CONT; 402ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) { 403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &cm_shader_tgsi_instruction[opcode]; 405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else if (ctx->bc->chip_class >= EVERGREEN) { 406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &eg_shader_tgsi_instruction[opcode]; 408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 409ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 410ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &r600_shader_tgsi_instruction[opcode]; 411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 4152fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 9: /* FC_BREAK_Z_INT */ 41618617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard r600_break_from_byte_stream(ctx, &alu, 41718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 41818617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard break; 4192fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 10: /* FC_BREAK_NZ */ 4202fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard r600_break_from_byte_stream(ctx, &alu, 4212fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 4222fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard break; 423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 426ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 427ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 428ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx, 429ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 430ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 431ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_tex tex; 432ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 433ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.inst = bytes[bytes_read++]; 434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.resource_id = bytes[bytes_read++]; 435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_gpr = bytes[bytes_read++]; 436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_rel = bytes[bytes_read++]; 437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_gpr = bytes[bytes_read++]; 438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_rel = bytes[bytes_read++]; 439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_x = bytes[bytes_read++]; 440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_y = bytes[bytes_read++]; 441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_z = bytes[bytes_read++]; 442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_w = bytes[bytes_read++]; 443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.lod_bias = bytes[bytes_read++]; 444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_x = bytes[bytes_read++]; 445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_y = bytes[bytes_read++]; 446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_z = bytes[bytes_read++]; 447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_w = bytes[bytes_read++]; 448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_x = bytes[bytes_read++]; 449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_y = bytes[bytes_read++]; 450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_z = bytes[bytes_read++]; 451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.sampler_id = bytes[bytes_read++]; 452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_x = bytes[bytes_read++]; 453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_y = bytes[bytes_read++]; 454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_z = bytes[bytes_read++]; 455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_w = bytes[bytes_read++]; 456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 457ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_tex(ctx->bc, &tex); 458ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 459ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 460ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 461ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 462e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx, 463e42df8e10a83e76565474f82330d34403da71b49Tom Stellard unsigned char * bytes, unsigned bytes_read) 464e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{ 465e42df8e10a83e76565474f82330d34403da71b49Tom Stellard struct r600_bytecode_vtx vtx; 4662c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read); 4682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read); 4692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read); 4702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 471e42df8e10a83e76565474f82330d34403da71b49Tom Stellard memset(&vtx, 0, sizeof(vtx)); 4722c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4732c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD0 */ 4742c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0); 4752c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0); 4762c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0); 4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0); 4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0); 4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0); 4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD1 */ 4822c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1); 4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1); 4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1); 4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1); 4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1); 4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1); 4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1); 4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1); 4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1); 4912c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1); 4922c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4932c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD 2*/ 4942c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2); 4952c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2); 496e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 497e42df8e10a83e76565474f82330d34403da71b49Tom Stellard if (r600_bytecode_add_vtx(ctx->bc, &vtx)) { 498e42df8e10a83e76565474f82330d34403da71b49Tom Stellard fprintf(stderr, "Error adding vtx\n"); 499e42df8e10a83e76565474f82330d34403da71b49Tom Stellard } 500e42df8e10a83e76565474f82330d34403da71b49Tom Stellard /* Use the Texture Cache */ 501e42df8e10a83e76565474f82330d34403da71b49Tom Stellard ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX; 502e42df8e10a83e76565474f82330d34403da71b49Tom Stellard return bytes_read; 503e42df8e10a83e76565474f82330d34403da71b49Tom Stellard} 504e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 505ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 506ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned num_bytes) 507ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 508ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned bytes_read = 0; 5096f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard unsigned i, byte; 510ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard while (bytes_read < num_bytes) { 511ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard char inst_type = bytes[bytes_read++]; 512ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst_type) { 513ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 0: 514ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_alu_from_byte_stream(ctx, bytes, 515ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 1: 518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_tex_from_byte_stream(ctx, bytes, 519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 520ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 521ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 2: 522ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_fc_from_byte_stream(ctx, bytes, 523ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 524ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 5256f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard case 3: 5266f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE); 5276f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (i = 0; i < 2; i++) { 5286f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (byte = 0 ; byte < 4; byte++) { 5296f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard ctx->bc->cf_last->isa[i] |= 5306f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard (bytes[bytes_read++] << (byte * 8)); 5316f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5326f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5336f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard break; 534e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 535e42df8e10a83e76565474f82330d34403da71b49Tom Stellard case 4: 536e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read = r600_vtx_from_byte_stream(ctx, bytes, 537e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read); 538e42df8e10a83e76565474f82330d34403da71b49Tom Stellard break; 539ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard default: 540ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Error here */ 541ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 542ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 543ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 544ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 545ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 546ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/ 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 55672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 560c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 561a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 56572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 566a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 5688260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 5698260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 5708260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 57547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 57647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 58172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 58272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 5864a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 587fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 588fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 589fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 590fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 592fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 593fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 595fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 6067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 61050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 61150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 6124a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 61350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 61450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 615738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW; 61650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 617738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY; 61850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 61950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 62150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 62250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 62350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 62450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 625fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 626fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 627fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 628fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 629fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 63150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 6344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 63550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 63650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 63750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 63850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 6397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 6407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 64121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 64221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 64321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 64421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 64521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 64621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 64721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 64821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 649738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0; 65021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 65121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 66021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 66221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 66321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 66421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 66521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 66621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 6677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 6680a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 6690a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 6700a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6710a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 6720a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 6730a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 6740a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 6750a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6760a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 6770a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 6780a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 6950a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 6960a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 6970a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 6980a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 7005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7015b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7025b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 7035b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 7045b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 7055b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 7065b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7075b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 7085b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 7095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 7105b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 7275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 7285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 7305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 7315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 732725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */ 733725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) 734725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 735725a820b926575265e6790601a0defd9c30947dcVadim Girlin int r = 0; 736725a820b926575265e6790601a0defd9c30947dcVadim Girlin 737725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].spi_sid) { 738725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[index].lds_pos = ctx->shader->nlds++; 739725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].interpolate > 0) { 740725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_alu(ctx, index); 741725a820b926575265e6790601a0defd9c30947dcVadim Girlin } else { 742725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_flat(ctx, index); 743725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 744725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 745725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 746725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 747725a820b926575265e6790601a0defd9c30947dcVadim Girlin 748725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back) 749725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 750725a820b926575265e6790601a0defd9c30947dcVadim Girlin struct r600_bytecode_alu alu; 751725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r; 752725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_front = ctx->shader->input[front].gpr; 753725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_back = ctx->shader->input[back].gpr; 754725a820b926575265e6790601a0defd9c30947dcVadim Girlin 755725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < 4; i++) { 756725a820b926575265e6790601a0defd9c30947dcVadim Girlin memset(&alu, 0, sizeof(alu)); 757725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 758725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.is_op3 = 1; 759725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.write = 1; 760725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.sel = gpr_front; 761725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[0].sel = ctx->face_gpr; 762725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].sel = gpr_front; 763725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].sel = gpr_back; 764725a820b926575265e6790601a0defd9c30947dcVadim Girlin 765725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.chan = i; 766725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].chan = i; 767725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].chan = i; 768725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.last = (i==3); 769725a820b926575265e6790601a0defd9c30947dcVadim Girlin 770725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 771725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 772725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 773725a820b926575265e6790601a0defd9c30947dcVadim Girlin 774725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 775725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 776725a820b926575265e6790601a0defd9c30947dcVadim Girlin 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 77872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 78196bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 78272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 7885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 7891279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].interpolate = d->Interp.Interpolate; 7901279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].centroid = d->Interp.Centroid; 791024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 792725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 793c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin switch (ctx->shader->input[i].name) { 794c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_FACE: 795725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 796c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 797c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_COLOR: 798725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->colors_used++; 799c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 800c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_POSITION: 801c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx->fragcoord_input = i; 802c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 803c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 804725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 805c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if ((r = evergreen_interp_input(ctx, i))) 806725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 807fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 80850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 8145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 815024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 8161279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->output[i].interpolate = d->Interp.Interpolate; 81791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->output[i].write_mask = d->Declaration.UsageMask; 81891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (ctx->type == TGSI_PROCESSOR_VERTEX) { 81991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (d->Semantic.Name) { 82091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 82191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2); 82291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 82391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 82491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->vs_out_misc_write = 1; 825e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák ctx->shader->vs_out_point_size = 1; 82691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 82754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 82854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->clip_vertex_write = TRUE; 82954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->cv_output = i; 83054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 83191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 8320c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 8330c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin switch (d->Semantic.Name) { 8340c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin case TGSI_SEMANTIC_COLOR: 8350c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin ctx->shader->nr_ps_max_color_exports++; 8360c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin break; 8370c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } 83891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 84233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 84347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 84596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 846c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 847c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 848951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if (!ctx->native_integers) { 849951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin struct r600_bytecode_alu alu; 850951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 85196bbc627f369c0100b950f81531b1fe9ef586c34Christian König 852951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 853951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].sel = 0; 854951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].chan = 3; 85596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 856951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.sel = 0; 857951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.chan = 3; 858951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.write = 1; 859951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.last = 1; 86096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 861951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 862951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin return r; 863951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin } 864c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 86539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 86639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie break; 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 87272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 87372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 876be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 877be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 8797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 880fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 881fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 882fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 883fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 884fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 885fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 886fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 887fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 888fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 889fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 890fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 917fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 921fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 922370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */ 923fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 924fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 925fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 9261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 9271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 9281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 9291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 9301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 9331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 9361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 93796bbc627f369c0100b950f81531b1fe9ef586c34Christian König 9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 9401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 9454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 9481fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 9501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 9511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 95296bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 95339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 95439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 3; 95539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 3; 95639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 3; 95739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 3; 95839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 95939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 96039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 0; 96139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 0; 96239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 0; 96339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 0; 96439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 96539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } 966c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 9671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 9681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 9691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 9701fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 9711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 9731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 9764a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 9814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 983077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 9868e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 987077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 992077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 9954a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 10008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 1006077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 1011077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 1016d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 10184a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 1019077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1020077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1021077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 1022077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 1023077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 10257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10274a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 10327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 10337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 1037077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 1038077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 1039077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 1040077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1041077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 1042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 1043077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 1044077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1045077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1046077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 1047077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 1048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 1049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 10507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 10517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 10524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 10537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 10547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 10557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 10567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 10577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 10587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 10597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 10607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 10624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 10637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 10737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10784a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 10897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 10904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 10957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 11004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 11017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 11067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 11097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 11107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 1111725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx) 1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 1113725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r, count = ctx->shader->ninput; 1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin /* additional inputs will be allocated right after the existing inputs, 1116725a820b926575265e6790601a0defd9c30947dcVadim Girlin * we won't need them after the color selection, so we don't need to 1117725a820b926575265e6790601a0defd9c30947dcVadim Girlin * reserve these gprs for the rest of the shader code and to adjust 1118725a820b926575265e6790601a0defd9c30947dcVadim Girlin * output offsets etc. */ 1119725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr = ctx->file_offset[TGSI_FILE_INPUT] + 1120725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->info.file_max[TGSI_FILE_INPUT] + 1; 1121725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1122725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->face_gpr == -1) { 1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin i = ctx->shader->ninput++; 1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].name = TGSI_SEMANTIC_FACE; 1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].spi_sid = 0; 1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].gpr = gpr++; 1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < count; i++) { 1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) { 1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin int ni = ctx->shader->ninput++; 1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io)); 1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR; 1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]); 1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].gpr = gpr++; 1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_input(ctx, ni); 1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = select_twoside_color(ctx, i, ni); 1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1147725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1148725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1149725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 1151725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1152e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader) 115372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1154eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 11554acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct tgsi_token *tokens = pipeshader->selector->tokens; 11564acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct pipe_stream_output_info so = pipeshader->selector->so; 1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 11585555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 11604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 1161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 1162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 116354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int i, j, k, r = 0; 116454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0; 1165ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Declarations used by llvm code */ 1166ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bool use_llvm = false; 11677f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned char * inst_bytes = NULL; 11687f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned inst_byte_count = 0; 116972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1170ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1171ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = debug_get_bool_option("R600_LLVM", TRUE); 1172ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 117515ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák ctx.native_integers = true; 1176951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin 1177c96b9834032952492efbd2d1f5511fe225704918Dave Airlie r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family); 1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 1183f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1185725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.face_gpr = -1; 1186c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx.fragcoord_input = -1; 1187725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.colors_used = 0; 118854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx.clip_vertex_write = 0; 1189725a820b926575265e6790601a0defd9c30947dcVadim Girlin 11900c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports = 0; 11910c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_max_color_exports = 0; 11920c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin 1193725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side; 1194feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 1196076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 1197076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 1198076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 1199f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 1200f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 1201f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 1202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 1203076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 1204076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 1205076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 1206076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 1207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 1214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 122189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 12224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1223f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 12244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1225f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 122789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 1228fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 122984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 1230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* LLVM backend setup */ 1232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1233ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm && ctx.info.indirect_files) { 1234ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "Warning: R600 LLVM backend does not support " 1235ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "indirect adressing. Falling back to TGSI " 1236ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "backend.\n"); 1237ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1238ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1239ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1240ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct radeon_llvm_context radeon_llvm_ctx; 1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard LLVMModuleRef mod; 1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned dump = 0; 1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx)); 1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT]; 1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); 1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard dump = 1; 1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count, 1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard rctx->family, dump)) { 1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "R600 LLVM backend failed to compile " 1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "shader. Falling back to TGSI\n"); 1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT]; 1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* End of LLVM backend setup */ 1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (!use_llvm) { 1266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT] + 1268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.info.file_max[TGSI_FILE_INPUT] + 1; 1269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 12714d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 1272d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 127397e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 127497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 127597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 1276d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 12777728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 12788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 12794d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 12808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1282cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 1283cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 12845555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 1290cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 1291cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 1292cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 1295cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 1296cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 1297cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 1298cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 1299cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 1303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 1307725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1308725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_PROPERTY: 1309725a820b926575265e6790601a0defd9c30947dcVadim Girlin property = &ctx.parse.FullToken.FullProperty; 131091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (property->Property.PropertyName) { 131191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 1312725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (property->u[0].Data == 1) 1313725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->fs_write_all = TRUE; 131491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 131591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 131691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (property->u[0].Data == 1) 131791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin shader->vs_prohibit_ucps = TRUE; 131891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1321725a820b926575265e6790601a0defd9c30947dcVadim Girlin default: 1322725a820b926575265e6790601a0defd9c30947dcVadim Girlin R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = -EINVAL; 1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin goto out_err; 1325725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1326725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1327725a820b926575265e6790601a0defd9c30947dcVadim Girlin 13280c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (shader->fs_write_all && rctx->chip_class >= EVERGREEN) 13290c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_max_color_exports = 8; 13300c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin 1331c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if (ctx.fragcoord_input >= 0) { 1332cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if (ctx.bc->chip_class == CAYMAN) { 1333cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie for (j = 0 ; j < 4; j++) { 1334cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1335cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1336cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1337cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1338cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1339cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie 1340cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1341cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = j; 1342cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = (j == 3); 1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } else { 1348cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1353c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = 3; 1356cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = 1; 1357cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1358cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1359cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1360cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1361c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 1362c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1363725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (shader->two_side && ctx.colors_used) { 1364725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = process_twoside_color_inputs(&ctx))) 1365725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1366725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1367725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1368725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_init(&ctx.parse, tokens); 1369725a820b926575265e6790601a0defd9c30947dcVadim Girlin while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1370725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_token(&ctx.parse); 1371725a820b926575265e6790601a0defd9c30947dcVadim Girlin switch (ctx.parse.FullToken.Token.Type) { 1372725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_INSTRUCTION: 1373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard continue; 1375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 1377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1379be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 1380be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 1381be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 13821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 13837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 13847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 13857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 13867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 13877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 138889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 139089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 139150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 139250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 139350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 1394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 1395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1399725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1402eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 1403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Get instructions if we are using the LLVM backend. */ 1404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count); 1406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1409457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 1410eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 141154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.clip_vertex_write) { 141254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* need to convert a clipvertex write into clipdistance writes and not export 141354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin the clip vertex anymore */ 141454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 141554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io)); 141654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 141754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg; 141854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 141954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 142054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg+1; 142154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 14235a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin /* reset spi_sid for clipvertex output to avoid confusing spi */ 14245a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin shader->output[ctx.cv_output].spi_sid = 0; 14255a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin 142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->clip_dist_write = 0xFF; 142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0; i < 8; i++) { 142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int oreg = i >> 2; 143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int ochan = i & 3; 143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (j = 0; j < 4; j++) { 143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin struct r600_bytecode_alu alu; 143454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 143554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4); 143654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].sel = shader->output[ctx.cv_output].gpr; 143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].chan = j; 143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].sel = 512 + i; 144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].kc_bank = 1; 144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].chan = j; 144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.sel = ctx.temp_reg + oreg; 144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.chan = j; 144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.write = (j == ochan); 144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (j == 3) 144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.last = 1; 144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin r = r600_bytecode_add_alu(ctx.bc, &alu); 144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (r) 145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin return r; 145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 145354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 145454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1455543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák /* Add stream outputs. */ 1456543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 1457543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < so.num_outputs; i++) { 1458543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct r600_bytecode_output output; 1459543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1460543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (so.output[i].output_buffer >= 4) { 1461543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 1462543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák so.output[i].output_buffer); 1463543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = -EINVAL; 1464543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1465543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 14668ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák if (so.output[i].dst_offset < so.output[i].start_component) { 14678ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák R600_ERR("stream_output - dst_offset cannot be less than start_component\n"); 14682449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák r = -EINVAL; 14692449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák goto out_err; 1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák memset(&output, 0, sizeof(struct r600_bytecode_output)); 1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.gpr = shader->output[so.output[i].register_index].gpr; 1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.elem_size = 0; 14758ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.array_base = so.output[i].dst_offset - so.output[i].start_component; 1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 1477543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.burst_count = 1; 1478543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.barrier = 1; 1479c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin /* array_size is an upper limit for the burst_count 1480c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin * with MEM_STREAM instructions */ 1481c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin output.array_size = 0xFFF; 14828ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component; 1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.bc->chip_class >= EVERGREEN) { 1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1485543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1486543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 1490543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1491543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1492543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 1493543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } else { 1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output); 1515543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (r) 1516543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1517543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1518543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1519543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1520eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 152154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0, j = 0; i < noutput; i++, j++) { 152254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 152354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 152454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 152554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 152654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 152754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 152854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 3; 152954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 153054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 153154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = -1; 153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1533457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 1534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 153591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (shader->output[i].name) { 153691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_POSITION: 153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 153991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 154091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 154191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j--; 154791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 154891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* spi_sid is 0 for clipdistance outputs that were generated 155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin * for clipvertex - we don't need to pass them to PS */ 155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (shader->output[i].spi_sid) { 155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* duplicate it as PARAM to pass to the pixel shader */ 155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output)); 155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 155854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 155954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 156091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 156113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin case TGSI_SEMANTIC_FOG: 156213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_y = 4; /* 0 */ 156313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_z = 4; /* 0 */ 156413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_w = 5; /* 1 */ 156513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin break; 1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 15700c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin /* never export more colors than the number of CBs */ 15710c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) { 15720c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin /* skip export */ 15730c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin j--; 15740c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin continue; 15750c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } 157626cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 157754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 157854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 15790c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports++; 15804f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 15810c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin for (k = 1; k < rctx->nr_cbufs; k++) { 158254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 158354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 158454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 158554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 158654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 158754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 158926cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 159054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 159154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 159254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 15950c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports++; 1596feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 1597feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 15985f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 160054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 2; 160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 160439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 160654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 160754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 160854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 160954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 162072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 162154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 162254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (output[j].type==-1) { 162354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 162454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 162554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 1626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 162754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 162954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) { 163054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 163154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 163754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 163954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 164054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1643c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1645481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 16460c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) { 164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 165454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 165654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 165754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 165854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 165954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1660481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 166154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 166254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput = j; 166354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1664457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 1665457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 166689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 1670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1671b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 1672b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 1673a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1674c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1675c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 1677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 16784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 1679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 168389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 16844a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1686783e4da72aa203a645737dec81b001341951a942Vadim Girlin /* check GPR limit - we have 124 = 128 - 4 1687783e4da72aa203a645737dec81b001341951a942Vadim Girlin * (4 are reserved as alu clause temporary registers) */ 1688783e4da72aa203a645737dec81b001341951a942Vadim Girlin if (ctx.bc->ngpr > 124) { 1689783e4da72aa203a645737dec81b001341951a942Vadim Girlin R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr); 1690783e4da72aa203a645737dec81b001341951a942Vadim Girlin r = -ENOMEM; 1691783e4da72aa203a645737dec81b001341951a942Vadim Girlin goto out_err; 1692783e4da72aa203a645737dec81b001341951a942Vadim Girlin } 1693783e4da72aa203a645737dec81b001341951a942Vadim Girlin 16943b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 1698cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1705f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1706f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 17154a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1716a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1717a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1718a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1719a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1720a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1721a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1722a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1723a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1724a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1725a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1726a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 17274a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1728f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1729f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1730f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1731f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1732f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 17334a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 17343efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 17353efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 17363efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 17373efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 173880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 173980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 174080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 17414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 17437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 174947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 175047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 17517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 17527a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 17537a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1756dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1758dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1759d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1760d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1761dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1762d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1763d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1764d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1765dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1766dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1767dffad730df17983cfaef0808555a8c26cad0aa15Christian König 17689b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1769dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1770dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17714a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1772dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1773dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1775d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1776d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1778d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 17794a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 178080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1782d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1783d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 17884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 17894a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 17944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 17967a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 17974a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 17987a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18029b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1812d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1813d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 18149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1815d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1816d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1817d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1818d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 18199b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 18209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 18219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 18229b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 18239b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 18249b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1825d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1826d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1827cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1828cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1829cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1830cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1831cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1832cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1833cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1834cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1835cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1836cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1837cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1852cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1853cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1854cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1855cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1856cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 18624a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 18664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18694a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 18737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 18817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 18827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1883d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx) 1884d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{ 1885d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1886d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int i, j, k, r; 1887d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct r600_bytecode_alu alu; 1888d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 1889d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (k = 0; k < last_slot; k++) { 1890d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << k))) 1891d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie continue; 1892d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 1893d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (i = 0 ; i < 4; i++) { 1894d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1895d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1896d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1897d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], k); 1898d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.dst.write = (i == k); 1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (i == 3) 1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.last = 1; 1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (r) 1905d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return r; 1906d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1907d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1908d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return 0; 1909d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie} 1910d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 19117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 191288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 191388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 191488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 191588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 19161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 191788f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 191896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 191996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 192096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 192196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 192296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 19234a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 19247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 19254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 192788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 192888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 192988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 193088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 193188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 193288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 19347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1935921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 193688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1937a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 193896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1939ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 194088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 194288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 194488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19454a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1946a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 19477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 194988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 195088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 195188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 195388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 195488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 195788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 195888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1960a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 196188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 196288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 196388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 196488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 196688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 196788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 19697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1970921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 197188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1972921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1973ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 197496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 197589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1976a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1977a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 197896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 197996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 198096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 198196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 198296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 198396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 198488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 198688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 198892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 198992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 199092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 19917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 19927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 19937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19944a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 19957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 19967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 19987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 19997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 20044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 202292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 202392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 202492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20254a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 202692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 202892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 20291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 203092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 203192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 203288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 20334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 203488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 203588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 203688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 203788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 203888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 203988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 204088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 204188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 20424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 204388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 204488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 204588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 204688f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 2047be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 2048be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2049be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 2050be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 20514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2052a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2053be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 2054be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 205580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2056be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 205788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 20584a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 205988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 206088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 206188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 206288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 206388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 206488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 206592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 206692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 206792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20684a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 20697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 207092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 207157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 207257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 207357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 207457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 20751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 207657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 207757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 207857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 207992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 208092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 208157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 208289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 20844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 20917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 20927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 210492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 211257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 211392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 211492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 211557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 211689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 21184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 21207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 21247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 21257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 213757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 214557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 214692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2147ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 2148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 21494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 215380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 2154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 2156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21604a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 21674a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 217180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 218392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 218492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 218592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2186094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 2187094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 21884a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2189094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 2190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 2191094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 21924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2193094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 21944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 21964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2197921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 21984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 21994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 22004502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 22014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 22024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 22034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 22044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 2205094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 2206094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 2207094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 22084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 2210094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 2211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 22124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 22134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 22144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 22154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 2216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 2217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 2218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 22190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 22200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 22210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 22224a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 22230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 22240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 2225f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 22264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2227f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 22284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 2229f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2230f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 2231f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2232f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2233f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 2234f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 2235f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2236f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 22374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2238f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 2239f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 2240f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 22410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 22420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 22436a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 22446a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 22466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 224789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2252f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2253f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 2254f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2255f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 22624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 2267f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2270f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2271f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 22722fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 22732fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 22742fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 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 22816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 22826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 22830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 228486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 22854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2286a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 228786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 228886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 22894a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 22904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 22910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 22920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 22930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 22940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 22950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 22964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 22980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 22990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 230089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 23017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 23027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 23034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 23077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 23087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 23097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 23134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 23194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23254a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 2330abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 23318567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 23324a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23338567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 23348567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 23358567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 23368567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 23378567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 23384a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23398567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 23408567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 23418567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 2342abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 23434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2344abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 23454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2346abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2347abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 2348abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 2349abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 23504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2351abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2352abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2353abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 2354abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 23554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2356abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2357abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 2359abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2360abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 2361abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 23624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2363abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2364abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2365abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 23660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 23670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 23680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 236942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 237042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 237142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23724a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 237342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 237442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 23754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2376df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2377370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 2378df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2379df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 2380df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2381df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 2382df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 238342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 23844a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 23854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 238642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 238742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 238842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 238942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 23904a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 239142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 239242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 239342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 239442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 239542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 239642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 2397a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 23987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 23997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24004a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 24027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 24037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 24044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2406a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 24077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 240880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 24107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 24117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 24124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 24147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 24157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 24167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 24177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 24187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 2419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 2420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 2421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24224a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 2424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 24254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 24284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 2429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 2430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 24334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 24417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 24427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 24444a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 24457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 24467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 24484a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 24624a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 24754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 2490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 2491a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 24924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 2494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 2495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 24964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2497a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24984a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2503a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 25064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 250766f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 25084a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 2510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2512a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 25174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2518a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25234a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2524a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2525a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2526a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op) 2530332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{ 2531332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2532332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct r600_bytecode_alu alu; 253329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int i, r, j; 2534332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 2535332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp0 = ctx->temp_reg; 2536332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp1 = r600_get_temp(ctx); 25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin int tmp2 = r600_get_temp(ctx); 253829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int tmp3 = r600_get_temp(ctx); 25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* Unsigned path: 25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * we need to represent src1 as src2*q + r, where q - quotient, r - remainder 25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 1. tmp0.x = rcp (src2) = 2^32/src2 + e, where e is rounding error 25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 2. tmp0.z = lo (tmp0.x * src2) 25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 3. tmp0.w = -tmp0.z 25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 4. tmp0.y = hi (tmp0.x * src2) 25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src2)) 25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error 25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 7. tmp1.x = tmp0.x - tmp0.w 25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 8. tmp1.y = tmp0.x + tmp0.w 25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) 25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 10. tmp0.z = hi(tmp0.x * src1) = q 25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 11. tmp0.y = lo (tmp0.z * src2) = src2*q = src1 - r 25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 12. tmp0.w = src1 - tmp0.y = r 25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 13. tmp1.x = tmp0.w >= src2 = r >= src2 (uint comparison) 25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 14. tmp1.y = src1 >= tmp0.y = r >= 0 (uint comparison) 25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * if DIV 25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.z + 1 = q + 1 25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.z - 1 = q - 1 25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * else MOD 25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.w - src2 = r - src2 25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.w + src2 = r + src2 25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * endif 25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 17. tmp1.x = tmp1.x & tmp1.y 25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z 25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z 25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z 25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20. dst = src2==0 ? MAX_UINT : tmp0.z 25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Signed path: 25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Same as unsigned, using abs values of the operands, 25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * and fixing the sign of the result in the end. 25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin */ 2584332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2585332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin for (i = 0; i < 4; i++) { 2586332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin if (!(write_mask & (1<<i))) 2587332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin continue; 2588332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 2590332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = -src0 */ 25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2594332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 2598332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2600332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2602332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = -src1 */ 2608332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2610332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2613332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2614332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2616332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2618332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.z sign bit is set if src0 and src2 signs are different */ 26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* it will be a sign of the quotient */ 26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (!mod) { 26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT); 26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2636332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2637332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = |src0| */ 26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2658332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = |src1| */ 26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 1; 26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2678332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2679332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 1. tmp0.x = rcp_u (src2) = 2^32/src2 + e, where e is rounding error */ 268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp3.x = u2f(src2) */ 268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT); 2685332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 268929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp0.x = recip(tmp3.x) */ 270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 3; j++) { 270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 0); 270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (j == 2) 271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].value = 0x4f800000; 272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (r) 273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT); 273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 274629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 27484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT); 27524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 276429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 276529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 2. tmp0.z = lo (tmp0.x * src2) */ 277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2774332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 2778332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 277929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 278029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 278629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 279029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2795332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 280729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 3. tmp0.w = -tmp0.z */ 28154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 28174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 28194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 28204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 28214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 28234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 28244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 28254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 4. tmp0.y = hi (tmp0.x * src2) */ 283129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 283229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 283329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 283429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 283629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 283729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 283829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 284029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 284129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 284329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 284429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 284529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 284629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 284729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2856332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 286929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 287229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 2875332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src)) */ 28774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 28794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2880332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 28824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 28834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 28844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error */ 289729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 289829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 289929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 290029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2901332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 290229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 290329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 290429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 3); 29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 290629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 290729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 290929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 291029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 291229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 291729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 292129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 3; 292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 292429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 292729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 7. tmp1.x = tmp0.x - tmp0.w */ 29364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2938332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2939332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 2941332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2942332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 29454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 29474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2948332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2950332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2951332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 8. tmp1.y = tmp0.x + tmp0.w */ 2953332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 2955332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2956332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 29574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2958332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2959332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 29624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 2964332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2965332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2968332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */ 29704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 29724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2973332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 29754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 29764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 29804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 29814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 29834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 29844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 10. tmp0.z = hi(tmp0.x * src1) = q */ 299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 299229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 299329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 299529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 299629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 299729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 299929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 300029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 30014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 300529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 301029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 301429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 30164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 302929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 11. tmp0.y = lo (src2 * tmp0.z) = src2*q = src1 - r */ 303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 303929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 30414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 30454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 304629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 304729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 305129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 305229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 305429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 305629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 305729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 306129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 30634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 30674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 307129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 307429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 307629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 307729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 307829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 307929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 308029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 308129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 12. tmp0.w = src1 - tmp0.y = r */ 30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 30974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 13. tmp1.x = tmp0.w >= src2 = r >= src2 */ 31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 3108332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3109332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 3111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3112332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3121332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 3125332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 14. tmp1.y = src1 >= tmp0.y = r >= 0 */ 31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3146332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3147332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { /* UMOD */ 3149332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.w - src2 = r - src2 */ 3151332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3153332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3154332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 3156332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3157332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 3160332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.w + src2 = r + src2 */ 31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { /* UDIV */ 31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.z + 1 = q + 1 DIV */ 31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.z - 1 = q - 1 */ 32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT; 32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3225332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3227332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 3228332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 17. tmp1.x = tmp1.x & tmp1.y */ 32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT); 32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3236332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 32414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z DIV */ 32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z MOD */ 3248332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 3251332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3255332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = mod ? 3 : 2; 32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */ 32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3279332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3280332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.src[0].sel = tmp1; 32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 3286332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3289332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3290332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the sign of the result */ 32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { 32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* sign of the remainder is the same as the sign of src0 */ 33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */ 33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the quotient sign (same as the sign of src0*src1) */ 33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */ 33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3370332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return 0; 3371332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin} 3372332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx) 33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 0); 33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx) 33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 0); 33814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx) 33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 1); 33864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx) 33894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 1); 33914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3393a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3394a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 3395a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{ 3396a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3397a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct r600_bytecode_alu alu; 3398a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int i, r; 3399a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 3400a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 3401a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3402a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3403a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3404a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3405a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3406a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3407a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 3408a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.sel = ctx->temp_reg; 3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.chan = i; 3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.write = 1; 3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (i == last_inst) 3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = ctx->inst_info->r600_opcode; 3427a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].sel = ctx->temp_reg; 3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].chan = i; 3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3433cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT) 3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3437a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3438a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3439a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3440a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return 0; 3441a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin} 3442a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 34436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 34446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{ 34456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 34466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct r600_bytecode_alu alu; 34476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int i, r; 34486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 34496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 34506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* tmp = -src */ 34526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 34586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.sel = ctx->temp_reg; 34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.chan = i; 34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* dst = (src >= 0 ? src : tmp) */ 34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.is_op3 = 1; 34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].sel = ctx->temp_reg; 34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].chan = i; 34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 34936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 34946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 34956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 34966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return 0; 34976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin} 34986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 349942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx) 350042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{ 350142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 350242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct r600_bytecode_alu alu; 350342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int i, r; 350442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 350542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 350642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 350742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* tmp = (src >= 0 ? src : -1) */ 350842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 350942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 351142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 351242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 351342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 351442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.sel = ctx->temp_reg; 351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.chan = i; 351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT; 352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* dst = (tmp > 0 ? 1 : tmp) */ 353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT); 353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].sel = ctx->temp_reg; 354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].chan = i; 354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = ctx->temp_reg; 354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].chan = i; 355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 355442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 355542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 355642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 355742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return 0; 355842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin} 355942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 35606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35620d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 35630d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 35640d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3566921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 35670d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35680d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 35690d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 35704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3571a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 35720d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 3573cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 35740d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 3575cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 35760d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3578921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 35794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35810d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 35820d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 35834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 35840d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 35850d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 35860d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 35870d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35880d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 35890d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 35904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3591a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 359380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 35940d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35950d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 3596cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 35970d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3599921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 36010d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36020d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 3603cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 36040d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 36060d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 36074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36080d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 36090d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 36100d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 36110d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 36120d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 36130d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 3615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 36164a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 3618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3619cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 36204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 3622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 36236c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 3624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 3625a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 362680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 3628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 3629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 3632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 36334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 3635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 3636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 3638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 3641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 3642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36434a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 3645dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 36477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 36487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 36497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 36507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 36514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 365780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 3659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 3660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 36617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 3672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 3673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 3676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 36784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3679cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36814a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3683a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 368480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 3686a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 3688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 3689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 3690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 3691921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3694cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 3696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 3697921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3701e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 3702e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 3703e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 3704e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 3705e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 3706e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 3707e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 3708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 3709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 3711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 3712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 37144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 37187be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 3720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 37216415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 37226415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 37236415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 37246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 3726192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_INPUT && 3727192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_OUTPUT) || 37286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 37296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 37306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 37316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 37326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 37336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 37346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 37366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 37376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 373833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 373933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 374096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 374133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 37434a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3744641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 374540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 3746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 3747da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 3748da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 37496d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ && 37506d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tgsi_tex_src_requires_loading(ctx, 0); 375178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 37526d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1; 375378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint8_t offset_x = 0, offset_y = 0, offset_z = 0; 3754641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 3756641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37571d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 37581d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 37591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 37601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 37611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 37621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 37631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 37641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 37651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 37661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 376713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 376813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 376913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 377040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 377140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 37724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 377340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 377440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 377540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 377640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 377740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 377840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 377940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 378040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 378140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 378240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 378340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 378440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 378540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 37864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 378740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 37884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 379140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 37944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 379740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 379813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 379940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 380240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 380440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 380540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 380840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 380940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 381040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 381140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 381240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 381340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 381440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 38154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 381640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 381740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 381813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 381913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 38207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 3821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 382289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 38247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38274a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 38424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 3855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 38564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3857a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 38604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 38684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3869a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3870921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 3872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3875b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 387978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 38839783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE || 38849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) && 38856d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák inst->Instruction.Opcode != TGSI_OPCODE_TXQ && 38866d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) { 3887261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie 38880e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 38890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 3890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 38934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 38954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 38964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 3899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 3900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 3901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 39024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 390889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 39104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 39137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 39147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 39214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 39264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 39297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 39354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 3941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 39427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 3943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 39444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3945a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 3950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3955a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39614a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39654a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3966a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 3971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3976a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 3980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 39834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 39869783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie /* write initial W value into Z component */ 39879783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 39889783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39899783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 39909783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 39919783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.sel = ctx->temp_reg; 39929783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.chan = 2; 39939783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.write = 1; 39949783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.last = 1; 39959783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 39969783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (r) 39979783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie return r; 39989783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 399978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 4000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 4001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 4002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 400378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 4004b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 40054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4006a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 40074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4008b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 4009b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 4010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 4011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 4012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 40134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 4015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 4016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 401778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 4018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 4019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 40207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4021bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 4022929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4023929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 40246b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 40259783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || 4026929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 4027929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 4028de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 4029de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 4030de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 4031de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4032de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 4033de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 4034de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4035c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 4036c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 4037c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 4038de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 4039de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 4040de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4041de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 4042de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 404333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 40444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 4045bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 40466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 40476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 4048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 4049641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 40506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 40519d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 40529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 40539d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 40549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 40556d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák 40566d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) { 40576d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_x = 4; 40586d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_y = 4; 40596d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_z = 4; 40606d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_w = 4; 40616d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák } else if (src_loaded) { 406278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 406378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 406478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 406578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 406678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 406778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 406878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 406978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 407078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 4071244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 407278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 40739a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 4074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 4075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 4076bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 4077bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 4078bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 4079bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 40809783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 40819783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_x = 1; 40829783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_y = 0; 40839783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_z = 3; 40849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_w = 2; /* route Z compare value into W */ 40859783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 4086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 40876b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 40886b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 408901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 409001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 409101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 40926b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 40936b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 4094bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 40951d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 40961d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 40971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 409869d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 4099929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 4100929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 4101929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 4102929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4103929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 41046b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 4105929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 4106929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 4107929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 410878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 4109929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4110929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 4111929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 4112929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 4113929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 4114929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 4115929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 4116929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 4117929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 4118929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4119929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4120929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 4121929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4122929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 4123929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 4124929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4125929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 41274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 4128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 4129bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 4130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 4131bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 4132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 413333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 413433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 4135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 4136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 4137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 41384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4139dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 4141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 4142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4143c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 41441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 4145c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 4146c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4147c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 4148c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 41494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4150c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 41514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 41524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4153c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 415480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4155c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 4156c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 4157c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 4158c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 41594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4160c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 4161c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 4162c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4163c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 4164c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4165c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 4166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4168dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4169dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4170dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4172a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 4173921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 4174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 41754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 41764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 4177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4179dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4180b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 41834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4186b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 4189dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4190dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4191dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4192dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4194a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 4196b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 41974a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4198b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4199b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4200dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4201b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4203b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 42044a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4205b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4207b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4208b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 4210dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4211dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4212dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4213dffad730df17983cfaef0808555a8c26cad0aa15Christian König 42144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4215a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 42174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 42184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 4219b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 4220b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 4221dffad730df17983cfaef0808555a8c26cad0aa15Christian König 422280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4223b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4224dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4225b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4226b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 42274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4228b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4229b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4231dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 4232b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 4233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 423487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 423587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 423687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42374a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 423887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 4239dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 424087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42417be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 42427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 42437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 424487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42454a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4246a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 42474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 42484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 42494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 425080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 425187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 425287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 425387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 42547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 425587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 42564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 425787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 425887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 42597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 426087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 426187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 426287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 42640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 42650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42660e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 42670e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 42684a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 42690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 42700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 42710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 42730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 42764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4277a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 42780e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 42794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 42804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 42810e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 42820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 42830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 42840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 42850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 42860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 42890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 42900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 42910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 42944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 42950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 42960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 43004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4301a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43030e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 43044a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 43054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 43060e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 43070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 43080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 43090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 43110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 43140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 43150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 43160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 431980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 432080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 43210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 43220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 43230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 43240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 43250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 43264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 43280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 43290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 43310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 43320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 43330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 43340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 433536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 433636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 433736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 43384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 433909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 43407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 434136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 434236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 434336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 43444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 434536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4346a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 43474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 434936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 435036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 435136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 435236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 43534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 435436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 435536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 435636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 435789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 43587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 43617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 436236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 43657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 43667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 43687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 43737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 43747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 43767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 43777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 43787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 43807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 43824a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 438636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 43877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 438836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 438936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 43904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 439136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4392a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 43934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 439436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 439536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 4396b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 4397b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4398b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 4399b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 4400b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 440136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 440236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 440336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 440436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 440536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 440736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 440836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 440936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 441036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 441136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 441236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 441389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 44154a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 44174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 441836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 44217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 44227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 442536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44314a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 44334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 443436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 44387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 444536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 444636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 444736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 444836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 44494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 445036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4451a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 445236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 445336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 445436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 445536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 445636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 445736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 445836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 44594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 446036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 446136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 446236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 446336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 446436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 446587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 4466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 4467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 4468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 44694a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 4472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4473f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 4474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 447589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 44767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 44774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 44797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44814a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 44857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 44887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 44947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 44984a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 44994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 45007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 45037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 4512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 4516460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4518460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 45194a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4522460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4523460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4524f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 4525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 4526460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 452789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45294a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 453096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 453496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45474a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 45527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 45557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45584a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 456296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 456496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 456596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 456696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 456796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 456896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 456996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 457096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 457196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 457296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 457396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 457596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 457696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 457796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 457889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45804a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 45837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 45847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 45887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 459196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 45967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 45997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 460196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 46047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 460696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 461196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 461289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 46187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 46257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 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 alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 46337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 463596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 46387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 464096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 464596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 464796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 464896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 464996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 465296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 465396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 465496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 4655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 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 4666f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 4667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 466889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 46734a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46744a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 4675460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 46807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 4682460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 46877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 46884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 46914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 46937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 46977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 46987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 47007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 47017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 47027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4703460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4704460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4705460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 4706460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 47074a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4708460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4709460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4710460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 4711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4712460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4713460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 4715460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4716460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4717460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 47184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4719460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4720460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4721460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4723460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 4724460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 4725460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 472698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 472798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 472898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47294a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 473098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 4731a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 47324a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 473398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 473452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 473552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 473652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 473752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 473852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 473952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 474052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 47419b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 47428e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 47439b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 474452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 474552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 474652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 474752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 474852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 47498e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 475098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 47518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 47528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 47534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 475498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 475598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 47568e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 47578e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 475898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 475998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 476098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 476147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 476247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47634a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 476447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 4765a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 47667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 47677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 4768077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4769077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 47704a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47718e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4772077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4773077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4774077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47754a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4776077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 4777077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 4778077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4779077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 47808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 47818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4782077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4783077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4784077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47854a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4786077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 47877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 47887ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 4789077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4790077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 47914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4793077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4794077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4795077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 47964a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4797077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 47987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 47999b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 48008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 48018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 48028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 48038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 48048e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 48058e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 48068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 48078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 48088e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 48099b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 48107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 48117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 48127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 48137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 48147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 48158e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 481647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 481747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 481847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 481957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 482057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 482157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 48224a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 482357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 482457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 482557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 48264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 482757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4828a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 482980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 48307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 48317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 483257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 483357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 48344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 483557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 483657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4837a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 483857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 483957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 48404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 484157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 484257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 484357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 48444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 484557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 484657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 484757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 484857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 484957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 485057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4851a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 4852a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 48534a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4854a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 4855a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4857a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 4858da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.execute_mask = 1; 4859da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.update_pred = 1; 4860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4861a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 4862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 4863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 4864a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 4867a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 48687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 4870a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 4872a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 4873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 4874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4876a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 4878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 48792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 48802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 48812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 48822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 48832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 48844f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 48852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 48864f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 48872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 48882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 48892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 48902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 48914f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 48922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 48932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 48944f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 48952bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 48962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 48972bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 48982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 48992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 49002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 49012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 49024a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 49038813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 49048813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 49058813842121d46d1be476807c98b0ba0b771f0c91Christian König } 49062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 4907a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4908a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4909a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 491009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 4911a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 491209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 491309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 491409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 491509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 491609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 491709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 491809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 491909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 492009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 492209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 492309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 492409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 492509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4926a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 4938a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 4939a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 4940a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 49487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 496409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49734a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 49744a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4978a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 4981a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 499909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 500009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50024f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 500409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 500709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50094f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 5011370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX work out offset */ 501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 501309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 5014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 502009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 503309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 503609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 504609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 504809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50498b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 5056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 5060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 50614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 5062a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 5063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 506409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 5065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 5066a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5069a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 5070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 5071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 5072a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 5073a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 5074a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 5075a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 5076a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5077a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 5078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 5079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 5080a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 5082a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 508309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 508409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 508509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 508609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 508709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 508809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 508909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 509209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 509309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 5094a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 509509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 509609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 509709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 509809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 509909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 510009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 510109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 510209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 510309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 51044a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 510509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 510609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 510809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 511509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 511709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 511809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 511909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 512209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 5123370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX add LOOPRET support */ 512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 512909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 513209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 513409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 513509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 513609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 513709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 513809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 513909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 514109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 514209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 514309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 51444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 514509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 514609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 514709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 514809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 5149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5151a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5152cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 5153cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 5154cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5155cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 5156cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 5157cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 5158cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5159cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 5160cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5161cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5162cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5163cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5164cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5165cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5166cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 5167cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 5168cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 5169cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5170c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 5171cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 5172cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 5173cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5174cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 51759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 5176cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5177cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5178cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5179cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5181cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5186cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5189c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5190cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5191cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 5192cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 5193cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5194cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 5195cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 5196cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 5197cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5198cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5199cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5200cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5201cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5202cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 5203cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 5204cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 520698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 52080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5209df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 5210370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 5211df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 5212df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 5213df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 5214df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 5215df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 521642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 521736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5218460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5221cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5222cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 522357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5224dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5226d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5227be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52403af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5241df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 52427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 52434558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 5244a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 52450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52487a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5250e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 525188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 52523af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 52533af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 52544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52600d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52620d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 526388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 5264d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 52650d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5267b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 526813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5269b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52769f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52800d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 528187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 528292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5283c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5286cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5287ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 528809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5289a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5293a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5294a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53008c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5301c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5302cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 53030ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5304d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans}, 5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5307c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5308c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 53094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5310cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 53131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 531409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 531709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 531909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53216d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5336094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5340bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 5341332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5342c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5343c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 53445893e686b691013525cb2608c3d605be2d8ea471Dave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5345c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5346d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans}, 53470196433ce55b7e005c483bd7c411844eb44e983bDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5348c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 53499a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5350c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 53514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5352c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5353c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5354c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 53554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5356850021f225f312d55fb6a24a8cef805f527510afDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5357c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5358c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5359d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans}, 53607383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5361c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 5362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5366cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5367a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5368a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5369cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5370cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5371cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5372cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5373cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5374cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5375a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5376cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5377cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 53789b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 53799b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 53806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 538142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 538450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 538550526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 538698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 538750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 538850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 538950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 53908ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 539150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5392112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 539350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 539450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 539550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 539650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 539750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 539850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 539950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 540050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 540150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 540250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 540350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 540450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 540550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 540650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 540750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 540850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 540950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 541050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 541150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 541450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5415df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 541850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 542050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 542650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 542750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 543550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 543750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 543850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 543950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 544050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 544150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 544213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 544350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 544450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 54567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5457c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 54587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 54617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 54627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 54637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 54647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 54687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 54697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54748c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5475608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5478d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5481cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5482cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 54834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5484cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 54857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 54871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 54897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 54927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 54947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54956d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 55117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 55127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5514a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 5515332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5516cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5517cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5518cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5519cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5520d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5521cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5522a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 5523b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5524cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 55254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5526cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5527cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5528cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 55294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 55309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5531cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5532cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5533d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 55347383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5535cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5540cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5541a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5542a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5543cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5544cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5545cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5546cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5547cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5548cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5549a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5550cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5551cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 55529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 55539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 55546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 555542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 55567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 55587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 55597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 55607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 55617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 55627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 55637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 55647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 55657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 55667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 55687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 55697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 55727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 55737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 55747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 55757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 55767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 55777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 55787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 55797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5589df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 56007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 56017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 56097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 56117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 56127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 56137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 56147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 561613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 56177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 56187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 561950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 562550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 562850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 562950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 563050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5631c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 563250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 563350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 563450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5635ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 563650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 563750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 563850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 563950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 564250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 564350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 564450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56488c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5649f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2}, 5650cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 56510ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5652f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5655f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5656f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 565729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5658cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 565950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 56611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 566250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 566350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 566650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 566850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56696d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 567150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 567650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 568050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 568150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 568250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 568350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 568450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 568550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 568650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 568750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5688f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 568929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5690cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5691cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5692f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5693f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5694f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5695f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5696f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 5697f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 5698f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 569929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5700f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5701f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5702f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 570329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5704d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr}, 5705f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5706f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5707f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 5708f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5709f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 571050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5714cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5715a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5716a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5717cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5718cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5719cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5720cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5721cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5722cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5723a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5724cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5725cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5726f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 57279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5728f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5729f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 573050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 573150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 5732