r600_shader.c revision 6b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbe
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 3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 30796bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 30872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 31435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 3158a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 31789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) { 31850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 319fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 320fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 321fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 322fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 323fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 324fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 32550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 33235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 333dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if (ctx->type == TGSI_PROCESSOR_VERTEX) { 334dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher /* these don't count as vertex param exports */ 335dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if ((ctx->shader->output[i].name == TGSI_SEMANTIC_POSITION) || 336dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher (ctx->shader->output[i].name == TGSI_SEMANTIC_PSIZE)) 337dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher ctx->shader->npos++; 338dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher } 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 34233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 34347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 34596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 346c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 347c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 3484a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 35096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 351c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 352c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 353c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 35496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 35596bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 35696bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 35796bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 358c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 35996bbc627f369c0100b950f81531b1fe9ef586c34Christian König 3604a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 361c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 362c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 363c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } 36496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 37072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 37172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 372be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 373be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 374be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 375be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 376be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 3777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 380fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 388fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 396fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 397fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 398fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 404fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 405fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 4241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 4251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 4261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 4271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 4281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 4291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 4301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 4311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 4321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 4331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 4341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 43596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 4361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 4371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 4381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 4391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 4401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 4411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 4421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 4434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 4441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 4451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 4461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 4481fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 4491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 45096bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* assume we wan't TGSI_SEMANTIC_INSTANCEID here */ 452c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[0] = 3; 453c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[1] = 3; 454c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[2] = 3; 455c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[3] = 3; 456c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->sel = 0; 457c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 4601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 4611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 4621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 4641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 465077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 466077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 4674a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 468077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 469077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 470077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 471077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 4724a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 473077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 474077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 475077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 476077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 477077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 478077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 479077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 480077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 481077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 482077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 483077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 484077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 485077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 4864a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 487077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 488077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 489077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 490077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 491077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = ctx->ar_reg; 492077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 493077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 496077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 501077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 502077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 505077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 507d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5094a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 510077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 511077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 512077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 513077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 514077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5157687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 5167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5184a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 5197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 5207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 5227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 5237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 5247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 5267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 536077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 537077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 538077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 539077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 540077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 5417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 5427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 5434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 5477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 5534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 5587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 5597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 5607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 5637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 5647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 5667687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 5677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5694a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 5814a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 5827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 5914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 6007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 6017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 602eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader) 60372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 604eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 605eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct tgsi_token *tokens = pipeshader->tokens; 606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 6075555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 6094a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 610457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 612feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher int i, j, r = 0, pos0; 61372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 6164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_init(ctx.bc, rctx->chip_class); 617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 622f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 624eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) || 625eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin ((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color)); 626eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 627feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 628feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 630076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 631076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 632076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 633f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 634f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 635f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 637076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 638076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 639076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 640076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 65589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 6564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 657f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 6584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 659f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 66189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 662fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 66384457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 6654d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_INPUT] + 1; 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 6674d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 668d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 66997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 67097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 67197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 672d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 6737728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 674077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 6754d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 676077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.temp_reg = ctx.ar_reg + 1; 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 678cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 679cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 6805555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 686cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 687cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 688cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 689cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 690cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 691cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 692cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 693cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 694cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 695cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 706be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 707be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 708be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 7091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 7117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 71589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 7167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 71789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 71850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 71950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 72050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 725876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 7265555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 7275555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 7285555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 7295555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 7305555cd776b970bce020be59193054474a2a63317Dave Airlie } 731876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 738eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 739457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 740eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 741eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* clamp color outputs */ 742eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->clamp_color) { 743eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (i = 0; i < noutput; i++) { 744eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->output[i].name == TGSI_SEMANTIC_COLOR || 745eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->output[i].name == TGSI_SEMANTIC_BCOLOR) { 746eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 747eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin int j; 748eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (j = 0; j < 4; j++) { 7494a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 7504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 751eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 752eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* MOV_SAT R, R */ 753eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 754eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.sel = shader->output[i].gpr; 755eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.chan = j; 756eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.write = 1; 757eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.clamp = 1; 758eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].sel = alu.dst.sel; 759eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].chan = j; 760eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 761eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (j == 3) { 762eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.last = 1; 763eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 7644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx.bc, &alu); 765eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (r) 766eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin return r; 767eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 768eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 769eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 770eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 771eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 772eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 773feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j = 0; 774457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 7754a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 776feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 777feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 778feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 779feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 780feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 781feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 782feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 783feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 784feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 785feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = i - pos0; 786feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 787457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 790feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 60; 791feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 796feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 797feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 804feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid; 805feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 8064f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 807feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher for (j = 1; j < shader->nr_cbufs; j++) { 8084a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i + j], 0, sizeof(struct r600_bytecode_output)); 809feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 810feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 811feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 812feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 813feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 814feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 815feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 816feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 817feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid + j; 818feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 819feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 820feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 821feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j--; 822feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 8235f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 824feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 825feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 2; 826feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 7; 827feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 828feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 82939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 830feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 831feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 7; 832feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 833feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 834feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 84572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 846457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 847feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher noutput += j; 848457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 849457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 850457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 851457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 852457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 853457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 854457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 855457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 856457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 8574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 858457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 859457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 860457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 861457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 862457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 863457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 8648ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 865457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 866457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 867457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 8687e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 869457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 871c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 872481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 873481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 8744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[0], 0, sizeof(struct r600_bytecode_output)); 875481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 876481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 877481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 878481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 879481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 880481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 8818ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 882481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 883608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 884481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 886481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 887481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 888457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 889457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 89089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 8917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 8927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 8937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 894457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 895b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 896b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 897a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 898c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 899c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 900457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 901457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 9024a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 9067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 90789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 9084a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 9097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9103b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 914cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 921f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 922f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 9314a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 932a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 934a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 935a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 936a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 937a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 938a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 939a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 940a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 941a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 942a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 9434a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 944f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 945f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 946f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 947f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 948f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 9494a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 9503efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 9513efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 9523efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 9533efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 95480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 95580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 95680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 9574a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 9597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9607a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 96547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 96647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 9677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 9687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 9697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 972dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 973de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 974dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 977dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 979d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 980d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 981dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 982dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 983dffad730df17983cfaef0808555a8c26cad0aa15Christian König 984cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_int_to_flt(struct r600_shader_ctx *ctx) 985cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 986cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 987cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 988cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 989cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 990cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 991cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 992cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 993cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 994cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 995cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 996cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 997cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 998cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 999cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 1000cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1001cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1002cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1003cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1004cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1005cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1006cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1007cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1008cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1009cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1010dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 1011dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1012dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10134a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1014dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1015dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1017d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1018d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1019d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1020d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 10214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 102280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1024d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1025d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 10274a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1029d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 10304a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 10314a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1033de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 10364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 10387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 10394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 10407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1044d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 10474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1055d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1056d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 1057d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1058d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1059d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1060d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 1061d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 1062d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1063d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1064cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1065cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1066cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1067cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1068cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1069cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1070cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1071cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1072cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1073cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1074cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1075cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1076cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1077cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1078cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1079cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1080cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1081cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1082cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1083cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1084cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1085cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1086cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1087cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1088cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1089cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1090cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1091cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1092cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1093cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1094cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 10957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 10967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 10977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 10994a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 11017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 11034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 11047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 11057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 11064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 11077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 11107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 11127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 11134a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 11147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 11157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 11167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 11187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 11197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 11251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 112796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 112896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 112996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 113096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 113196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 11324a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 11344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1135a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 113688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 113788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 113988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 114088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 11437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1144921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1146a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 114796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1148ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 11504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 115288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11544a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1155a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 11567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 116188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 116288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 116388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 11644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 116588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 116688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 116788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11684a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1169a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 117088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 117188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 117288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 117388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 117688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 11787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1179921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1181921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1182ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 118396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 118489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1185a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1186a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 118796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 118896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 118996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 119096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 119196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 119296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 119388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 11944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 119792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 119892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 119992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 12017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 12027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12034a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 12057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 12067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 12087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 12134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 12157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 12167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 12197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 12217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 12227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 12237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 12257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 12297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 12307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 123192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 123292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 123392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12344a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 123592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1236dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 123792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 123992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 124092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 124188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 124388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 124488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 124588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 124688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 124788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 124888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 124988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 125088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 125288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 125388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 125488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 125588f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1256be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1257be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1258be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1259be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 12604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1261a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1262be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1263be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 126480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1265be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 126688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12674a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 126888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 126988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 127088f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 127188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 127288f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 127388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 127492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 127592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 127692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12774a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 127992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 128057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 128157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 128257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 128357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 12841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 128557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 128657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 128757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 128892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 128992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 129057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 129189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 12927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 12934a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 12947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 12957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 12987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 12997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13104a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 13127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 131392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 13147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13174a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 132157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 132292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 132392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 132457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 132589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 13267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 13274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 13297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 13317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13384a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13434a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 134657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 135457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 135592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1356ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1357ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 13584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1359ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1360ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1361ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 136280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1363ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1364ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1365ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1366ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1367ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1368ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 13694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1370ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1371ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1372ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1373ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1374ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1375ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 13764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1377ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1378ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1379ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 138080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1381ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1382ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1383ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1384ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1385ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1386ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 13874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1388ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1389ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1390ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1391ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 139292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 139392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 139492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1395094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1396094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 13974a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1398094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1399094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1400094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 14014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1402094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 14034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1404094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 14054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1406921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 14074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 14094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 14104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 14114502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 14124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 14134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1414094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1415094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1416094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14174a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1418094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1419094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1420094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 14234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 14244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1425094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1426094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1427094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 14290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14314a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1434f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 14354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1436f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 14374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 1438f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1439f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 1440f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1441f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1442f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 1443f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 1444f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1445f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 14464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1447f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 1448f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 1449f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 14500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 14510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 14526a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 14536a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 14556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 145689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 1458f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 14594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1461f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1462f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 1463f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1464f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 14657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 14667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 14677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 14697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 14707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 14714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 14757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 1476f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 14774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1479f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1480f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 14812fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 14822fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 14832fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 14906a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 14916a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 14920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 149386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 14944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1495a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 149686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 149786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 14984a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 14994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 15000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 15010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 15020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 15030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 15040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 15054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 15070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 15080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 150989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15124a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 15224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1539abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 15408567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 15414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15428567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 15438567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 15448567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 15458567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 15468567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 15474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15488567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 15498567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 15508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 1551abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 15524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1553abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 15544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1555abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1556abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1557abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1558abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 15594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1560abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1561abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1562abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1563abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 15644a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1565abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1566abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1567abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1568abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1569abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1570abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 15714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1572abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1573abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1574abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 15750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 15760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 15770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 157842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 157942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 158042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15814a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 158242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 158342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 15844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1585df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1586df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1587df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1588df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1589df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1590df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1591df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 159242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 15934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 15944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 159542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 159642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 159742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 159842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 15994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 160042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 160142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 160242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 160342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 160442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 160542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1606a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 16077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 16087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16094a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1610a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 16117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 16127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 16134a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1615a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 16167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 161780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 16197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 16207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 16214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 16267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 16277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1628a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1629a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1630a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16314a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1632a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1633a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1635a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1636a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 1638a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1639a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1640a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1641a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 16424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1643a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1644a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1645a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1646a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1647a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1648a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 16507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 16517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 16534a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 16547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 16557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 16574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 16594a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 16607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 16714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 16734a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 16767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 16777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 16837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 16844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 16867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 16877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 16887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 16907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 16917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 16924a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 16947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 16957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 16977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 16987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1699a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1700a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 17014a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1702a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1703a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1704a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 17054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1706a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 17074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1708a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1709a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1710a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17114a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1712a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1713a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1714a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 17154a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 171666f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 17174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 1718a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1719a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1720a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1721a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1723a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1724a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1725a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 17264a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1727a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1728a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1729a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1730a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1731a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17324a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1733a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1734a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1735a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1736a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1737a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17380d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 17390d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 17400d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17414a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1742921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 17430d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17440d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 17450d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 17464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1747a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 17480d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1749cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 17500d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1751cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 17520d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 1754921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 17554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 17560d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17570d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 17580d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 17594a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17600d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 17610d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 17620d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 17630d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17640d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 17650d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 17664a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1767a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 17680d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 176980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17700d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17710d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1772cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 17730d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 17740d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1775921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 17760d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 17770d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17780d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1779cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 17800d48925a56ad4fb253386110b545abda82a25464Dave Airlie 17810d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 17820d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 17834a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17840d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 17850d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 17860d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 17870d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 17880d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 17890d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 17924a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1793cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 17964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1797cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1798a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 17996c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1800cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1801a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 180280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1803cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1805cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1807cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1808cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 18094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1810cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1811cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1812cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1813cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18194a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1821dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 18237be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 18247be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 18257be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 18267be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 18274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18304a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18327be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 183380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1835cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 18377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18404a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1845cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1846cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1849cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18504a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 18544a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1855cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1856cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18574a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1858cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1859a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 186080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1861cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1862a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1864cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1865cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1866cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1867921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1868cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1869cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1870cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1871cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1872cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1873921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1874cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1875cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1876cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1877e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1878e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1879e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1880e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1881e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1882e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1883e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1884cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1885cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18904a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 18976415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 18986415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 18996415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19006415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19016415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 19026415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 19036415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 19046415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19056415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 19066415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 19076415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 19086415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19096415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19106415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 19116415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19126415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 191333241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 191433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 191596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 191633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19174a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 19184a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1919641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 192040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1922da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 1923da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 19246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 192578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 192613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 19271d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 1928641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 1930641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19311d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 19321d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 19331d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 19341d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 19351d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 19361d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 19371d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 19381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 19391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 19401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 194113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 194213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 194313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 194440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 194540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 19464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 194740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 194840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 194940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 195040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 195140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 195240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 195340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 195440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 195540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 195640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 195740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 195840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 195940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 19604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 196140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 19624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 196340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 196440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 196540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 196640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 196740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 19684a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 196940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 197040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 197140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 197213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 197340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 197440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 197540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 197640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 197740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 197840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 197940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 198040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 198140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 198240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 198340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 198440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 198540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 198640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 198740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 198840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 19894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 199040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 199140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 199213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 199313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 19947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 1995b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 199689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 19987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 19994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20014a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 20164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 2029b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 20304a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2031a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2032b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 20344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2035b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2036b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2037b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 20384a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2039b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2040b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2041b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 20424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2043a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2044921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 2046b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 2048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 20504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 205378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2054b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2055bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2056bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 20580e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 20590e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 20634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2064a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 20654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 20664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 2067bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2068bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 2069bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 2070bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 2071bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 20724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2073bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2076bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2077bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 207889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 20804a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20964a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21054a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2110bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 2111bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 21127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 2113bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 21144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2115a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2116bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2117bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2118bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2119bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 2120bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2121bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 21227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2123bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2124bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2125a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2127bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 2129bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2133bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2134bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2136a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2137bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2138bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2139bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2140bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 2141bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2142bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 21437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2144bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2145bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2146a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2147bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2148bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2149bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 2150bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2151bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2152bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 21534a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2154bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2155bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 215778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2158bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2159bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2160bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 216178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2162b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 21634a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2164a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 21654a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2166b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2168b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2169b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2170b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 21714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2172b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2173b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2174b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 217578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2176b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2177b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 21787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2179bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2180929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2181929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 21826b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2183929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 2184929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 2185de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2186de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2187de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2188de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2189de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2190de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2191de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2192c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 2193c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 2194c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 2195de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2196de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2197de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2198de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2199de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 220033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 22014a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 2202bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 22036415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 22046415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2205077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2206641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 22076c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 22089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 22099d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 22109d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 22119d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 221278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 221378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 221478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 221578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 221678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 221778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 221878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 221978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 222078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 222178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2222244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 222378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 22249a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2225bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2226bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2227bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2228bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2229bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2230bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2231bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22326b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 22336b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 223401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 223501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 223601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 22376b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 22386b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 2239bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 22411d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 22421d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 224369d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2244929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 2245929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 2246929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 2247929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2248929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 22496b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2250929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 2251929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 2252929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 225378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2254929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2255929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 2256929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2257929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 2258929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 2259929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 2260929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 2261929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 2262929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 2263929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2264929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2265929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 2266929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2267929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2268929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2269929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2270929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2271bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 2273bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2274bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2276bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 227833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 227933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2280b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2281b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2282b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 22834a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2284dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2285b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2286b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2287b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2288c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 22891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2290c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2291c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2292c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2293c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 22944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2295c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 22964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 22974a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2298c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 229980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2300c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2301c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2302c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2303c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 23044a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2305c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2306c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2307c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2308c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2309c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2310c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2311b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2312dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2313dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2314dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2315dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2317a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2318921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2319b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 23204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 23214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 2322b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2323b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2324dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2325b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2326b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2327b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 23284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2329b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2330b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2331b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2332b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2333b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2334dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2335dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2336dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2337dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23384a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2339a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2340b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2341b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 23424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2343b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2344b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2345dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2346b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2347b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2348b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 23494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2350b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2351b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2352b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2353b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2354b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2355dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2356dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2357dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2358dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2360a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2361b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 23624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 23634a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2364b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2365b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2366dffad730df17983cfaef0808555a8c26cad0aa15Christian König 236780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2368b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2369dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2370b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2371b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 23724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2373b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2374b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2375b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2376dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2377b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2378b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 237987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 238087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 238187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23824a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 238387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2384dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 238587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 23867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 23877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 23887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 238987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 23904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2391a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 23924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 23934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 23944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 239580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 239687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 239787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 239887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 23997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 240087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 24014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 240287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 240387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 24047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 240587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 240687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 240787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 24090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 24100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24110e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 24120e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 24134a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 24140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 24150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 24160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 24180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 24190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 24214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2422a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24230e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 24244a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 24254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 24260e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 24270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 24280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 24290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 24300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 24310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 24340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 24350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 24360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 24380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 24394a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 24410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 24420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 24454a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 24470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24480e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 24494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 24504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 24510e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 24520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 24530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 24540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 24550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 24560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 24590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 24600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 24610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 24630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 246480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 246580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 24660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 24670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 24680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 24690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 24700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 24714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 24730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 24740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 24760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 24770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 24780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 24790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 248036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 248136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 248236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24834a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 248409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 248636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 248736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 248836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 24894a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 249036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2491a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 24924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 249336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 249436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 249536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 249636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 249736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 24984a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 249936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 250036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 250136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 250289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 250736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 25117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 25137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25144a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 25227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 25257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25274a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 253136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 25327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 253336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 253436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 25354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 253636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2537a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 25384a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 253936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 254036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2541b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2542b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2543b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2544b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2545b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 254636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 254736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 254836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 254936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 255036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 255236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 255336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 255436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 255536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 255636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 255736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 255889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 256336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 257036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 257936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25864a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 259036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 259136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 259236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 259336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 25944a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 259536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2596a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 259736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 259836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 259936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 260036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 260136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 260236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 260336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 26044a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 260536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 260636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 260736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 260836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 260936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 261087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2612460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2613460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26144a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2615460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 26167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2617460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2618f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 2619460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 262089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26224a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2623460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26254a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26264a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26344a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2638460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26404a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26444a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26504a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2661460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26644a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2669f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 2670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 267289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26744a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 267596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 26767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 267996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 26807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 26837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26874a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 26917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27034a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 270796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27084a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 270996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 271096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 271196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 271296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 271396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 271496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 271596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 271696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 271796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 271896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27194a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 272096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 272196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 272296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 272389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 27297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 273696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27374a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27424a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 274696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 275196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27524a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 275696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 275789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27764a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 27787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 278096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 278596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27864a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 279096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 279296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 279396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 279496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 279796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 279896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 279996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2800460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2801460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2802460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2803460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2804460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2805460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2807460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2808460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2809460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2810460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2811f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 2812460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 281389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28154a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2816460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28184a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 2820460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 2827460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28374a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 28427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2848460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2849460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2850460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2851460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 28524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2853460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2854460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2855460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2856460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2857460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2858460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2859460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2860460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2861460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2862460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28634a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2864460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2865460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2866460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2867460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2868460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2869460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2870460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 287198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 287298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 287398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 28744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 287598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 2876a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 28774a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 287898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 287952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 288052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 288152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 288252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 288352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 288452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 288552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 288652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 288752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 288852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 288952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 289052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 28914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 289298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2893077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 289498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 28954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 289698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 289798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 2898077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2899077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet /* TODO: Note that the MOVA can be avoided if we never use AR for 2900077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * indexing non-CB registers in the current ALU clause. Similarly, we 2901077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * need to load AR from ar_reg again if we started a new clause 2902077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * between ARL and AR usage. The easy way to do that is to remove 2903077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * the MOVA here, and load it for the first AR access after ar_reg 2904077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * has been modified in each clause. */ 29054a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 290698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2907077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 290898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 290998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 29104a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 291198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 291298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 291398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 291498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 291598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 291647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 291747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 291847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29194a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 292047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 2921a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 29227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 29237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 2924077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2925077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 29264a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2927077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2928077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2929077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2930077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29314a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2932077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 2933077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2934077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2935077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 2936077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 2937077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2938077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2939077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2940077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29414a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2942077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 29437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 29447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 2945077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2946077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 29474a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 2948077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2949077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2950077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2951077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29524a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2953077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 29547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 29557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 29567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 29577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 29587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 29597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2960077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2961077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2962077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 296347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 296447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 29654a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 296647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 296747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2968c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 296947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 297047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 297147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 297257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 297357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 297457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29754a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 297657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 297757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 297857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 29794a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 298057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2981a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 298280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 29837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 29847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 298557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 298657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 29874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 298857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 298957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2990a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 299157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 299257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 29934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 299457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 299557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 299657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 29974a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 299857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 299957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 300057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 300157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 300257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 300357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3004a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 3005a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30064a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 3008a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3010a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 3011a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 3012a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3013a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 3014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 3015a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 3016a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30174a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 3018a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 3019a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 30207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3021a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 3022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30234a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 3025a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 3026a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3027a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3028a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3029a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 3030a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30312bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 30322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 30332bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 30342bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 30352bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 30362bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 30372bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 30382bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 30392bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 30402bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30412bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 30422bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 30432bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 30442bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30452bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 30462bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 30472bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30482bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 30492bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 30502bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30512bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30522bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 30532bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 30544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 30558813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 30568813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 30578813842121d46d1be476807c98b0ba0b771f0c91Christian König } 30582bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 3059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3061a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 306209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 3063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 306409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 306809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 307009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 307209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 307309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 307409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 307509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 307609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 307709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 307909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 308009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 308109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 308209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 308309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 308409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 308609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 308709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 308909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 3090a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 3091a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 3092a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 309709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 309809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 31007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 310109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 310209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 310309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 310409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 310509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 310609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 310709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 310809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 310909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 311009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 311109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 311209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 311309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 311409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 311509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 311609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 311709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 311909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 312009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 312109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 312209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 312309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 312409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31254a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 31264a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 312709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 312809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 312909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3130a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 313109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 313209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3133a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 313609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 313809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 313909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 314009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 314109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 314509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 314609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 314809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 314909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 31544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 315509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 315809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 315909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31614a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 316209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3166a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 31747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 317509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 317909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 318009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 318109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 318209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 318309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 318409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 318909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31904a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 319109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 319209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 319309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 319409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 319509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 319609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 319809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3201a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3208a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3209a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3210a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3211a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3212a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 32134a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3214a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3215a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3217a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3218a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3219a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3220a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3222a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3224a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3225a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3229a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3230a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3232a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3234a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 323509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 323909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 325009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 325209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 325709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 325809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 325909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 326009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 326109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 326209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 326309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 326409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 326509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 326609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 326709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 326809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 326909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 327009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 327109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 327209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 327309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 327409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 327509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 327609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 327709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 327809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 327909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 328009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 328309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 328909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 329209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 329509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32964a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 330109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3303a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3304a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3305a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3306cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 3307cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 3308cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3309cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 3310cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 3311cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3312cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3313cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 3314cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3315cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3316cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3317cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3318cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3319cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3320cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 3321cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 3322cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 3323cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3324cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT; 3325cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 3326cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3327cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3328cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3329cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3330cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3331cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3332cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3333cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3334cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3335cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3336cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3337cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3338cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3339cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3340cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3341cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3342cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3343cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3344cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3345cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT; 3346cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3347cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 3348cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 3349cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3350cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3351cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3352cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3353cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3354cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 3359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 3360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 336298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 33640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3365df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3366df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3367df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3368df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3369df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3370df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3371df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 337242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 337336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3377cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3378cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 337957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3380dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3382d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3383be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33963af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3397df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 33987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 33994558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3400a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 34010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3406e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 340788f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 34083af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 34093af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 34104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34160d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34180d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 341988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3420d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 34210d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3423b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 342413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3425b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34329f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34360d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 343787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 343892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3439c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 3440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3442cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3443ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 344409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3445a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3449a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3450a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 34590ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 3467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 34691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 347009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 347309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 347509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3492094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3522cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3523cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3524cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3525cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3526cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3527cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3528cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3529cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3530cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3531cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3532cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3533cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 3534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 353650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 353750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 353898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 353950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 354050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 354150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 35428ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 354350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3544112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 354550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 354650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 354750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 354850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 354950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 355050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 355150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 355250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 355350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 355450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 355550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 355650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 355750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 355950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 356250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 356550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3567df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 356850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 356950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 357050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 357150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 357250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 357350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 357550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 357750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 357850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 357950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 358050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 358150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 358750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 358950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 359050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 359150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 359250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 359350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 359413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 359550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 359650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 36037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 36077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 36087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3609c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 36107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 36137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 36147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 36157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 36167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 36207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 36217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3627cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_int_to_flt}, 3628cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 36297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 36307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3633cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3634cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 36357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3636cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 36377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 36391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 36407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 36417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 36447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 36637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 36647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3666cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 36677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3668cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3669cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3670cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 3671cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 36727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3673cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 36747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3675cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3676cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 36777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3678cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3679cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3680cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 36817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3682cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2}, 3683cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3684cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 36857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3686cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3687cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 36887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3692cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3693cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3694cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3695cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3696cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3697cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3698cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3699cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3700cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3701cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3702cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3703cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 37047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 37157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 37207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 37217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 37227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 37237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 37247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 37257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 37277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 37357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3737df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 37417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 37427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 37487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 37507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 37517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 37627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 376413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 37667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 376750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 376850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 376950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 377350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 377650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 377750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 377850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3779c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 378050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 378150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 378250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3783ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 378450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 378550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 378650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 378750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 378850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 378950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 379050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 379150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 379250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 379750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3798cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 37990ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 380050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 380250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 380550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 380750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 38091d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 381050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 381150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 381450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 381650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 383450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 383550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 384050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3862cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3863cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3864cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3865cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3866cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3867cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3868cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3869cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3870cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3871cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3872cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3873cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 387450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3876