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; 2968f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune unsigned push_modifier; 297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard for(src_idx = 0; src_idx < 3; src_idx++) { 300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, 301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &alu, src_idx); 302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.sel = bytes[bytes_read++]; 305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.chan = bytes[bytes_read++]; 306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.clamp = bytes[bytes_read++]; 307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.write = bytes[bytes_read++]; 308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.dst.rel = bytes[bytes_read++]; 309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst0 = bytes[bytes_read++]; 310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst1 = bytes[bytes_read++]; 311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.inst = inst0 | (inst1 << 8); 312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.last = bytes[bytes_read++]; 313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.is_op3 = bytes[bytes_read++]; 3148f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune push_modifier = bytes[bytes_read++]; 315da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.pred_sel = bytes[bytes_read++]; 316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle = bytes[bytes_read++]; 317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.bank_swizzle_force = bytes[bytes_read++]; 318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.omod = bytes[bytes_read++]; 319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard alu.index_mode = bytes[bytes_read++]; 3208f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune 3218f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune 3228f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE) || 3238f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE) || 3248f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT) || 3258f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)) { 3268f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.update_pred = 1; 3278f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.dst.write = 0; 3288f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.src[1].sel = V_SQ_ALU_SRC_0; 3298f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.src[1].chan = 0; 3308f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.last = 1; 3318f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune } 3328f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune 3338f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune if (push_modifier) { 3348f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.pred_sel = 0; 3358f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune alu.execute_mask = 1; 3368f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3378f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune } else 3388f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune r600_bytecode_add_alu(ctx->bc, &alu); 3398f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune 340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Handle other KILL instructions */ 342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) { 343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->shader->uses_kill = 1; 344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: This should be enforced in the LLVM backend. */ 345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->bc->force_add_cf = 1; 346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu, 351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned pred_inst) 352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fc_pushlevel(ctx, FC_IF); 355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard callstack_check_depth(ctx, FC_PUSH_VPM, 0); 356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx, 359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu *alu, unsigned compare_opcode) 360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_BRK; 362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) 363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; 364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else if (ctx->bc->chip_class >= EVERGREEN) 365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; 366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard else 367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; 368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, alu, compare_opcode); 369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_endif(ctx); 371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, 374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_alu alu; 377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned inst; 378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&alu, 0, sizeof(alu)); 379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0); 380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard inst = bytes[bytes_read++]; 381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst) { 3822fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 0: /* FC_IF */ 383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard llvm_if(ctx, &alu, 384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3862fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 1: /* FC_IF_INT */ 387bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune llvm_if(ctx, &alu, 388bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3902fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 2: /* FC_ELSE */ 391bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_else(ctx); 392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3932fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 3: /* FC_ENDIF */ 394bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_endif(ctx); 395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3962fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 4: /* FC_BGNLOOP */ 397bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_bgnloop(ctx); 398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 3992fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 5: /* FC_ENDLOOP */ 400bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune tgsi_endloop(ctx); 401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 4022fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 6: /* FC_BREAK */ 403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_break_from_byte_stream(ctx, &alu, 404bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 4062fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 7: /* FC_BREAK_NZ_INT */ 407bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune r600_break_from_byte_stream(ctx, &alu, 4082fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 409bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune break; 4102fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 8: /* FC_CONTINUE */ 411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard { 412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned opcode = TGSI_OPCODE_CONT; 413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (ctx->bc->chip_class == CAYMAN) { 414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &cm_shader_tgsi_instruction[opcode]; 416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else if (ctx->bc->chip_class >= EVERGREEN) { 417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &eg_shader_tgsi_instruction[opcode]; 419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx->inst_info = 421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard &r600_shader_tgsi_instruction[opcode]; 422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tgsi_loop_brk_cont(ctx); 424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 4262fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 9: /* FC_BREAK_Z_INT */ 42718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard r600_break_from_byte_stream(ctx, &alu, 42818617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT)); 42918617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard break; 4302fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard case 10: /* FC_BREAK_NZ */ 4312fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard r600_break_from_byte_stream(ctx, &alu, 4322fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 4332fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard break; 434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx, 440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned bytes_read) 441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct r600_bytecode_tex tex; 443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.inst = bytes[bytes_read++]; 445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.resource_id = bytes[bytes_read++]; 446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_gpr = bytes[bytes_read++]; 447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_rel = bytes[bytes_read++]; 448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_gpr = bytes[bytes_read++]; 449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_rel = bytes[bytes_read++]; 450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_x = bytes[bytes_read++]; 451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_y = bytes[bytes_read++]; 452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_z = bytes[bytes_read++]; 453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.dst_sel_w = bytes[bytes_read++]; 454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.lod_bias = bytes[bytes_read++]; 455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_x = bytes[bytes_read++]; 456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_y = bytes[bytes_read++]; 457ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_z = bytes[bytes_read++]; 458ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.coord_type_w = bytes[bytes_read++]; 459ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_x = bytes[bytes_read++]; 460ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_y = bytes[bytes_read++]; 461ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.offset_z = bytes[bytes_read++]; 462ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.sampler_id = bytes[bytes_read++]; 463ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_x = bytes[bytes_read++]; 464ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_y = bytes[bytes_read++]; 465ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_z = bytes[bytes_read++]; 466ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard tex.src_sel_w = bytes[bytes_read++]; 467ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 468ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_add_tex(ctx->bc, &tex); 469ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 470ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard return bytes_read; 471ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 472ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 473e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx, 474e42df8e10a83e76565474f82330d34403da71b49Tom Stellard unsigned char * bytes, unsigned bytes_read) 475e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{ 476e42df8e10a83e76565474f82330d34403da71b49Tom Stellard struct r600_bytecode_vtx vtx; 4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read); 4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read); 4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read); 4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 482e42df8e10a83e76565474f82330d34403da71b49Tom Stellard memset(&vtx, 0, sizeof(vtx)); 4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD0 */ 4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0); 4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0); 4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0); 4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0); 4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0); 4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0); 4912c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 4922c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD1 */ 4932c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1); 4942c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1); 4952c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1); 4962c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1); 4972c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1); 4982c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1); 4992c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1); 5002c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1); 5012c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1); 5022c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1); 5032c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard 5042c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard /* WORD 2*/ 5052c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2); 5062c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2); 507e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 508e42df8e10a83e76565474f82330d34403da71b49Tom Stellard if (r600_bytecode_add_vtx(ctx->bc, &vtx)) { 509e42df8e10a83e76565474f82330d34403da71b49Tom Stellard fprintf(stderr, "Error adding vtx\n"); 510e42df8e10a83e76565474f82330d34403da71b49Tom Stellard } 511e42df8e10a83e76565474f82330d34403da71b49Tom Stellard /* Use the Texture Cache */ 512e42df8e10a83e76565474f82330d34403da71b49Tom Stellard ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX; 513e42df8e10a83e76565474f82330d34403da71b49Tom Stellard return bytes_read; 514e42df8e10a83e76565474f82330d34403da71b49Tom Stellard} 515e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx, 517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned char * bytes, unsigned num_bytes) 518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{ 519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned bytes_read = 0; 5206f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard unsigned i, byte; 521ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard while (bytes_read < num_bytes) { 522ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard char inst_type = bytes[bytes_read++]; 523ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard switch (inst_type) { 524ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 0: 525ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_alu_from_byte_stream(ctx, bytes, 526ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 527ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 528ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 1: 529ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_tex_from_byte_stream(ctx, bytes, 530ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 531ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 532ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard case 2: 533ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read = r600_fc_from_byte_stream(ctx, bytes, 534ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bytes_read); 535ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 5366f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard case 3: 5376f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE); 5386f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (i = 0; i < 2; i++) { 5396f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard for (byte = 0 ; byte < 4; byte++) { 5406f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard ctx->bc->cf_last->isa[i] |= 5416f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard (bytes[bytes_read++] << (byte * 8)); 5426f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5436f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard } 5446f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard break; 545e42df8e10a83e76565474f82330d34403da71b49Tom Stellard 546e42df8e10a83e76565474f82330d34403da71b49Tom Stellard case 4: 547e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read = r600_vtx_from_byte_stream(ctx, bytes, 548e42df8e10a83e76565474f82330d34403da71b49Tom Stellard bytes_read); 549e42df8e10a83e76565474f82330d34403da71b49Tom Stellard break; 550ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard default: 551ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* XXX: Error here */ 552ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard break; 553ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 554ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 555ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard} 556ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 557ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/ 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 56772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 571c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 572a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 57672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 577a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 5798260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 5808260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 5818260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 58647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 58747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 59272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 59372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 59550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 59650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 5974a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 606fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 610fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 611fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 612fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 613fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 614fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 616fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 6177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 618fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 619fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 62150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 62250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 6234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 62450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 62550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 626738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW; 62750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 628738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY; 62950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 631fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 63450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 63550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 636fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 637fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 638fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 639fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 640fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 64150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 64250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 64350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 64450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 6454a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 64650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 64750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 64850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 64950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 6507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 6517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 660738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0; 66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 66221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 66321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 66421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 66521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 66621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 66721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 66821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 66921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 67021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 67121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 67221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 67321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 67421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 67521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 67621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 67721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 6787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 6950a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 6960a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6970a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 6980a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 6990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 7000a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 7010a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 7020a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 7030a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 7040a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 7050a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 7060a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 7070a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 7080a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 7090a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 7100a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 7275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 7285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 7295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 7305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 7315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 7325b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 7335b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7345b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 7355b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 7365b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 7375b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 7385b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 7395b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 7405b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 7415b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 7425b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 743725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */ 744725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) 745725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 746725a820b926575265e6790601a0defd9c30947dcVadim Girlin int r = 0; 747725a820b926575265e6790601a0defd9c30947dcVadim Girlin 748725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].spi_sid) { 749725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[index].lds_pos = ctx->shader->nlds++; 750725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[index].interpolate > 0) { 751725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_alu(ctx, index); 752725a820b926575265e6790601a0defd9c30947dcVadim Girlin } else { 753725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_flat(ctx, index); 754725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 755725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 756725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 757725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 758725a820b926575265e6790601a0defd9c30947dcVadim Girlin 759725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back) 760725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 761725a820b926575265e6790601a0defd9c30947dcVadim Girlin struct r600_bytecode_alu alu; 762725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r; 763725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_front = ctx->shader->input[front].gpr; 764725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr_back = ctx->shader->input[back].gpr; 765725a820b926575265e6790601a0defd9c30947dcVadim Girlin 766725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < 4; i++) { 767725a820b926575265e6790601a0defd9c30947dcVadim Girlin memset(&alu, 0, sizeof(alu)); 768725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 769725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.is_op3 = 1; 770725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.write = 1; 771725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.sel = gpr_front; 772725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[0].sel = ctx->face_gpr; 773725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].sel = gpr_front; 774725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].sel = gpr_back; 775725a820b926575265e6790601a0defd9c30947dcVadim Girlin 776725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.dst.chan = i; 777725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[1].chan = i; 778725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.src[2].chan = i; 779725a820b926575265e6790601a0defd9c30947dcVadim Girlin alu.last = (i==3); 780725a820b926575265e6790601a0defd9c30947dcVadim Girlin 781725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 782725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 783725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 784725a820b926575265e6790601a0defd9c30947dcVadim Girlin 785725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 786725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 787725a820b926575265e6790601a0defd9c30947dcVadim Girlin 788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 78972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 79296bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 79372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 7995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 8001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].interpolate = d->Interp.Interpolate; 8011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->input[i].centroid = d->Interp.Centroid; 802024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 803725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 804c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin switch (ctx->shader->input[i].name) { 805c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_FACE: 806725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 807c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 808c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_COLOR: 809725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->colors_used++; 810c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 811c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin case TGSI_SEMANTIC_POSITION: 812c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx->fragcoord_input = i; 813c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin break; 814c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 815725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 816c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if ((r = evergreen_interp_input(ctx, i))) 817725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 818fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 81950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 8255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 826024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 8271279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez ctx->shader->output[i].interpolate = d->Interp.Interpolate; 82891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->output[i].write_mask = d->Declaration.UsageMask; 82991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (ctx->type == TGSI_PROCESSOR_VERTEX) { 83091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (d->Semantic.Name) { 83191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 83291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2); 83391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 83491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 83591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin ctx->shader->vs_out_misc_write = 1; 836e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák ctx->shader->vs_out_point_size = 1; 83791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 83854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 83954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->clip_vertex_write = TRUE; 84054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx->cv_output = i; 84154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 84291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 8430c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { 8440c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin switch (d->Semantic.Name) { 8450c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin case TGSI_SEMANTIC_COLOR: 8460c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin ctx->shader->nr_ps_max_color_exports++; 8470c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin break; 8480c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } 84991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin } 850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 85333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 85447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 85696bbc627f369c0100b950f81531b1fe9ef586c34Christian König 857c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 858c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 859951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if (!ctx->native_integers) { 860951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin struct r600_bytecode_alu alu; 861951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 86296bbc627f369c0100b950f81531b1fe9ef586c34Christian König 863951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 864951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].sel = 0; 865951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.src[0].chan = 3; 86696bbc627f369c0100b950f81531b1fe9ef586c34Christian König 867951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.sel = 0; 868951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.chan = 3; 869951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.dst.write = 1; 870951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin alu.last = 1; 87196bbc627f369c0100b950f81531b1fe9ef586c34Christian König 872951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 873951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin return r; 874951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin } 875c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 87639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) 87739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie break; 878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 88372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 88472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 885be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 886be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 888be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 8907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 917fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 921fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 922fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 923fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 924fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 925fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 926fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 927fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 928fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 929fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 930fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 931fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 932fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 933370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */ 934fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 935fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 936fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 9401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 9451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 94896bbc627f369c0100b950f81531b1fe9ef586c34Christian König 9491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 9501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 9511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 9521fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 9531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 9541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 9551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 9564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 9571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 9581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 9591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 9611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 9621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 96396bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 96439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) { 96539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 3; 96639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 3; 96739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 3; 96839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 3; 96939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 97039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) { 97139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[0] = 0; 97239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[1] = 0; 97339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[2] = 0; 97439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->swizzle[3] = 0; 97539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie r600_src->sel = 0; 97639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie } 977c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 9781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 9791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 9801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 9811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 9821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 9831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 9841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 9874a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 9924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 995077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 9978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 1000077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 10064a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 10118e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 1016077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 1018077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 1019077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 1020077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 1021077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 1022077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 1023077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 1024077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 1025077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 1026077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 1027d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 1028077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 10294a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 1030077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1031077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1032077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 1033077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 1034077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 10377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 10397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 10407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 10427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 10437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 10447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 1048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 1049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 1050077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 1051077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1052077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 1053077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 1054077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 1055077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 1056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 1057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 1058077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 1059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 1060077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 10634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 10734a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 10787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10894a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 10907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 10957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 11007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 11014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 11067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 11077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 11087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 11097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 11107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 11114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 11127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 11137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 11147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 11167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 11177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 11197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 11207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 11217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 1122725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx) 1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin{ 1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin int i, r, count = ctx->shader->ninput; 1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin /* additional inputs will be allocated right after the existing inputs, 1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin * we won't need them after the color selection, so we don't need to 1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin * reserve these gprs for the rest of the shader code and to adjust 1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin * output offsets etc. */ 1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin int gpr = ctx->file_offset[TGSI_FILE_INPUT] + 1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->info.file_max[TGSI_FILE_INPUT] + 1; 1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->face_gpr == -1) { 1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin i = ctx->shader->ninput++; 1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].name = TGSI_SEMANTIC_FACE; 1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].spi_sid = 0; 1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[i].gpr = gpr++; 1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->face_gpr = ctx->shader->input[i].gpr; 1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin for (i = 0; i < count; i++) { 1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) { 1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin int ni = ctx->shader->ninput++; 1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io)); 1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR; 1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]); 1147725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx->shader->input[ni].gpr = gpr++; 1148725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1149725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (ctx->bc->chip_class >= EVERGREEN) { 1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = evergreen_interp_input(ctx, ni); 1151725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1152725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1153725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1154725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1155725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = select_twoside_color(ctx, i, ni); 1156725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (r) 1157725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1158725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1159725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1160725a820b926575265e6790601a0defd9c30947dcVadim Girlin return 0; 1161725a820b926575265e6790601a0defd9c30947dcVadim Girlin} 1162725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1163e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader) 116472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1165eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 11664acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct tgsi_token *tokens = pipeshader->selector->tokens; 11674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin struct pipe_stream_output_info so = pipeshader->selector->so; 1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 11695555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 11714a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 1172457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 117454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int i, j, k, r = 0; 117554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0; 1176ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Declarations used by llvm code */ 1177ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard bool use_llvm = false; 11787f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned char * inst_bytes = NULL; 11797f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul unsigned inst_byte_count = 0; 118072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1181ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1182ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = debug_get_bool_option("R600_LLVM", TRUE); 1183ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 1185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 118615ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák ctx.native_integers = true; 1187951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin 1188c96b9834032952492efbd2d1f5511fe225704918Dave Airlie r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family); 1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 1194f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1196725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.face_gpr = -1; 1197c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin ctx.fragcoord_input = -1; 1198725a820b926575265e6790601a0defd9c30947dcVadim Girlin ctx.colors_used = 0; 119954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin ctx.clip_vertex_write = 0; 1200725a820b926575265e6790601a0defd9c30947dcVadim Girlin 12010c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports = 0; 12020c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_max_color_exports = 0; 12030c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin 1204725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side; 1205feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 1206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 1207076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 1208076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 1209076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 1210f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 1211f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 1212f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 1214076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 1215076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 1216076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 1217076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 123289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 12334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1234f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 12354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 1236f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 123889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 1239fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 124084457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* LLVM backend setup */ 1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM 1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm && ctx.info.indirect_files) { 1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "Warning: R600 LLVM backend does not support " 1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "indirect adressing. Falling back to TGSI " 1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "backend.\n"); 1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard struct radeon_llvm_context radeon_llvm_ctx; 1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard LLVMModuleRef mod; 1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard unsigned dump = 0; 1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx)); 1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT]; 1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); 1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { 1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard dump = 1; 1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count, 1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard rctx->family, dump)) { 1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard use_llvm = 0; 1265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard fprintf(stderr, "R600 LLVM backend failed to compile " 1266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard "shader. Falling back to TGSI\n"); 1267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } else { 1268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT]; 1270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard radeon_llvm_dispose(&radeon_llvm_ctx); 1272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif 1274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* End of LLVM backend setup */ 1275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (!use_llvm) { 1277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_OUTPUT] = 1278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.file_offset[TGSI_FILE_INPUT] + 1279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard ctx.info.file_max[TGSI_FILE_INPUT] + 1; 1280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 12824d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 1283d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 128497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 128597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 128697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 1287d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 12887728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 12898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 12904d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 12918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 12955555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 1301cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 1302cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 1303cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 1304cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 1305cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 1306cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 1307cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 1308cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 1309cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 1310cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 1318725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_PROPERTY: 1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin property = &ctx.parse.FullToken.FullProperty; 132191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (property->Property.PropertyName) { 132291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (property->u[0].Data == 1) 1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin shader->fs_write_all = TRUE; 132591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 132691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 132791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin if (property->u[0].Data == 1) 132891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin shader->vs_prohibit_ucps = TRUE; 132991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 1330725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1331725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1332725a820b926575265e6790601a0defd9c30947dcVadim Girlin default: 1333725a820b926575265e6790601a0defd9c30947dcVadim Girlin R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 1334725a820b926575265e6790601a0defd9c30947dcVadim Girlin r = -EINVAL; 1335725a820b926575265e6790601a0defd9c30947dcVadim Girlin goto out_err; 1336725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1337725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1338725a820b926575265e6790601a0defd9c30947dcVadim Girlin 13390c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (shader->fs_write_all && rctx->chip_class >= EVERGREEN) 13400c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_max_color_exports = 8; 13410c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin 1342c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin if (ctx.fragcoord_input >= 0) { 1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if (ctx.bc->chip_class == CAYMAN) { 1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie for (j = 0 ; j < 4; j++) { 1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1348cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie 1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = j; 1353cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = (j == 3); 1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1356cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1357cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1358cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } else { 1359cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie struct r600_bytecode_alu alu; 1360cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1361cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1362cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr; 1363cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.src[0].chan = 3; 1364c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1365cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.sel = shader->input[ctx.fragcoord_input].gpr; 1366cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.chan = 3; 1367cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.dst.write = 1; 1368cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie alu.last = 1; 1369cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie if ((r = r600_bytecode_add_alu(ctx.bc, &alu))) 1370cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie return r; 1371cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie } 1372c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin } 1373c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin 1374725a820b926575265e6790601a0defd9c30947dcVadim Girlin if (shader->two_side && ctx.colors_used) { 1375725a820b926575265e6790601a0defd9c30947dcVadim Girlin if ((r = process_twoside_color_inputs(&ctx))) 1376725a820b926575265e6790601a0defd9c30947dcVadim Girlin return r; 1377725a820b926575265e6790601a0defd9c30947dcVadim Girlin } 1378725a820b926575265e6790601a0defd9c30947dcVadim Girlin 1379725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_init(&ctx.parse, tokens); 1380725a820b926575265e6790601a0defd9c30947dcVadim Girlin while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 1381725a820b926575265e6790601a0defd9c30947dcVadim Girlin tgsi_parse_token(&ctx.parse); 1382725a820b926575265e6790601a0defd9c30947dcVadim Girlin switch (ctx.parse.FullToken.Token.Type) { 1383725a820b926575265e6790601a0defd9c30947dcVadim Girlin case TGSI_TOKEN_TYPE_INSTRUCTION: 1384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard continue; 1386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 1388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1390be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 1391be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 1392be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 13931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 13947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 13957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 13967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 13977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 13987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 139989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 140189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 140250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 140350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 140450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 1405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 1406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1410725a820b926575265e6790601a0defd9c30947dcVadim Girlin break; 1411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1413eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 1414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard /* Get instructions if we are using the LLVM backend. */ 1415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard if (use_llvm) { 1416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count); 1417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard FREE(inst_bytes); 1418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard } 1419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard 1420457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 1421eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.clip_vertex_write) { 142354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* need to convert a clipvertex write into clipdistance writes and not export 142454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin the clip vertex anymore */ 142554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io)); 142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg; 142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST; 143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->output[noutput].gpr = ctx.temp_reg+1; 143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput++; 143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 14345a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin /* reset spi_sid for clipvertex output to avoid confusing spi */ 14355a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin shader->output[ctx.cv_output].spi_sid = 0; 14365a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin 143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin shader->clip_dist_write = 0xFF; 143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0; i < 8; i++) { 144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int oreg = i >> 2; 144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin int ochan = i & 3; 144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (j = 0; j < 4; j++) { 144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin struct r600_bytecode_alu alu; 144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4); 144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].sel = shader->output[ctx.cv_output].gpr; 144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[0].chan = j; 144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].sel = 512 + i; 145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].kc_bank = 1; 145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.src[1].chan = j; 145354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 145454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.sel = ctx.temp_reg + oreg; 145554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.chan = j; 145654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.dst.write = (j == ochan); 145754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (j == 3) 145854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin alu.last = 1; 145954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin r = r600_bytecode_add_alu(ctx.bc, &alu); 146054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (r) 146154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin return r; 146254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 146354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 146454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 146554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák /* Add stream outputs. */ 1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) { 1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák for (i = 0; i < so.num_outputs; i++) { 1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák struct r600_bytecode_output output; 1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (so.output[i].output_buffer >= 4) { 1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák R600_ERR("exceeded the max number of stream output buffers, got: %d\n", 1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák so.output[i].output_buffer); 1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = -EINVAL; 1475543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 14778ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák if (so.output[i].dst_offset < so.output[i].start_component) { 14788ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák R600_ERR("stream_output - dst_offset cannot be less than start_component\n"); 14792449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák r = -EINVAL; 14802449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák goto out_err; 1481543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1482543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák memset(&output, 0, sizeof(struct r600_bytecode_output)); 1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.gpr = shader->output[so.output[i].register_index].gpr; 148588258e0dfe2371c2d591f27fba3511977e31e5eaAndreas Boll output.elem_size = 0; 14868ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.array_base = so.output[i].dst_offset - so.output[i].start_component; 1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE; 1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.burst_count = 1; 1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.barrier = 1; 1490c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin /* array_size is an upper limit for the burst_count 1491c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin * with MEM_STREAM instructions */ 1492c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin output.array_size = 0xFFF; 14938ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component; 1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (ctx.bc->chip_class >= EVERGREEN) { 1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0; 1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1; 1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2; 1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3; 1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } else { 1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák switch (so.output[i].output_buffer) { 1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 0: 1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0; 1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 1: 1515543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1; 1516543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1517543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 2: 1518543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2; 1519543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1520543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák case 3: 1521543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3; 1522543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák break; 1523543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1524543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1525543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output); 1526543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák if (r) 1527543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák goto out_err; 1528543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1529543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák } 1530543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák 1531eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin for (i = 0, j = 0; i < noutput; i++, j++) { 153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 3; 154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = -1; 154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 1544457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 1545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 154691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin switch (shader->output[i].name) { 154791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_POSITION: 154854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 155091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 155191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 155291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_PSIZE: 155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin break; 155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin case TGSI_SEMANTIC_CLIPVERTEX: 155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j--; 155891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 155991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin case TGSI_SEMANTIC_CLIPDIST: 156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pos_base++; 156154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 156254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* spi_sid is 0 for clipdistance outputs that were generated 156354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin * for clipvertex - we don't need to pass them to PS */ 156454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (shader->output[i].spi_sid) { 156554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 156654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin /* duplicate it as PARAM to pass to the pixel shader */ 156754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output)); 156854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 156954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 157054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 157191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin break; 157213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin case TGSI_SEMANTIC_FOG: 157313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_y = 4; /* 0 */ 157413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_z = 4; /* 0 */ 157513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin output[j].swizzle_w = 5; /* 1 */ 157613daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin break; 1577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 15810c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin /* never export more colors than the number of CBs */ 15820c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) { 15830c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin /* skip export */ 15840c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin j--; 15850c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin continue; 15860c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin } 158726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 158954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 15900c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports++; 15914f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 15920c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin for (k = 1; k < rctx->nr_cbufs; k++) { 159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = shader->output[i].gpr; 159654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 0; 159854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 2; 160026cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3; 160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_pixel_base++; 160454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 16060c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin shader->nr_ps_color_exports++; 1607feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 1608feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 16095f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 161054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 161154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 2; 161254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 161354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 161454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 161539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 161654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 61; 161754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 161854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 1; 161954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = output[j].swizzle_w = 7; 162054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 163172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (output[j].type==-1) { 163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = next_param_base++; 163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin } 1637457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 164054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) { 164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 164354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 164554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 164654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1654c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1656481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 16570c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) { 165854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin memset(&output[j], 0, sizeof(struct r600_bytecode_output)); 165954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].gpr = 0; 166054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].elem_size = 3; 166154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_x = 7; 166254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_y = 7; 166354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_z = 7; 166454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].swizzle_w = 7; 166554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].burst_count = 1; 166654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].barrier = 1; 166754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 166854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].array_base = 0; 166954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 167054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin j++; 1671481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 167254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 167354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin noutput = j; 167454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 1675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 1676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 167789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 1681457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 1682b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 1683b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 1684a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 1685c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1686c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 1687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 1688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 16894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 169489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 16954a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1697783e4da72aa203a645737dec81b001341951a942Vadim Girlin /* check GPR limit - we have 124 = 128 - 4 1698783e4da72aa203a645737dec81b001341951a942Vadim Girlin * (4 are reserved as alu clause temporary registers) */ 1699783e4da72aa203a645737dec81b001341951a942Vadim Girlin if (ctx.bc->ngpr > 124) { 1700783e4da72aa203a645737dec81b001341951a942Vadim Girlin R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr); 1701783e4da72aa203a645737dec81b001341951a942Vadim Girlin r = -ENOMEM; 1702783e4da72aa203a645737dec81b001341951a942Vadim Girlin goto out_err; 1703783e4da72aa203a645737dec81b001341951a942Vadim Girlin } 1704783e4da72aa203a645737dec81b001341951a942Vadim Girlin 17053b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 1709cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1716f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1717f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 17264a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1727a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1728a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1729a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1730a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1731a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1732a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1733a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1734a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1735a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1736a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1737a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 17384a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1739f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1740f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1741f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1742f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1743f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 17444a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 17453efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 17463efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 17473efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 17483efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 174980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 175080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 175180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 17524a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 17547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 176047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 176147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 17627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 17637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 17647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1767dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1769dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1770d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1771d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1772dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1773d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1774d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1775d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1776dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1777dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1778dffad730df17983cfaef0808555a8c26cad0aa15Christian König 17799b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1780dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1781dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17824a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1783dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1784dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1786d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1788d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1789d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 17904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 179180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1793d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1794d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1798d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 17994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 18004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 18054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 18077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 18084a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 18097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1823d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1824d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 18259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1826d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1827d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1828d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1829d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 18309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 18319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 18329b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 18339b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 18349b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 18359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1836d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1837d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1852cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1853cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1854cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1855cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1856cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1858cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1859cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1860cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1861cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1862cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1863cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1864cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1865cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1866cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1867cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1868cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 18734a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 18774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 1881fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák 1882fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák /* RSQ should take the absolute value of src */ 1883fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_RSQ) { 1884fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák r600_bytecode_src_set_abs(&alu.src[j]); 1885fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák } 18867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 18897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 18917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 18977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 18987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx) 1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{ 1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int i, j, k, r; 1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie struct r600_bytecode_alu alu; 1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 1905d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (k = 0; k < last_slot; k++) { 1906d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << k))) 1907d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie continue; 1908d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 1909d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (i = 0 ; i < 4; i++) { 1910d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1911d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1912d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1913d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], k); 1914d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1915d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1916d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.dst.write = (i == k); 1917d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (i == 3) 1918d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie alu.last = 1; 1919d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1920d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie if (r) 1921d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return r; 1922d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1923d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie } 1924d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie return 0; 1925d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie} 1926d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie 19277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 192888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 192988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 193088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 193188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 19321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 193388f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 193496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 193596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 193696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 193796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 193896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 19394a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 19407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 19414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1942a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 194488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 194588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 194688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 194788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 19507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1951921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1953a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 195496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1955ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19574a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 195888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 195988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 196088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19614a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1962a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 19637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 196488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 196688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 196788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 196988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 197088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 19714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 197288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 197388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 197488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 19754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1976a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 197788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 197888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 197988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 198088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 198188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 198288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 198388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 198488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 19857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1986921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1988921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1989ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 199096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 199189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1993a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 199496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 199596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 199696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 199796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 199896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 199996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 200088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 20014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 200288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 200388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 200492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 200592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 200692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 20204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 203892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 203992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 204092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 204292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 204492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 20451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 204692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 204792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 204888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 20494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 205088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 205188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 205288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 205388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 205488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 205588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 205688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 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 /* replicate result */ 2063be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 2064be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2065be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 2066be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 20674a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2068a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2069be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 2070be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 207180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2072be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 207388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 20744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 207588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 207688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 207788f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 207888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 207988f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 208088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 208192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 208292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 208392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 20844a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 208692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 208757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 208857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 208957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 209057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 20911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 209257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 209357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 209457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 209592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 209692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 209757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 209889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 21004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 212092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 212857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 212992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 213092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 213157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 213289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 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], i, &alu.dst); 21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21454a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 21527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 215357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21574a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 216157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 216292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 2164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 21654a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 216980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 2172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 2182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 21834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 218780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 2191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 2192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 2193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 21944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 2196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 2197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 2198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 219992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 220092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 220192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 2202094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 2203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 22044a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2205094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 2206094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 2207094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 22084a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 22104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 22124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 2213921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 22144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 22154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 22164502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 22174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 22184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 22194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 22204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 2221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 2222094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 2223094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 22244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2225094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 2226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 2227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 22284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 22294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 22304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 22314502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 2232094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 2233094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 2234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 22350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 22360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 22370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 22384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 22390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 22400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 2241f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 22424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2243f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 22444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 2245f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2246f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 2247f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2248f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 2250f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 2251f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 2252f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 22534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2254f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 2255f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 2256f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 22570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 22580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 22596a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 22606a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 22626a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 226389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 2265f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2268f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2269f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 2270f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 2271f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 22747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 22767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 22784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 2283f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 22844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 22857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 2286f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 2287f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 22882fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 22892fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 22902fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 22917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 22924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 22937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 22947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 22957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 22960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 22976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 22986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 22990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 230086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 23014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2302a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 230386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 230486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 23054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 23064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 23070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 23080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 23090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 23100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 23110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 23124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 23140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 23150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 231689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 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], i, &alu.dst); 23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 23257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 23294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 23354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23414a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 2346abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 23478567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 23484a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 23498567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 23508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 23518567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 23528567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 23538567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 23544a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 23558567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 23568567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 23578567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 23594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2360abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 23614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2362abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 2363abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 2364abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 2365abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 23664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2367abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2368abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2369abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 2370abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 23714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2372abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2373abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 2374abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 2375abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 2376abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 2377abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 23784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2379abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 2380abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 2381abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 23820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 23830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 23840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 238542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 238642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 238742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23884a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 238942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 239042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 23914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2392df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2393370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 2394df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2395df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 2396df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2397df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 2398df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 239942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 24004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 24014a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 240242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 240342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 240442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 240542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 24064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 240742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 240842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 240942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 241042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 241142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 241242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 2413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 24147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 24157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24164a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 24187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 24197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 24204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2422a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 24237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 242480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 24267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 24277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 24284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 24307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 24317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 24327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 24337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 24347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 2436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 2440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 24414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 2443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 24444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 2445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 2446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 24494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 2453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 24604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 24644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 24784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 24914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 2506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 2507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 25084a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 2510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 2511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 25124a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2513a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 25144a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2517a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 25224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 252366f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 25244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 2525a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 2526a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2531a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2532a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 25334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 2535a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2536a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 2537a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 2538a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 25394a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2540a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 2541a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 2542a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 2543a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 2544a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op) 2546332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{ 2547332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2548332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin struct r600_bytecode_alu alu; 254929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int i, r, j; 2550332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 2551332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp0 = ctx->temp_reg; 2552332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin int tmp1 = r600_get_temp(ctx); 25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin int tmp2 = r600_get_temp(ctx); 255429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie int tmp3 = r600_get_temp(ctx); 25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* Unsigned path: 25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * we need to represent src1 as src2*q + r, where q - quotient, r - remainder 25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 1. tmp0.x = rcp (src2) = 2^32/src2 + e, where e is rounding error 25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 2. tmp0.z = lo (tmp0.x * src2) 25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 3. tmp0.w = -tmp0.z 25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 4. tmp0.y = hi (tmp0.x * src2) 25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src2)) 25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error 25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 7. tmp1.x = tmp0.x - tmp0.w 25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 8. tmp1.y = tmp0.x + tmp0.w 25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) 25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 10. tmp0.z = hi(tmp0.x * src1) = q 25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 11. tmp0.y = lo (tmp0.z * src2) = src2*q = src1 - r 25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 12. tmp0.w = src1 - tmp0.y = r 25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 13. tmp1.x = tmp0.w >= src2 = r >= src2 (uint comparison) 25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 14. tmp1.y = src1 >= tmp0.y = r >= 0 (uint comparison) 25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * if DIV 25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.z + 1 = q + 1 25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.z - 1 = q - 1 25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * else MOD 25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 15. tmp1.z = tmp0.w - src2 = r - src2 25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 16. tmp1.w = tmp0.w + src2 = r + src2 25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * endif 25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 17. tmp1.x = tmp1.x & tmp1.y 25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z 25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z 25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z 25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 20. dst = src2==0 ? MAX_UINT : tmp0.z 25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Signed path: 25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * 25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * Same as unsigned, using abs values of the operands, 25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin * and fixing the sign of the result in the end. 25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin */ 2600332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2601332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin for (i = 0; i < 4; i++) { 2602332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin if (!(write_mask & (1<<i))) 2603332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin continue; 2604332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 2606332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = -src0 */ 26084ba4853c0a613f771b44806cd5ce376838479802Vadim 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 = 0; 26134ba4853c0a613f771b44806cd5ce376838479802Vadim 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[0], 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.y = -src1 */ 2624332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2626332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2629332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2630332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 2632332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2634332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.z sign bit is set if src0 and src2 signs are different */ 26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* it will be a sign of the quotient */ 26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (!mod) { 26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT); 26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2652332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2653332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.x = |src0| */ 26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2674332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp2.y = |src1| */ 26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp2; 26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp2; 26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 1; 26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2694332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 2695332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 26964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 1. tmp0.x = rcp_u (src2) = 2^32/src2 + e, where e is rounding error */ 269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp3.x = u2f(src2) */ 269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT); 2701332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie /* tmp0.x = recip(tmp3.x) */ 271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 3; j++) { 271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 0); 272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (j == 2) 273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 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_MUL); 273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].value = 0x4f800000; 274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp3; 274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 274629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (r) 274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT); 275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp3; 275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT); 27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 276929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 0; 277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 277429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 277829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 277929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 278029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 27844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 27854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 2. tmp0.z = lo (tmp0.x * src2) */ 278629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2790332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 2794332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 280729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 2811332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 281629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 281929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 282229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 282429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 282629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 282729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 282829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 3. tmp0.w = -tmp0.z */ 28314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 28434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 28444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 4. tmp0.y = hi (tmp0.x * src2) */ 284729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 28514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 285329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 28554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 285629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 28584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 28694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2872332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 287529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 287629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 287729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 287829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 287929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 288029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 288129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 288229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 1; 288329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 288429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 288529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 288629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 288729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 288829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 288929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 289029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 2891332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z) = abs(lo(rcp*src)) */ 28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2896332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 29064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 29074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 29094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 29104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 6. tmp0.w = hi (tmp0.z * tmp0.x) = e, rounding error */ 291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 2917332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 3); 29214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 29244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 293429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 293529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 293629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 293729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 3; 293829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 293929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 294029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 2; 294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 294529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 294629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 294729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 294829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 294929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 29504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 7. tmp1.x = tmp0.x - tmp0.w */ 29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 2954332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2955332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 2957332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2958332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 29614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 2964332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2966332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 8. tmp1.y = tmp0.x + tmp0.w */ 2969332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 2971332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2972332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 29734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 2974332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 2975332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 29794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 2980332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 2981332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.last = 1; 29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2983332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 2984332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */ 29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 2989332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 29904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 29914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 29934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 29954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 29974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 29994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 30004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 30024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 30034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 30044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 10. tmp0.z = hi(tmp0.x * src1) = q */ 300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 30104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 2); 30144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 30174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT); 30324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 2; 303529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 303629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp0; 303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 0; 303929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 304129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp2; 304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 0; 304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 304529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 304629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 304729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 11. tmp0.y = lo (src2 * tmp0.z) = src2*q = src1 - r */ 305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (ctx->bc->chip_class == CAYMAN) { 305429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie for (j = 0 ; j < 4; j++) { 305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 305629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 30574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = j; 306029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = (j == 1); 30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 306329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 306729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 307129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = (j == 3); 307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 307429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 307729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 307829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 308029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.sel = tmp0; 308129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.chan = 1; 308229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.dst.write = 1; 30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 308429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if (signed_op) { 308529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].sel = tmp2; 308629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[0].chan = 1; 308729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } else { 308829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 308929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 309029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 309129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].sel = tmp0; 309229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.src[1].chan = 2; 309329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie 309429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie alu.last = 1; 309529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 309629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie return r; 309729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie } 30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 12. tmp0.w = src1 - tmp0.y = r */ 31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 13. tmp1.x = tmp0.w >= src2 = r >= src2 */ 31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 3124332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3125332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 3127332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3128332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3137332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 3141332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 14. tmp1.y = src1 >= tmp0.y = r >= 0 */ 31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT); 31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 1; 31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3162332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3163332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { /* UMOD */ 3165332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.w - src2 = r - src2 */ 3167332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 3169332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3170332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.sel = tmp1; 31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 3172332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.dst.write = 1; 3173332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 3176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.w + src2 = r + src2 */ 31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 3; 31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp2; 32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { /* UDIV */ 32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 15. tmp1.z = tmp0.z + 1 = q + 1 DIV */ 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 = 2; 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_1_INT; 32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 16. tmp1.w = tmp0.z - 1 = q - 1 */ 32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 3; 32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp0; 32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT; 32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3241332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3243332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin } 3244332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 17. tmp1.x = tmp1.x & tmp1.y */ 32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT); 32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp1; 32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3252332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 1; 32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z DIV */ 32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z MOD */ 3264332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 3267332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 3271332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp1; 32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 0; 32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = mod ? 3 : 2; 32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp1; 32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */ 32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT); 32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 2; 32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3295332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 3296332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin alu.src[0].sel = tmp1; 32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 1; 32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp1; 32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 3; 33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 2; 3302332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 3305332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return r; 3306332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (signed_op) { 33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the sign of the result */ 33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if (mod) { 33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* sign of the remainder is the same as the sign of src0 */ 33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */ 33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } else { 33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = -tmp0.z */ 33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.sel = tmp0; 33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.chan = 0; 33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.dst.write = 1; 33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* fix the quotient sign (same as the sign of src0*src1) */ 33664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin /* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */ 33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.is_op3 = 1; 33704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 33724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].sel = tmp2; 33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[0].chan = 2; 33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].sel = tmp0; 33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[1].chan = 2; 33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].sel = tmp0; 33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.src[2].chan = 0; 33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin alu.last = 1; 33814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 33824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return r; 33834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin } 3386332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin return 0; 3387332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin} 3388332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin 33894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx) 33904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 0); 33924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx) 33954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 33964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 0); 33974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 33984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 33994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx) 34004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 34014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 0, 1); 34024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 34034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 34044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx) 34054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{ 34064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin return tgsi_divmod(ctx, 1, 1); 34074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin} 34084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin 3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx) 3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{ 3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin struct r600_bytecode_alu alu; 3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int i, r; 3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC); 3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.sel = ctx->temp_reg; 3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.chan = i; 3427a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.dst.write = 1; 3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (i == last_inst) 3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3433a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3437a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin for (i = 0; i < 4; i++) { 3438a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (!(write_mask & (1<<i))) 3439a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin continue; 3440a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3441a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3442a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.inst = ctx->inst_info->r600_opcode; 3443a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3444a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3445a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3446a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].sel = ctx->temp_reg; 3447a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.src[0].chan = i; 3448a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3449cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT) 3450a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin alu.last = 1; 3451a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 3452a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin if (r) 3453a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return r; 3454a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin } 3455a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 3456a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin return 0; 3457a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin} 3458a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin 34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx) 34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{ 34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin struct r600_bytecode_alu alu; 34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int i, r; 34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin int last_inst = tgsi_last_instruction(write_mask); 34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* tmp = -src */ 34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT); 34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.sel = ctx->temp_reg; 34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.chan = i; 34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_0; 34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin /* dst = (src >= 0 ? src : tmp) */ 34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin for (i = 0; i < 4; i++) { 34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (!(write_mask & (1<<i))) 34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin continue; 34936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 34956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 34966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.is_op3 = 1; 34976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.dst.write = 1; 34986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 34996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 35006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 35026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 35036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].sel = ctx->temp_reg; 35046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.src[2].chan = i; 35056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (i == last_inst) 35076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin alu.last = 1; 35086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 35096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin if (r) 35106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return r; 35116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin } 35126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin return 0; 35136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin} 35146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx) 351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{ 351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin struct r600_bytecode_alu alu; 351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int i, r; 352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin unsigned write_mask = inst->Dst[0].Register.WriteMask; 352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin int last_inst = tgsi_last_instruction(write_mask); 352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* tmp = (src >= 0 ? src : -1) */ 352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT); 353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.sel = ctx->temp_reg; 353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.chan = i; 353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT; 353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin /* dst = (tmp > 0 ? 1 : tmp) */ 354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin for (i = 0; i < 4; i++) { 354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (!(write_mask & (1<<i))) 355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin continue; 355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT); 355442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.is_op3 = 1; 355542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.dst.write = 1; 355642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 355742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 355842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 355942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].sel = ctx->temp_reg; 356042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[0].chan = i; 356142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 356242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_1_INT; 356342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 356442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].sel = ctx->temp_reg; 356542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.src[2].chan = i; 356642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 356742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (i == last_inst) 356842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin alu.last = 1; 356942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin r = r600_bytecode_add_alu(ctx->bc, &alu); 357042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin if (r) 357142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return r; 357242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin } 357342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin return 0; 357442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin} 357542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin 35766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin 35780d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 35790d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 35814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3582921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 35830d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35840d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 35850d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 35864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3587a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 35880d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 3589cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 35900d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 3591cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 3594921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 35954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 35960d48925a56ad4fb253386110b545abda82a25464Dave Airlie 35970d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 35994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 36010d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 36020d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 36030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36040d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 36064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3607a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 36080d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 360980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 36100d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36110d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 3612cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 36130d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 36140d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3615921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 36160d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 36170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36180d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 3619cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 36200d48925a56ad4fb253386110b545abda82a25464Dave Airlie 36210d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 36220d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 36234a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 36240d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 36250d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 36260d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 36270d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 36280d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 36290d48925a56ad4fb253386110b545abda82a25464Dave Airlie 3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 36324a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 3634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 36364a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 3638a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 36396c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 3640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 3641a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 364280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 3644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 3645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 3647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 3648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 36494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 3651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 3652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3653cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 3654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 3658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36594a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 3661dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 36637be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 36647be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 36657be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 36667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 36674a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36704a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 367380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 3675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 3676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 36777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 3678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 36847be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 3686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 3688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 3689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 36904a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 3692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 3693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 36944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 3696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 36974a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3699a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 370080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 3702a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 3703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 3704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 3705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 3706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 3707921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3711cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 3712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 3713921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 3714cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 3715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 3716cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3717e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 3718e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 3719e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 3720e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 3721e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 3722e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 3723e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 3724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 3725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 3726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 3727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 3728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 3729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 37304a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 3732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 3733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 37347be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 3735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 3736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 37376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 37386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 37396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 37406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 3742192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_INPUT && 3743192467108b282c19da3b11647a7a802b3d890193Christian König inst->Src[index].Register.File != TGSI_FILE_OUTPUT) || 37446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 37456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 37466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 37476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 37486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 37496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 37506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 37526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 37536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 375433241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 375533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 375696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 375733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 37584a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 37594a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3760641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 376140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 3762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 3763da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 3764da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 37656d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ && 37666d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tgsi_tex_src_requires_loading(ctx, 0); 376778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 37686d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1; 376978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint8_t offset_x = 0, offset_y = 0, offset_z = 0; 3770641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37716415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 3772641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 37731d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 37741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 37751d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 37761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 37771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 37781d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 37791d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 37801d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 37811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 37821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 378313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 378413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 378513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 378640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 378740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 37884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 379140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 379440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 379740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 379840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 379940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 38024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 38044a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 380540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 380840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 380940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 38104a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 381140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 381240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 381340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 381413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 381540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 381640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 381740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 381840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 381940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 382040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 382140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 382240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 382340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 382440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 382540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 382640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 382740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 382840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 382940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 383040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 38314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 383240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 383340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 383413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 383513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 38367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 3837b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 383889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 38414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 3844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 38584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 38604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 38664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 38709d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 38724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3873a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 38764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 3879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 3883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 38844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 3886921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 3887b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 3888b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 3889b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 3890b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 3891b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 38924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3893b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 3894b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 389578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 3896b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 38999783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE || 39009783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) && 39016d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák inst->Instruction.Opcode != TGSI_OPCODE_TXQ && 39026d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) { 3903261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie 39040e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 39050e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 3908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 39094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 39114a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 39124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 3913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 3915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 3916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 3917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 39184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 3922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 392489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 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 = i; 39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 39374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 39424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 39437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 39447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 39467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 39477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 39487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 39514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 39557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 3957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 39587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 39604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3961a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 3966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3971a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 3975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39774a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 3978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 3980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 39814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3982a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 3983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 3984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 3986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 3987bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 3988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 39897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 3991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 3992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 3993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 3995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 3996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 3997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 3998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 39994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 4001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 40029783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie /* write initial W value into Z component */ 40039783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 40049783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 40059783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 40069783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 40079783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.sel = ctx->temp_reg; 40089783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.chan = 2; 40099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.dst.write = 1; 40109783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie alu.last = 1; 40119783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 40129783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie if (r) 40139783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie return r; 40149783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 4015d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie 4016d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie /* for cube forms of lod and bias we need to route the lod 4017d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie value into Z */ 4018d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXB || 4019d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie inst->Instruction.Opcode == TGSI_OPCODE_TXL) { 4020d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4021d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4022d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 4023d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie alu.dst.sel = ctx->temp_reg; 4024d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie alu.dst.chan = 2; 4025d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie alu.last = 1; 4026d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie alu.dst.write = 1; 4027d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 4028d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie if (r) 4029d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie return r; 4030d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie } 4031d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie 403278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 4033bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 4034bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 4035bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 403678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 4037b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 40384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4039a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 40404a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 4041b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 4042b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 4043b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 4044b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 4045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 40464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 4048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 4049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 405078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 4051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 4052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 40537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4054bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 4055929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4056929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 40576b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 40589783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || 4059929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 4060929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 4061de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 4062de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 4063de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 4064de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4065de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 4066de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 4067de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4068c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 4069c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 4070c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 4071de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 4072de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 4073de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 4074de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 4075de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 407633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 40774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 4078bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 40796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 40806415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 4081077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 4082641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 40836c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 40849d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 40859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 40869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 40879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 40886d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák 40896d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) { 40906d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_x = 4; 40916d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_y = 4; 40926d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_z = 4; 40936d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák tex.src_sel_w = 4; 40946d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák } else if (src_loaded) { 409578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 409678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 409778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 409878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 409978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 410078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 410178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 410278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 410378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 4104244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 410578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 41069a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 4107d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE || 4108d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) { 41099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_x = 1; 41109783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_y = 0; 41119783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie tex.src_sel_z = 3; 4112d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie tex.src_sel_w = 2; /* route Z compare or Lod value into W */ 41139783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie } 4114bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 41156b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 41166b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 411701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 411801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 411901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 41206b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 41216b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 4122bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 41231d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 41241d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 41251d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 412669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 4127929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 4128929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 4129929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 4130929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 4131929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 41326b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 4133929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 4134929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 4135929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 413678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 4137929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4138929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 4139929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 4140929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 4141929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 4142929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 4143929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 4144929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 4145929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 4146929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4147929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4148929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 4149929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 4150929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 4151929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 4152929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 4153929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 4154bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 41554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 4156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 4157bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 4158bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 4159bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 4160bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 416133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 416233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 4163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 4164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 4165b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 41664a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 4168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 4169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 4170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4171c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 41721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 4173c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 4174c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4175c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 4176c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 41774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4178c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 41794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 41804a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4181c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 418280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4183c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 4184c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 4185c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 4186c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 41874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4188c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 4189c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 4190c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4191c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 4192c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 4193c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 4194b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 4195dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4196dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4197dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4198dffad730df17983cfaef0808555a8c26cad0aa15Christian König 41994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4200a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 4201921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 4202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 42034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 42044a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 4205b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4207dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4208b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4210b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 42114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4212b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4213b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4214b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4215b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 4217dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4218dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4219dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4220dffad730df17983cfaef0808555a8c26cad0aa15Christian König 42214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4222a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 4223b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 4224b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 42254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 4226b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 4227b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4228dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4229b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4231b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 42324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4234b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4235b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4236b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 4237b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 4238dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 4239dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 4240dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 4241dffad730df17983cfaef0808555a8c26cad0aa15Christian König 42424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4243a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 4244b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 42454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 42464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 4247b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 4248b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 4249dffad730df17983cfaef0808555a8c26cad0aa15Christian König 425080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4251b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 4252dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 4253b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 4254b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 42554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4256b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 4257b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 4258b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 4259dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 4260b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 4261b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 426287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 426387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 426487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 426687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 4267dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 426887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 42707be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 42717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 427287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4274a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 42754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 42764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 42774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 427880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 427987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 428087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 428187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 42827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 428387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 42844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 428587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 428687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 42877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 428887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 428987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 429087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 42910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 42920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 42940e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 42950e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 42964a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 43010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 43044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4305a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 43060e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 43074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 43084a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 43090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 43110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 43120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 43140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 43170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 43190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 43210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 43224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 43240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 43250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 43284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4329a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 43300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43310e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 43324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 43334a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 43340e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 43350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 43360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 43370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 43380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 43390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 43420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 43430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 43440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 43450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 43460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 434780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 434880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 43490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 43500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 43510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 43520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 43530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 43544a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 43560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 43570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 43580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 43590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 43600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 43610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 43620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 436336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 436436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 436536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 43664a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 436709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 43687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 436936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 437036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 437136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 43724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 437336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4374a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 43754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 437636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 437736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 437836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 437936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 438036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 43814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 438236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 438336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 438436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 438589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 43867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 43877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 43887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 43897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 439036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 43917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 43927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 4393d9197f90372dec8a293d2d3e576261c6e3d38750Marek Olšák alu.dst.write = i == 0; 4394d9197f90372dec8a293d2d3e576261c6e3d38750Marek Olšák alu.last = i == 2; 43954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 43967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 43977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 43987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 43997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 44017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 44027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 44037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 44067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 441236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 44137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 441436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 441536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 44164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 441736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4418a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 44194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 442036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 442136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 4422b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 4423b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 4424b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 4425b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 4426b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 442736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 442836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 442936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 443036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 443136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 443336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 443436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 443536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 443636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 443736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 443836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 443989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 44414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 44434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 444436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 44487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 445136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 44567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 44574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 44587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 44594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 446036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 44617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 44627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 44637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 44647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 44667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 44674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 44687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 44697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 44707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 447136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 447236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 447336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 447436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 44754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 447636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 4477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 447836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 447936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 448036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 448136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 448236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 448336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 448436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 44854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 448636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 448736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 448836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 448936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 449036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 449187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 4492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 4493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 4494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 44954a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 4498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4499f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 4500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 450189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 45057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 45087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 45127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4519460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 45207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 45267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 4537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 4538460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4539460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4541460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 4542460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4543460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4544460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 45454a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4546460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4550f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 4551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 4552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 455389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 45554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 455696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 456096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 45637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 45647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 45667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45684a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 45727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 45734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 45747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 45764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 45774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 45787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 45807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 45837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 45844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 45877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 458896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 45894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 459096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 459196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 459296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 459396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 459496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 459596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 459696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 459796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 459896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 459996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 460196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 460296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 460396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 460489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 46087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 46147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 461796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 46234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 46257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 462796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 463296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 463796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 463889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46404a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 46427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 46477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 46487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 46507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 46517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 46524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 46567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 46574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 46587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 46597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 46607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 466196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 46637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 46647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 46657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 466696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 46687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 46697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 46707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 467196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 467396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 467496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 467596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 46764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 46774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 467896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 467996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 468096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 4681460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4682460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4683460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 4684460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4685460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4686460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4688460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4689460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4690460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4691460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4692f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 4693460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 469489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 46957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 46964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4697460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 46987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 46994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 4701460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 47027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 47037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 47047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 47057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 47067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 47077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 4708460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 47094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 47107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 47117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 47127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 47137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 47144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 47157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 47167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 47174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 47197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 47207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 47217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 47227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 47237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 47247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 47254a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 47267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 47277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 47287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 4729460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4730460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4731460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 4732460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 47334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4734460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4735460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 4736460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 4737460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 4738460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4739460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 4740460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 4741460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 4742460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 4743460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 47444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 4745460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 4746460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 4747460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 4748460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 4749460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 4750460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 4751460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 475298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 475398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 475498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47554a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 475698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 4757a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 47584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 475998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 476052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 476152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 476252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 476352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 476452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 476552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 476652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 47679b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 47688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 47699b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 477052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 477152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 477252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 477352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 477452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 47758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 477698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 47778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 47788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 47794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 478098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 478198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 47828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 47838e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 478498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 478598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 478698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 478747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 478847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 47894a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 479047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 4791a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 47927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 47937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 4794077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4795077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 47964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 47978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4798077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4799077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4800077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 48014a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4802077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 4803077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 4804077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4805077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 48068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 48078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4808077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4809077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4810077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 48114a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4812077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 48137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 48147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 4815077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 4816077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 48174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 48188e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 4819077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 4820077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 4821077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 48224a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 4823077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 48247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 48259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 48268e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 48278e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 48288e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 48298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 48308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 48318e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 48328e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 48338e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 48348e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 48359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 48367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 48377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 48387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 48397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 48407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 48418e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 484247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 484347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 484447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 484557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 484657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 484757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 48484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 484957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 485057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 485157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 48524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 485357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4854a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 485580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 48567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 48577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 485857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 485957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 48604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 486157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 486257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4863a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 486457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 486557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 48664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 486757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 486857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 486957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 48704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 487157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 487257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 487357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 487457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 487557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 487657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 4877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 4878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 48794a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 4881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48824a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 4883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 4884da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.execute_mask = 1; 4885da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune alu.update_pred = 1; 4886a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4887a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 4888a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 4889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 4890a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 4892a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 4893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 48947ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 4895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 4896a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 48974a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 4898a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 4899a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 4900a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4901a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4902a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 4903a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 4904a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 49052bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 49062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 49072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 49082bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 49092bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 49104f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 49112bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 49124f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 49132bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 49142bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 49152bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 49162bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 49174f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 49182bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 49192bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 49204f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 49212bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 49222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 49232bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 49242bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 49252bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 49262bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 49272bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 49284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 49298813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 49308813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 49318813842121d46d1be476807c98b0ba0b771f0c91Christian König } 49322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 4933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 4934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 4935a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 4937a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 4952a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 4964a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 4965a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 4966a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 49747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 49994a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 50004a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 500209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 5004a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 5007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 500909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 501109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 501309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 501409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 502009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 502209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50284f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 503309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50354f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 503609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 5037370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX work out offset */ 503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 5040a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 504609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 504909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 505109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 505609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 505709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 505809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 505909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 506009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 506109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 506209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 506309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 506509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 506709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 506809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 506909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 507009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 507109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 507209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 507309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 507409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 50758b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 507609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 50774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 507809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 507909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 508009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 5082a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5083a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5084a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5085a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 5086a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 50874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 5088a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 5089a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 5091a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 5092a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5093a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5094a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5095a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 5096a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 5097a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 5098a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 5099a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 5100a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 5101a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 5102a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5103a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 5104a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 5105a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 5106a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 5108a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 511509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 51174cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard /* LOOP_START_DX10 ignores the LOOP_CONFIG* registers, so it is not 51184cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard * limited to 4096 iterations, like the other LOOP_* instructions. */ 51194cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10)); 512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 5122a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 512309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 512909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 51324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 513409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 513509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 513609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 513709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 513809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 513909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 514109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 514209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 514309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 514409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 514509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 514609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 514709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 514809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 514909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 515009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 5151370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX add LOOPRET support */ 515209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 515309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 515409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 515509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 515609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 515709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 515809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 515909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 516009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 516109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 516209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 516309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 516409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 516509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 516609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 516709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 516809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 516909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 517009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 517109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 51724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 517309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 517409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 517509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 517609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 5177a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 5178a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 5179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 5181cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 5186cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5189cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5190cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5191cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5192cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5193cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5194cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 5195cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 5196cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 5197cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5198c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 5199cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 5200cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 5201cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5202cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 52039b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 5204cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5205cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5206cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5208cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5209cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5210cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 5211cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 5212cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 5213cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5214cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5215cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 5216cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5217c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5218cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5219cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 5220cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 5221cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5222cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 5223cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 5224cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 5225cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5226cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 5227cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 5228cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 5229cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 5230cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 5231cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 5232cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 523498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 52360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 5237df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 5238370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX: 5239df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 5240df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 5241df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 5242df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 5243df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 524442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 524536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5246460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 5248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 525157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 5252dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 5253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 5254d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 5255be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 5256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 5258b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 5259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52663af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 5267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52683af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5269df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 52707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 52714558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 5272a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 52730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5278e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 527988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 52803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 52813af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 52824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 5283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52880d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 5289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 52900d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 529188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 5292d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 52930d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 5294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 529613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 5297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 5298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53049f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53080d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 530987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 531092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5311c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 5312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5314cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5315ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 531609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 5317a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 5318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5321a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 5322a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 5323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53288c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5329c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5330cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 53310ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5332d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans}, 5333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5335c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5336c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 53374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5338cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 5339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 53411d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 534209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 5343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 534509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 5346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 534709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 5348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 53496d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 5350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5364094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 5365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 5366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 5367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5368bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans}, 5369332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5370c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5371c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 53725893e686b691013525cb2608c3d605be2d8ea471Dave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5373c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5374d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans}, 53750196433ce55b7e005c483bd7c411844eb44e983bDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5376b8e9cf5d965ce09227cd9875c4381c73f237f196Marek Olšák {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans}, 53779a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5378c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 53794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5380c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5381c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5382c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 53834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5384850021f225f312d55fb6a24a8cef805f527510afDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5385c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5386c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5387d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans}, 53887383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5389c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 5390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5394cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5395a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5396a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5397cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5398cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5399cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5400cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5401cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5402cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5403a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5404cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5405cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 54069b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 54079b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 54086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 540942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 5410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 541498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 541550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 54188ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 5420112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 542650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 542750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 543050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 543150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 543250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 543350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 543550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 543850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 543950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 544050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 544150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 544250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5443df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 544450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 544550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 544650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 544750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 544850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 544950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 545050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 545150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 545250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 545350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 545450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 545550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 545650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 545750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 545850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 545950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 546050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 546150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 546250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 546350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 546450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 546550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 546650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 546750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 546850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 546950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 547013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 547150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 547250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 54837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 54847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5485c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 54867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 54897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 54927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 54977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55028c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5503608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 5504cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5506d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5509cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5510cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 55114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5512cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55141d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 55151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 55167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 55177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 55207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55236d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 55407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 55417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5542a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i}, 5543332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5544cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5545cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5546cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5547cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5548d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5549cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5550a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i}, 5551b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans}, 5552cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 55534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5554cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5555cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5556cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 55574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 55589b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 5559cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5560cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5561d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 55627383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5563cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 55647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5568cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5569a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5570a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5571cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5572cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5573cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5574cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5575cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5576cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5577a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5578cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5579cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 55809b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 55819b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 55826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 558342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 55897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 56007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 56017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 56047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 56057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 56067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 56077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 56097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 56127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 56157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 5617df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 56187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 56197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 56207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 56217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 56227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 56237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 56257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 56277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 56287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 56297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 56307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 56317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 56377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 56397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 56407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 56417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 56427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 564413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 56457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 56467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 564950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 565650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 565750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 565850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 5659c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 566050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 5663ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 566650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 566750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 566950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 567150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 567550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56768c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2}, 5677f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2}, 5678cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 56790ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 5680f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2}, 568150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 568250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5683f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 5684f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 568529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod}, 5686cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 568750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 56891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 569050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 569150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 569250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 569350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 569450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 569550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 569650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 56976d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák {TGSI_OPCODE_TXQ_LZ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 569850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 569950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 570450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 570950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 571250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 571350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 571450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 571550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5716f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 571729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv}, 5718cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 5719cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 5720f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 5721f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 5722f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2}, 5723f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 5724f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 5725f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 5726f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 572729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv}, 5728f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 5729f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 5730f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 573129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod}, 5732d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr}, 5733f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 5734f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 5735f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2}, 5736f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap}, 5737f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 573850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 573950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 574050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 574150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 5742cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 5743a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported}, 5744a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported}, 5745cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 5746cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 5747cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 5748cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 5749cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 5750cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 5751a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported}, 5752cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 5753cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 5754f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 57559b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 5756f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_IABS, 0, 0, tgsi_iabs}, 5757f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie {TGSI_OPCODE_ISSG, 0, 0, tgsi_issg}, 575850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 575950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 5760