r600_shader.c revision 21c5607e64ca4ef68730d8e846d8e7744ecdd024
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h" 24f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák#include "tgsi/tgsi_info.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 28de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 299c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 32077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h" 33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h> 38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano 397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes 407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here. 417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots. 437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT 447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four 457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is 467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels. 477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT 487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and 497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots. 507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64 517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64 527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64 537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS 547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the 557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be 567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well. 577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x 587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/ 597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 61dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs, 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *ps, int id) 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 641235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader_io *input = &ps->input[id]; 651235becaa1cf7e29f580900592563c3329d326deJerome Glisse 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (int i = 0; i < vs->noutput; i++) { 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (input->name == vs->output[i].name && 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse input->sid == vs->output[i].sid) { 691235becaa1cf7e29f580900592563c3329d326deJerome Glisse return i - 1; 701235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 741235becaa1cf7e29f580900592563c3329d326deJerome Glisse 75a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 761235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 771235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 781235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 79843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano uint32_t *ptr; 80843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano int i; 811235becaa1cf7e29f580900592563c3329d326deJerome Glisse 821235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 831235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 842f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich /* use PIPE_BIND_VERTEX_BUFFER so we use the cache buffer manager */ 852f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_IMMUTABLE); 861235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 871235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 881235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 89ab630b5768b0bfa4d7729d110ce4fb8f42e0cfb9Marek Olšák ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, rctx->ctx.cs, PIPE_TRANSFER_WRITE); 90d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet if (R600_BIG_ENDIAN) { 91d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet for (i = 0; i < rshader->bc.ndw; ++i) { 92d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet ptr[i] = bswap_32(rshader->bc.bytecode[i]); 93d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } 94d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } else { 95d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr)); 96843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 97294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 1024f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1094f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 1171235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse 121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader); 1223b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet 123eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 125052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse 129c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* Would like some magic "get_bool_option_once" routine. 130c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse */ 131c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (dump_shaders == -1) 132c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 134052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 136eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin tgsi_dump(shader->tokens, 0); 137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 138eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin r = r600_shader_from_tgsi(rctx, shader); 1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_build(&shader->shader.bc); 1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 148052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 1494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_dump(&shader->shader.bc); 150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 152afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse 15569251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 156ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 157041ed559e11ee99d720c8132428c07d8fe57ec81Marek Olšák r600_bo_reference(&shader->bo, NULL); 1584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_clear(&shader->shader.bc); 159eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 160eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin memset(&shader->shader,0,sizeof(struct r600_shader)); 161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 184077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned ar_reg; 1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 1864a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode *bc; 1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 18840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy struct r600_shader_src src[4]; 189cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 190cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 191e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 196fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 1972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 20742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 221c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 222a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 2298260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 23647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 244fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 24550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 2474a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 2677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 2734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 281fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 286fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 2954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 3007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0; 31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 32721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 3287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 33396bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 33472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 34035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 3418a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 34389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) { 34450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 34521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION && 34621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie ctx->shader->input[i].name != TGSI_SEMANTIC_FACE) { 34721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 348fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 349fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 35021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } else { 35121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie evergreen_interp_flat(ctx, i); 352fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 353fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 35450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 36135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 362dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if (ctx->type == TGSI_PROCESSOR_VERTEX) { 363dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher /* these don't count as vertex param exports */ 364dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if ((ctx->shader->output[i].name == TGSI_SEMANTIC_POSITION) || 365dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher (ctx->shader->output[i].name == TGSI_SEMANTIC_PSIZE)) 366dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher ctx->shader->npos++; 367dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher } 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 37133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 37247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 37496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 375c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 376c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 3774a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 37996bbc627f369c0100b950f81531b1fe9ef586c34Christian König 380c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 381c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 382c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 38396bbc627f369c0100b950f81531b1fe9ef586c34Christian König 38496bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 38596bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 38696bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 387c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 38896bbc627f369c0100b950f81531b1fe9ef586c34Christian König 3894a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 390c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 391c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 392c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } 39396bbc627f369c0100b950f81531b1fe9ef586c34Christian König 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 39972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 40072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 401be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 402be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 403be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 404be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 405be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 424fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 425fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 426fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 427fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 428fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 429fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 430fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 431fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 432fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 433fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 434fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 435fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 436fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 437fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 438fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 439fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 440fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 441fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 442fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 443fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 444fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 445fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 446fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 447fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 448fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 450fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 451fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 452fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 4531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 4541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 4551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 4561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 4571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 4601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 4611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 4621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 4631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 46496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 4651fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 4661fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 4671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 4681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 4691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 4701fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 4711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 4724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 4731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 4741fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 4751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 4771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 4781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 47996bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 480c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* assume we wan't TGSI_SEMANTIC_INSTANCEID here */ 481c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[0] = 3; 482c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[1] = 3; 483c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[2] = 3; 484c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[3] = 3; 485c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->sel = 0; 486c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 4871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 4881fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 4891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 4901fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 4911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 4931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 4964a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 5014a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 502077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 505077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 507077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 509077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 510077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 511077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 512077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 513077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 514077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5154a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 516077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 517077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 518077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 519077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 520077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = ctx->ar_reg; 521077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 522077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 523077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 524077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 525077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 526077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 527077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 536d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 537077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5384a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 539077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 540077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 541077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 542077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 543077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5474a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 5537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 557077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 558077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 559077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 560077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 561077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 562077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 563077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 564077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 565077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 566077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 567077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 568077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 569077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 5724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 5817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 5824a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5984a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 6007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 6027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 6047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 6077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 6157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 6167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 6177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 6187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 6197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 6204a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 6217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 6227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 6237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 6257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 6267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 6297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 6307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 631eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader) 63272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 633eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 634eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct tgsi_token *tokens = pipeshader->tokens; 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 6365555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 6384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 641feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher int i, j, r = 0, pos0; 64272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 6454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_init(ctx.bc, rctx->chip_class); 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 651f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 653eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) || 654eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin ((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color)); 655eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 656feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 657feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 659076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 660076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 661076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 662f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 663f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 664f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 666076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 667076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 668076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 669076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 68489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 6854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 686f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 6874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 688f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 69089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 691fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 69284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 6944d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_INPUT] + 1; 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 6964d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 697d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 69897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 69997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 70097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 701d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 7027728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 703077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 7044d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 705077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.temp_reg = ctx.ar_reg + 1; 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 707cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 708cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 7095555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 715cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 716cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 717cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 718cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 719cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 720cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 721cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 722cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 723cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 724cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 735be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 736be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 737be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 7381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 7397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 7407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 7417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 7427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 7437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 74489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 7457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 74689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 74750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 74850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 74950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 754876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 7555555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 7565555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 7575555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 7585555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 7595555cd776b970bce020be59193054474a2a63317Dave Airlie } 760876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 767eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 768457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 769eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 770eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* clamp color outputs */ 771eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->clamp_color) { 772eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (i = 0; i < noutput; i++) { 773eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->output[i].name == TGSI_SEMANTIC_COLOR || 774eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->output[i].name == TGSI_SEMANTIC_BCOLOR) { 775eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 776eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin int j; 777eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (j = 0; j < 4; j++) { 7784a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 7794a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 780eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 781eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* MOV_SAT R, R */ 782eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 783eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.sel = shader->output[i].gpr; 784eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.chan = j; 785eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.write = 1; 786eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.clamp = 1; 787eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].sel = alu.dst.sel; 788eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].chan = j; 789eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 790eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (j == 3) { 791eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.last = 1; 792eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 7934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx.bc, &alu); 794eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (r) 795eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin return r; 796eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 797eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 798eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 799eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 800eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 801eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 802feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j = 0; 803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 8044a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 805feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 806feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 807feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 808feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 809feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 810feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 811feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 812feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 813feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 814feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = i - pos0; 815feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 816457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 819feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 60; 820feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 822457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 823457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 824457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 825feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 826feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 827457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 828457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 833feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid; 834feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 8354f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 836feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher for (j = 1; j < shader->nr_cbufs; j++) { 8374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i + j], 0, sizeof(struct r600_bytecode_output)); 838feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 839feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 840feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 841feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 842feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 843feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 844feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 845feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 846feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid + j; 847feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 848feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 849feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 850feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j--; 851feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 8525f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 853feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 854feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 2; 855feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 7; 856feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 857feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 85839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 859feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 860feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 7; 861feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 862feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 863feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 87472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 875457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 876feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher noutput += j; 877457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 878457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 879457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 880457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 881457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 882457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 883457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 884457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 885457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 8864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 887457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 888457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 889457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 890457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 891457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 892457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 8938ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 894457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 895457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 896457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 8977e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 898457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 900c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 901481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 902481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 9034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[0], 0, sizeof(struct r600_bytecode_output)); 904481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 905481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 906481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 907481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 908481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 909481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 9108ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 911481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 912608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 913481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 914a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 915481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 916481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 917457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 918457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 91989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 9207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 9217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 9227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 923457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 924b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 925b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 927c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 928c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 929457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 930457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 9314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 9357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 93689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 9374a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 9387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9393b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 943cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 950f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 951f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9604a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 961a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 962a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 963a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 964a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 965a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 966a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 967a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 968a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 969a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 970a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 971a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 9724a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 973f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 974f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 975f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 976f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 977f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 9784a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 9793efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 9803efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 9813efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 9823efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 98380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 98480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 98580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 9864a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 9887a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9897a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 992de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 99447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 99547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 9967a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 9977a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 9987a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1001dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1003dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1004d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1005d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1006dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1007d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1008d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1009d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1010dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1011dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1012dffad730df17983cfaef0808555a8c26cad0aa15Christian König 1013cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_int_to_flt(struct r600_shader_ctx *ctx) 1014cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1015cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1016cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1017cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 1018cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1019cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1020cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1021cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1022cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1023cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1024cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1025cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1026cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1027cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1028cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1029cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1030cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1031cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1032cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1033cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1034cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1035cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1036cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1037cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1038cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1039dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 1040dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1041dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1043dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1044dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1046d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1047d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1048d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1049d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 10504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 105180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1053d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 10564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1058d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 10594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 10604a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 10654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 10677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 10684a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 10697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1073d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 10764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1083d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1084d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1085d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 1086d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1087d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1088d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1089d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1090d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 1091d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1092d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1093cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1094cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1095cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1096cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1097cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1098cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1099cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1100cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1101cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1102cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1103cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1104cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1105cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1106cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1107cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1108cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1109cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1110cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1111cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1112cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1113cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1114cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1115cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1116cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1117cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1118cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1119cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1120cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1121cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1122cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1123cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 11247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 11257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 11267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 11284a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 11307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 11324a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 11337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 11347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 11354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 11367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 11397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 11417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 11424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 11437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 11447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 11457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 11477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 11487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 115088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 115288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 11541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 115588f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 115696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 115796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 115896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 115996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 116096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 11614a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 11634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1164a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 116588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 116688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 116888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 116988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 117088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11714a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 11727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1173921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 117696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1177ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 11794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 118288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1184a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 11857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 118688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 118788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 118888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 118988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 119088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 119188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 119288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 11934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 119488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1198a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 119988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 120088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 120188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 120288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 120388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 120488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 120588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 120688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 12077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1208921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1210921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1211ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 121296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 121389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1214a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1215a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 121696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 121796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 121896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 121996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 122096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 122196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 122288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12234a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 122488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 122588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 122692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 122792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 122892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 12307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 12317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12324a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 12347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 12357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 12377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 12424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 12437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 12447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 12457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 12487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 12507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 12517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 12527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 12547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 126092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 126192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 126292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12634a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 126492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1265dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 126892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 126992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 127088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 127288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 127388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 127488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 127588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 127688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 127788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 127888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 127988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 128188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 128288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 128388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 128488f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1285be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1286be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1287be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1288be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 12894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1290a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1291be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1292be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 129380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1294be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 129588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 129788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 129888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 129988f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 130088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 130188f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 130288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 130392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 130492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 130592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13064a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 13077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 130892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 130957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 131057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 131157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 131257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 13131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 131457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 131557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 131657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 131792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 131892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 131957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 132089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 13217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 13224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 13247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 13277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13394a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 13417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 134292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 13437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 135057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 135192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 135292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 135357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 135489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 13564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 13747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 137557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 138357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 138492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1385ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1386ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 13874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1388ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1389ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1390ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 139180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1392ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1393ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1394ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1395ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1396ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1397ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 13984a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1399ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1400ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1401ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1402ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1403ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1404ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 14054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1406ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1407ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1408ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 140980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1410ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1411ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1412ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1413ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1414ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1415ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 14164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1417ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1418ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1419ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1420ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 142192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 142292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 142392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1424094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1425094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 14264a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1427094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1428094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1429094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 14304a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1431094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 14324502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1433094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 14344502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1435921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 14364502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14374502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 14384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 14394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 14404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 14414a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 14424502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1443094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1444094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1445094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1447094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1448094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1449094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 14524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 14534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1454094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1455094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1456094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 14570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 14580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 14590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 14620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1463f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 14644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1465f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 14664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 1467f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1468f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 1469f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1470f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1471f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 1472f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 1473f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1474f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 14754a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1476f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 1477f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 1478f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 14790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 14800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 14816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 14826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 14837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 14846a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 148589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 14867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 1487f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 14884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1490f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1491f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 1492f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1493f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 14947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 14957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 14967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 14987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 14997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 1505f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 15064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1508f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1509f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 15102fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 15112fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 15122fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 15196a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 15206a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 15210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 152286f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 15234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1524a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 152586f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 152686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 15274a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 15284a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 15290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 15300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 15310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 15320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 15330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 15344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 15360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 15370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 153889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 15507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 15514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 15567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 15627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15634a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1568abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 15698567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 15704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15718567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 15728567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 15738567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 15748567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 15758567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 15764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15778567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 15788567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 15798567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 1580abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 15814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1582abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 15834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1584abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1585abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1586abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1587abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 15884a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1589abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1590abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1591abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1592abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 15934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1594abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1595abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1596abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1597abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1598abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1599abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 16004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1601abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1602abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1603abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 16040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 16050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 16060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 160742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 160842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 160942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 161142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 161242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 16134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1614df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1615df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1616df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1617df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1618df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1619df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1620df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 162142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 16234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 162442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 162542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 162642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 162742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 16284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 162942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 163042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 163142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 163242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 163342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 163442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1635a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 16367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 16377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1639a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 16407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 16417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 16424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1644a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 16457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 164680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 16487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 16497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 16504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 16547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 16557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 16567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1657a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1658a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1659a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1661a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1662a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1664a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1665a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 1667a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1668a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1669a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1670a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 16714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1672a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1673a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1674a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1675a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1676a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1677a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 16824a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 16837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 16847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 16864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 16884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 16897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 16907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 16917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 17004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 17024a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 17037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 17047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 17057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 17067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 17127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 17134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 17157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 17167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 17197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 17207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 17257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 17267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 17277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1728a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1729a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 17304a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1731a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1732a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1733a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 17344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1735a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 17364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1737a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1738a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1739a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17404a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1741a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1742a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1743a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 17444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 174566f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 17464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 1747a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1748a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1749a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1750a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1752a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1753a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1754a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 17554a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1756a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1757a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1758a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1759a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1760a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17614a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1762a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1763a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1764a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1765a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1766a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17670d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 17680d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 17690d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17704a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1771921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 17720d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17730d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 17740d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 17754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1776a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 17770d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1778cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 17790d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1780cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 17810d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17824a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 1783921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 17844a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 17850d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17860d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 17870d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 17884a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17890d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 17900d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 17910d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 17920d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17930d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 17940d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 17954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1796a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 17970d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 179880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17990d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18000d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1801cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 18020d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 18030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1804921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 18050d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 18060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18070d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1808cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 18090d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18100d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 18110d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 18124a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18130d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 18140d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 18150d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 18160d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 18170d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 18180d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1819cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1820cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 18214a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1822cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1823cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1824cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 18254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1826cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1827a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 18286c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1829cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1830a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 183180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1832cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1833cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1834cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1835cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1836cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1837cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 18384a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1839cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1840cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1841cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1842cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1843cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1844cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1850dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 18527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 18537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 18547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 18557be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 18564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 186280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1864cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 18667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1874cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1875cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1876cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1877cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1878cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18794a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1880cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1881cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 18834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1884cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1885cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18864a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1887cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1888a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 188980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1890cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1891a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1892cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1893cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1894cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1895cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1896921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1897cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1898cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1899cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1900cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1901cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1902921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1903cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1904cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1905cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1906e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1907e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1908e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1909e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1910e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1911e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1912e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1913cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1914cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19194a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19237be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 19266415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 19276415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 19286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 19316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 19326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 19336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 19356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 19366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 19376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 19406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 194233241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 194333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 194496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 194533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19464a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 19474a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1948641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 194940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 1950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1951da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 1952da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 19536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 195478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 195513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 19561d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 1957641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 1959641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 19611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 19621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 19631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 19641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 19651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 19661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 19671d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 19681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 19691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 197013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 197113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 197213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 197340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 197440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 19754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 197640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 197740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 197840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 197940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 198040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 198140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 198240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 198340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 198440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 198540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 198640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 198740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 198840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 19894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 199040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 19914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 199240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 199340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 199440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 199540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 199640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 19974a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 199840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 199940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 200040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 200113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 200240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 200340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 200440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 200540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 200640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 200740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 200840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 200940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 201040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 201140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 201240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 201340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 201440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 201540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 201640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 201740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 20184a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 201940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 202040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 202113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 202213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 2024b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 202589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 20284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20304a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 2031bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20384a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 20454a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 20487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 2058b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 20594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2060a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2061b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 20634a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2064b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2065b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2066b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 20674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2068b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2069b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2070b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 20714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2073921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2074b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 2075b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2076b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 2077b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2078b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 20794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2080b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2081b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 208278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2083b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2084bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2085bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 20870e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 20880e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 2089bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2090bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 2091bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 20924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2093a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 20944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 20954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 2096bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2097bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 2098bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 2099bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 2100bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 21014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2102bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2103bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2104bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2105bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2106bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 210789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 21094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 21137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 21147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 21167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21204a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 21297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 21307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 21327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2139bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 2140bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 21417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 2142bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 21434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2144a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2145bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2146bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2147bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2148bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 2149bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2150bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 21517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2152bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2153bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2154a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2155bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2157bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 2158bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2159bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21604a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2161bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2162bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2163bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2165a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2166bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2167bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2168bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2169bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 2170bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2171bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 21727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2173bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2174bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2176bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2177bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2178bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 2179bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2180bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2181bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 21824a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2184bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2185bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 218678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2187bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2188bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2189bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 219078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2191b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 21924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2193a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 21944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2195b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2196b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2197b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2198b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2199b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 22004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2201b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2202b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2203b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 220478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2205b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2206b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 22077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2208bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2209929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2210929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 22116b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2212929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 2213929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 2214de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2215de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2216de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2217de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2218de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2219de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2220de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2221c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 2222c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 2223c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 2224de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2225de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2226de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2227de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2228de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 222933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 22304a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 2231bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 22326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 22336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2234077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2235641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 22366c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 22379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 22389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 22399d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 22409d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 224178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 224278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 224378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 224478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 224578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 224678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 224778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 224878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 224978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 225078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2251244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 225278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 22539a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2255bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2257bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2258bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22616b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 22626b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 226301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 226401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 226501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 22666b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 22676b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 2268bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 22701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 22711d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 227269d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2273929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 2274929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 2275929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 2276929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2277929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 22786b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2279929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 2280929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 2281929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 228278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2283929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2284929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 2285929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2286929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 2287929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 2288929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 2289929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 2290929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 2291929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 2292929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2293929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2294929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 2295929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2296929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2297929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2298929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2299929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2300bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 2302bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2303bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2304bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2305bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2306bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 230733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 230833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2309b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2310b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2311b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23124a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2313dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2314b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2315b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2316b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2317c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 23181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2319c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2320c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2321c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2322c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 23234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2324c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 23254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 23264a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2327c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 232880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2329c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2330c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2331c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2332c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 23334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2334c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2335c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2336c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2337c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2338c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2339c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2340b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2341dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2342dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2343dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2344dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23454a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2346a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2347921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2348b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 23494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 23504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 2351b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2352b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2353dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2354b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2355b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2356b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 23574a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2358b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2359b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2360b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2361b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2362b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2363dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2364dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2365dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2366dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23674a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2368a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2369b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2370b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 23714a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2372b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2373b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2374dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2375b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2376b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2377b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 23784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2379b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2380b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2381b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2382b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2383b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2384dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2385dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2386dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2387dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2389a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2390b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 23914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 23924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2393b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2394b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2395dffad730df17983cfaef0808555a8c26cad0aa15Christian König 239680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2398dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2399b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 24014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2402b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2405dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2406b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 240887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 240987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 241087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24114a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 241287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2413dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 241487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24157be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 24167be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 24177be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 241887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24194a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2420a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 24214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 24224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 24234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 242480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 242587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 242687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 242787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 24287be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 242987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 24304a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 243187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 243287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 24337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 243487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 243587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 243687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 24380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 24390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24400e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 24410e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 24424a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 24430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 24440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 24450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 24470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 24480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 24504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2451a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24520e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 24534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 24544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 24550e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 24560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 24570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 24580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 24590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 24600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 24630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 24640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 24650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 24670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 24684a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 24700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 24710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 24744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2475a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 24760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24770e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 24784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 24794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 24800e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 24810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 24820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 24830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 24840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 24850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 24880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 24890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 24900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 24920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 249380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 249480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 24960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 24970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 24980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 24990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 25004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 25020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 25030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 25050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 25060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 25070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 25080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 250936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 251036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 251136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 25124a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 251309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 25147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 251536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 251636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 251736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 25184a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 251936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2520a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 25214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 252236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 252336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 252436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 252536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 252636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 25274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 252836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 252936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 253036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 253189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 25327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 253636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 25407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 256036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 25617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 256236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 256336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 25644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 256536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2566a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 25674a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 256836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 256936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2570b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2571b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2572b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2573b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2574b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 257536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 257636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 257736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 257836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 257936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 258136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 258236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 258336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 258436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 258536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 258636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 258789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 259236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 25967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 259936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 26047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 26074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 260836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 26127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 261936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 262036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 262136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 262236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 26234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 262436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2625a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 262636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 262736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 262836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 262936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 263036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 263136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 263236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 26334a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 263436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 263536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 263636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 263736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 263836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 263987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2640460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2641460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26434a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2644460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2647f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 2648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 264989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2652460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 26607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26634a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26694a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26734a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 26777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2683460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2684460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2685460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2686460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2687460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2688460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2689460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2690460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2691460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2692460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26934a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2694460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2695460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2696460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2697460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2698f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 2699460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2700460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 270189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 270496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 270896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 273696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 273896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 273996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 274096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 274196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 274296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 274396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 274496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 274596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 274696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 274796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 274996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 275096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 275196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 275289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27544a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 276596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 277596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 278096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 278596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 278689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27884a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 27907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 27927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28004a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 28077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 280996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 28127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 281496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28154a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 281996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 282196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 282296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 282396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 282696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 282796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 282896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2829460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2830460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2831460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2832460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2833460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2834460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2836460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2837460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2838460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2839460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2840f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 2841460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 284289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28444a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2845460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28484a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 2849460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 2856460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28574a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28624a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28734a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2877460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2878460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2879460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2880460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 28814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2882460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2883460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2884460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2885460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2886460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2887460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2888460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2889460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2890460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2891460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2893460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2894460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2895460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2896460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2897460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2898460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2899460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 290098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 290198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 290298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29034a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 290498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 2905a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 29064a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 290798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 290852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 290952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 291052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 291152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 291252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 291352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 291452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 291552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 291652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 291752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 291852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 291952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 29204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 292198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2922077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 292398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 29244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 292598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 292698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 2927077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2928077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet /* TODO: Note that the MOVA can be avoided if we never use AR for 2929077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * indexing non-CB registers in the current ALU clause. Similarly, we 2930077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * need to load AR from ar_reg again if we started a new clause 2931077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * between ARL and AR usage. The easy way to do that is to remove 2932077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * the MOVA here, and load it for the first AR access after ar_reg 2933077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * has been modified in each clause. */ 29344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 293598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2936077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 293798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 293898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 29394a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 294098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 294198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 294298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 294398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 294498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 294547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 294647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 294747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 294947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 2950a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 29517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 29527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 2953077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2954077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 29554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2956077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2957077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2958077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2959077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29604a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2961077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 2962077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2963077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2964077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 2965077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 2966077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2967077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2968077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2969077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29704a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 29727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 29737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 2974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 29764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29814a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 29837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 29847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 29857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 29867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 29877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 29887ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 299247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 299347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 29944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 299547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 299647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2997c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 299847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 299947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 300047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 300157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 300257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 300357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30044a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 300557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 300657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 300757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 30084a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 300957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 301180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 30127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 301457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 301557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 30164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 301757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 301857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3019a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 302057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 302157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 30224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 302357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 302457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 302557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 30264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 302757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 302857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 302957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 303057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 303157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 303257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3033a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 3034a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30354a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3036a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 3037a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3039a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 3040a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 3041a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3042a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 3043a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 3044a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 3045a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30464a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 3047a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 3048a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 30497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3050a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 3051a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3053a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 3054a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 3055a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 3059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30602bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 30612bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 30622bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 30632bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 30642bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 30652bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 30662bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 30672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 30682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 30692bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 30712bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 30722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 30732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 30752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 30762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 30782bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 30792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 30822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 30834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 30848813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 30858813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 30868813842121d46d1be476807c98b0ba0b771f0c91Christian König } 30872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 3088a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3089a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3090a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 309109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 3092a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 309709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 309809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 310009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 310109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 310209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 310309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 310409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 310509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 310609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3107a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 310809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 310909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 311009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 311109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 311209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 311309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 311409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 311509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 311609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 311709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 3119a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 3120a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 3121a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 312209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 312309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 312409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 312509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 312609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 312709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 312809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 31297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 313009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 313109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 313209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 313309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 313609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 313809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 313909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 314009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 314109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 314509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 314609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 314809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 314909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31544a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 31554a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 315809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3159a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 316109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 316609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 317409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 317509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 317909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 318009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 318109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 318209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 31834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 318409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 318909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 319109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 319209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 319309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 319409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3195a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 319609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 319809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 321009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 321309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 321509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 321809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 322309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 322509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 322609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 322709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 322809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3230a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32324a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 323509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3237a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3238a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3239a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3240a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3241a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 32424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3243a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3244a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3247a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3248a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3249a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3250a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3251a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3252a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3254a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3255a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3256a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3257a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3258a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3259a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3260a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3261a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 326209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3263a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 326409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 326509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 326609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 326709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 326809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 326909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 327009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 327109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 327309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 327409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3275a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 327609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 327709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 327809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 327909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 328009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 328309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32854a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 328909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 329509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 329609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 330109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 330309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 330509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 330909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3332a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3333a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3334a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3335cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 3336cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 3337cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3338cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 3339cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 3340cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3341cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3342cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 3343cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3344cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3345cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3346cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3347cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3348cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3349cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 3350cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 3351cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 3352cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3353cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT; 3354cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 3355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3361cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3362cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3363cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3364cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3365cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3366cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3367cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3372cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3373cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3374cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT; 3375cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 3377cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 3378cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3379cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3380cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3381cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3382cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3383cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3384cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3385cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3386cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3387cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 3388cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 3389cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 339198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 33930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3394df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3395df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3396df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3397df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3398df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3399df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3400df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 340142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 340236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3403460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3406cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3407cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 340857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3409dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3411d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3412be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34253af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3426df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 34277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 34284558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 34300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3435e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 343688f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 34373af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 34383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 34394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34450d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34470d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 344888f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3449d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 34500d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3452b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 345313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3454b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34619f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34650d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 346687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 346792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3468c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 3469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3471cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3472ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 347309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3474a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3478a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3479a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3487cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 34880ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3495cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 3496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 34981d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 349909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 350209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 350409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3521094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3551cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3552cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3553cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3554cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3555cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3556cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3557cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3558cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3559cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3560cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3561cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3562cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 3563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 356550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 356650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 356798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 356850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 356950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 357050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 35718ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 357250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3573112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 357450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 357550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 357650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 357750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 357850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 357950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 358050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 358150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 358250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 358350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 358450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 358550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 358650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 358850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 359050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 359150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 359250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 359350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 359450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 359550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3596df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 359750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 359850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 359950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 360050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 360150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 360250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 360450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 360650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 360750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 360850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 360950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 361050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 361650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 361850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 361950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 362050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 362150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 362250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 362313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 362450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 362550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 36327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 36367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 36377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3638c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 36397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 36427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 36437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 36447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 36457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3656cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_int_to_flt}, 3657cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 36587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 36597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3662cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3663cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 36647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3665cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 36667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36671d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 36681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 36697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 36707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 36737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 36757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3695cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3697cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3698cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3699cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 3700cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3702cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3704cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3705cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3707cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3708cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3709cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3711cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2}, 3712cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3713cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3715cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3716cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3721cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3722cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3723cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3724cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3725cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3726cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3727cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3728cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3729cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3730cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3731cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3732cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 37357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 37417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 37427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 37437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 37447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 37457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 37507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 37517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 37537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 37547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3766df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 37687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 37697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 37717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 379313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 380250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 380650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 380750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3808c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 380950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3812ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 381350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 381450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 381550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 381650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3827cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 38280ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3835cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38371d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 38381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 383950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 384050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 384350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 384550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 384750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 385350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 386250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 386350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 386450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3867cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3868cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 386950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3891cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3892cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3893cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3894cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3895cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3896cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3897cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3898cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3899cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3900cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3901cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3902cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 390350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3905