r600_shader.c revision 4f7c21899ad449be2bc1157ce1d2d99296a34499
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 60a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 611235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 64843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano uint32_t *ptr; 65843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano int i; 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák shader->bo = (struct r600_resource*) 706101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4); 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 746101b6d442b06a347c001fe85848d636ab7df260Marek Olšák ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->buf, rctx->ctx.cs, PIPE_TRANSFER_WRITE); 75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet if (R600_BIG_ENDIAN) { 76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet for (i = 0; i < rshader->bc.ndw; ++i) { 77d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet ptr[i] = bswap_32(rshader->bc.bytecode[i]); 78d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } 79d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } else { 80d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr)); 81843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 826101b6d442b06a347c001fe85848d636ab7df260Marek Olšák rctx->ws->buffer_unmap(shader->bo->buf); 831235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 841235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 851235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 861235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 874f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 881235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 891235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 901235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 911235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 921235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 931235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 944f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (rctx->chip_class >= EVERGREEN) { 951235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 961235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 971235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse 106eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader); 1073b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet 108eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader) 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 110052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse 114c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* Would like some magic "get_bool_option_once" routine. 115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse */ 116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (dump_shaders == -1) 117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 118052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin tgsi_dump(shader->tokens, 0); 122052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 123eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin r = r600_shader_from_tgsi(rctx, shader); 1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_build(&shader->shader.bc); 1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 1344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_dump(&shader->shader.bc); 135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 136052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 137afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse 14069251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 141ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 1426101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL); 1434a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_clear(&shader->shader.bc); 144eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 145eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin memset(&shader->shader,0,sizeof(struct r600_shader)); 146ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 147ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 1512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 1522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 153a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 154a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 155a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 156a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 157a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 158a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 159a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 160a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 161a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 1632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 1642b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 1652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 1682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 1692b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 1704a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode *bc; 1712b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 17240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy struct r600_shader_src src[4]; 173cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 174cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 175e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 176fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 177fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 178fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 179fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 180fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 1882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1892b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 1907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 19142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 205c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 206a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 211a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 2138260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 2148260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 2158260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 22047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 22147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 228fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 22950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 23050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 2314a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 232fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 233fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 234fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 235fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 236fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 237fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 238fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 239fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 240fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 241fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 242fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 243fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 244fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 246fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 247fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 2517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 25550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 25650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 2574a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 25850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 25950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 26050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 26150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 26250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 26350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 26450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 26650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 26750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 26850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 26950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 272fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 273fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 274fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 2794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 2847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 2857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 28621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) 28721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{ 28821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie int i, r; 28921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie struct r600_bytecode_alu alu; 29021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 29121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie for (i = 0; i < 4; i++) { 29221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 29321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 29421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0; 29521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 29621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 29721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.write = 1; 29821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 29921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.dst.chan = i; 30021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.src[0].chan = i; 30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie 30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (i == 3) 30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie alu.last = 1; 30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie if (r) 30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return r; 30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } 31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie return 0; 31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie} 3127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3130a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/* 3140a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders 3150a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3160a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS: 3170a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position 3180a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector 3190a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors 3200a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3210a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL: 3220a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61 3230a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61 3240a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61 3250a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61 3260a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61 3270a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually 3280a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index) 3290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors 3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL: 3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets 3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector 3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled 3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL: 3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED 3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN 3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA 3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE 3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions 3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */ 3455b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3465b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3475b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ 3485b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io) 3495b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{ 3505b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin int index, name = io->name; 3515b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3525b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* These params are handled differently, they don't need 3535b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * semantic indices, so we'll use 0 for them. 3545b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin */ 3555b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_POSITION || 3565b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_PSIZE || 3575b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name == TGSI_SEMANTIC_FACE) 3585b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0; 3595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin else { 3605b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_GENERIC) { 3615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For generic params simply use sid from tgsi */ 3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = io->sid; 3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } else { 3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* FIXME: two-side rendering is broken in r600g, this will 3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * keep old functionality */ 3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (name == TGSI_SEMANTIC_BCOLOR) 3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin name = TGSI_SEMANTIC_COLOR; 3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* For non-generic params - pack name and sid into 8 bits */ 3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index = 0x80 | (name<<3) | (io->sid); 3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin /* Make sure that all really used indices have nonzero value, so 3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * we can just compare it to 0 later instead of comparing the name 3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin * with different values to detect special cases. */ 3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin index++; 3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin return index; 3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin}; 3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 38472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 38796bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 38872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 3945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); 39535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 3968a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 397024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; 39889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) { 39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 4005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (ctx->shader->input[i].spi_sid) { 40121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 40421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie } else { 40521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie evergreen_interp_flat(ctx, i); 406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 4145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); 415024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; 41635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 42033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 42147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 42396bbc627f369c0100b950f81531b1fe9ef586c34Christian König 424c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 425c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 4264a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 4274a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 42896bbc627f369c0100b950f81531b1fe9ef586c34Christian König 429c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 430c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 431c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 43296bbc627f369c0100b950f81531b1fe9ef586c34Christian König 43396bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 43496bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 43596bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 436c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 43796bbc627f369c0100b950f81531b1fe9ef586c34Christian König 4384a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 439c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 440c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 441c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } 44296bbc627f369c0100b950f81531b1fe9ef586c34Christian König 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 44872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 44972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 450be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 451be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 452be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 453be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 454be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 4557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 5021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 5031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 5041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 5051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 5061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 5071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 5081fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 5091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 5101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 5111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 5121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 51396bbc627f369c0100b950f81531b1fe9ef586c34Christian König 5141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 5151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 5161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 5171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 5181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 5191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 5201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 5214a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 5221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 5231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 5241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 5251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 5261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 5271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 52896bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 529c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* assume we wan't TGSI_SEMANTIC_INSTANCEID here */ 530c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[0] = 3; 531c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[1] = 3; 532c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[2] = 3; 533c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[3] = 3; 534c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->sel = 0; 535c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 5361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 5371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 5381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 5391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 5401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 5411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 5421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 543077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 544077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 5454a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_vtx vtx; 546077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 547077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 548077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 549077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 5504a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 551077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 552077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 553077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 554077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 5558e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 556077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 557077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 558077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 559077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 560077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 561077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 562077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 563077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5644a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 565077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 566077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 567077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 568077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 5698e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ar_reg = ctx->bc->ar_reg; 570077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 571077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 572077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 573077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 574077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 575077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 576077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 577077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 578077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 579077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 580077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 581077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 582077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 583077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 584077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 585d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 586077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5874a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx))) 588077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 589077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 590077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 591077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 592077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5964a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 5987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 6027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 6047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 606077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 607077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 608077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 609077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 610077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 611077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 612077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 613077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 614077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 615077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 616077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 617077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 618077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 6197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 6267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 6277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 6287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 6297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 6307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 6314a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 6327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 6337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 6347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 6367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 6377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 6387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 6417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 6427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 6447687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 6457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 6467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6474a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 6487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 6497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 6507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 6517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 6537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 6567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 6577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 6587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 6594a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 6607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 6627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 6637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 6647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 6657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 6667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 6694a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 6707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 680eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader) 68172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 682eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct r600_shader *shader = &pipeshader->shader; 683eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin struct tgsi_token *tokens = pipeshader->tokens; 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 6855555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 6874a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_output output[32]; 688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 690feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher int i, j, r = 0, pos0; 69172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 6944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_init(ctx.bc, rctx->chip_class); 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 700f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 702eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) || 703eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin ((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color)); 704eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 705feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher shader->nr_cbufs = rctx->nr_cbufs; 706feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 708076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 709076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 710076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 711f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 712f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 713f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 715076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 716076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 717076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 718076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 73389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class >= EVERGREEN) { 7344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 735f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 7364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 737f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 73989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) { 740fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 74184457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 7434d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_INPUT] + 1; 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 7454d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_OUTPUT] + 1; 746d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 74797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 74897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 74997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 750d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 7517728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 7528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 7534d23c6df81639057f12a604556121aa7b41d921cChristian König ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1; 7548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx.temp_reg = ctx.bc->ar_reg + 1; 755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 756cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 757cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 7585555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 764cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 765cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 766cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 767cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 768cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 769cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 770cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 771cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 772cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 773cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 784be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 785be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 786be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 7871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 7887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 7897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 7907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 7917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 7927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 79389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 7947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 79589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet else if (ctx.bc->chip_class >= EVERGREEN) 79650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 79750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 79850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 803876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 8045555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 8055555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 8065555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 8075555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 8085555cd776b970bce020be59193054474a2a63317Dave Airlie } 809876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 816eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 817457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 818eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 819eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* clamp color outputs */ 820eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->clamp_color) { 821eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (i = 0; i < noutput; i++) { 822eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (shader->output[i].name == TGSI_SEMANTIC_COLOR || 823eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin shader->output[i].name == TGSI_SEMANTIC_BCOLOR) { 824eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 825eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin int j; 826eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin for (j = 0; j < 4; j++) { 8274a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 8284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 829eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 830eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* MOV_SAT R, R */ 831eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 832eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.sel = shader->output[i].gpr; 833eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.chan = j; 834eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.write = 1; 835eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.dst.clamp = 1; 836eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].sel = alu.dst.sel; 837eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.src[0].chan = j; 838eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 839eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (j == 3) { 840eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin alu.last = 1; 841eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 8424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx.bc, &alu); 843eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin if (r) 844eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin return r; 845eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 846eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 847eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 848eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin } 849eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin 850eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin /* export output */ 851feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher j = 0; 852457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 8534a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 854feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 855feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 856feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 857feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 858feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 859feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 860feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 861feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 862feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 863feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = i - pos0; 864feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 865457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 868feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 60; 869feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 871457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 872457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 873457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 874feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 875feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 876457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 877457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 882feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid; 883feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 8844f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) { 885feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher for (j = 1; j < shader->nr_cbufs; j++) { 8864a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i + j], 0, sizeof(struct r600_bytecode_output)); 887feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].gpr = shader->output[i].gpr; 888feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].elem_size = 3; 889feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 0; 890feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 891feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = 2; 892feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_w = 3; 893feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].burst_count = 1; 894feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].barrier = 1; 895feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = shader->output[i].sid + j; 896feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 897feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 898feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 89960302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák j = shader->nr_cbufs-1; 900feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher } 9015f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 902feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 903feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 2; 904feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 7; 905feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 906feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 90739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 908feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].array_base = 61; 909feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_x = 7; 910feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_y = 1; 911feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].swizzle_z = output[i + j].swizzle_w = 7; 912feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 92372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 924457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 925feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher noutput += j; 926457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 927457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 928457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 929457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 930457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 931457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 932457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 933457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 934457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 9354a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[i], 0, sizeof(struct r600_bytecode_output)); 936457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 937457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 938a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_x = 7; 939a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_y = 7; 940a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_z = 7; 941a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin output[i].swizzle_w = 7; 9428ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 943457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 944457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 945457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 9467e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 947457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 949c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 950481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 951481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 9524a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&output[0], 0, sizeof(struct r600_bytecode_output)); 953481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 954481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 955481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 956481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 957481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 958481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 9598ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 960481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 961608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 962481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 963a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 964481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 965481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 966457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 967457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 96889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class < CAYMAN) { 9697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 9707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 9717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 972457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 973b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 974b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 975a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 976c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 977c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 978457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 979457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 9804a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_output(ctx.bc, &output[i]); 981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 9847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 98589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx.bc->chip_class == CAYMAN) 9864a47662beaa2092447939db7880531fb706afeddMarek Olšák cm_bytecode_add_cf_end(ctx.bc); 9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9883b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 992cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 999f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 1000f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 1001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 10094a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src, 1010a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 1011a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 1012a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 1013a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 1014a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 1015a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 1016a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 1017a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 1018a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 1019a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 1020a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 10214a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src) 1022f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{ 1023f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->abs = 1; 1024f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin bc_src->neg = 0; 1025f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin} 1026f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin 10274a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src) 10283efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{ 10293efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin bc_src->neg = !bc_src->neg; 10303efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin} 10313efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin 103280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 103380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 103480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 10354a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu_dst *r600_dst) 1036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 10377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 1039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 1040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 104347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 104447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 10457a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 10467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 10477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1050dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 1051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1052dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 1053d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 1055dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 1056d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 1057d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1058d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 1059dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 1060dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 1061dffad730df17983cfaef0808555a8c26cad0aa15Christian König 10629b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only) 1063dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 1064dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1066dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 1067dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1069d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 1070d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1071d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 1072d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 10734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 107480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1076d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1077d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 10794a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1081d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 10824a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 10834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 1086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 10884a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 10907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 10914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 10927a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 1095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 10969b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie if (i == lasti || trans_only) { 1097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 10994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1106d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 1107d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 11089b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 0); 1109d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1110d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1111d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 1112d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 11139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 1, 0); 11149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie} 11159b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie 11169b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx) 11179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{ 11189b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie return tgsi_op2_s(ctx, 0, 1); 1119d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 1120d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 1121cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx) 1122cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 1123cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1124cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 1125cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, r; 1126cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1127cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1128cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 1129cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1130cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1131cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 1132cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1133cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 1134cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1135cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 1136cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1137cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 1138cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1139cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1140cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1141cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 1142cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 1143cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1144cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 1145cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 1146cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 1147cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 1148cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 1149cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 1150cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 1151cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 11527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 11537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 11547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 11564a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 11587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 11604a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 11617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 11627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 11634a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], 0); 11647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 11677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 11704a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 11757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 11767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 11821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 118388f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 118496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 118596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 118696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 118796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 118896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 11894a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 11907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 11914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1192a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 119388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 119488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 119788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 119888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 11994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 12007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1201921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 120288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1203a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 120496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1205ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 120688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 120888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 121088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12114a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1212a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 12137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 121488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 121588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 121688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 121788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 121888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 121988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 122088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 122288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 122388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 122488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12254a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1226a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 122788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 122888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 122988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 123088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 123188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 123288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 123388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 123488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 12357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1236921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 123788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1238921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1239ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 124096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 124189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == R600) { 1242a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1243a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 124496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 124596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 124696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 124796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 124896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 124996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 125088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 12514a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 125288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 125388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 125492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 125592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 125692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12604a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 12617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 12627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 12637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 12657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 12704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 12717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 12727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 12737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 12767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 12777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 12787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 12797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 12807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 12827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 12867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 12877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 128892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 128992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 129092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12914a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 129292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1293dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 129492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 12951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 129692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 129792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 129888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 12994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 130088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 130188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 130288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 130388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 130488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 130588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 130688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 130788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 13084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 130988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 131088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 131188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 131288f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1313be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1314be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1315be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1316be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 13174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1318a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1319be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1320be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 132180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1322be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 132388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 13244a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 132588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 132688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 132788f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 132888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 132988f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 133088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 133192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 133292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 133392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13344a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 13357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 133692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 133757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 133857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 133957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 134057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 13411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 134257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 134357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 134457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 134592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 134692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 134757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 134889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 13504a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13674a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 137092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 137857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 137992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 138092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 138157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 138289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 13837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 13844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 13907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 13947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 13967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 14004a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 140357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 14047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 14057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 14067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 14074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 14087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 14097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 14107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 141157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 141292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1413ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1414ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 14154a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1416ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1417ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1418ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 141980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1420ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1421ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1422ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1423ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1424ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1425ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 14264a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1427ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1428ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1429ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1430ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1431ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1432ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 14334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1434ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1435ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1436ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 143780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1438ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1439ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1440ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1441ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1442ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1443ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 14444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1445ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1446ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1447ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1448ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 144992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 145092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 145192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1452094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1453094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 14544a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1455094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1456094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1457094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 14584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1459094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 14604502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1461094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 14624502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1463921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 14644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 14664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 14674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 14684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 14694a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 14704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1471094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1472094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1473094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14744a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1475094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1476094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1477094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 14784502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 14794502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 14804502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 14814502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1482094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1483094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1484094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 14850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 14860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 14870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14884a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 14900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1491f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.x = max(src.y, 0.0) */ 14924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1493f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 14944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 1); 1495f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1496f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[1].chan = 1; 1497f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1498f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1499f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = 0; 1500f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.write = 1; 1501f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 1502f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.last = 1; 15034a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1504f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin if (r) 1505f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin return r; 1506f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin 15070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 15080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 15096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 15106a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 15126a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 151389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 1515f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 15164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1518f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1519f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 1520f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.sel = ctx->temp_reg; 1521f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.dst.chan = i; 15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 1533f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin /* tmp.z = log(tmp.x) */ 15344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1536f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].sel = ctx->temp_reg; 1537f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin alu.src[0].chan = 0; 15382fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 15392fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 15402fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15424a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 15476a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 15486a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 15490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 155086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin /* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */ 15514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1552a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 155386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].sel = sel; 155486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin alu.src[0].chan = chan; 15554a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], 3); 15564a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], 0); 15570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 15580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 15590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 15600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 15610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 15624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 15640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 15650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 156689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 15677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 15687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15694a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 15757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 15794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 15847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 15854a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 15897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 15907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1596abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 15978567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin /* dst.x, <- 1.0 */ 15984a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 15998567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 16008567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 16018567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.src[0].chan = 0; 16028567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 16038567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 16044a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16058567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin if (r) 16068567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin return r; 16078567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin 1608abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 16094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1610abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 16114a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1612abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1613abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1614abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1615abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 16164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1617abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1618abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1619abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1620abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 16214a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1622abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1623abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1624abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1625abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1626abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1627abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 16284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1629abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1630abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1631abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 16320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 16330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 16340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 163542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 163642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 163742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16384a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 163942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 164042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 16414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1642df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1643df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1644df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1645df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1646df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1647df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1648df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 164942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 16514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[i]); 165242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 165342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 165442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 165542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 16564a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 165742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 165842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 165942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 166042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 166142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 166242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1663a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 16647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 16657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16664a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1667a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 16687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 16697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 16704a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 16717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1672a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 16737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 167480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 16767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 16777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 16784a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 16797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 16807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 16817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 16827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 16837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 16847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1685a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1686a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1687a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 16884a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1689a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1690a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 16914a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1692a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1693a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[i], &ctx->src[i], 0); 1695a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1696a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1697a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1698a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 16994a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1700a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1701a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1702a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1703a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1704a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1705a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 17077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 17087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 17104a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 17117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 17127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 17144a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 17164a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 17177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 17187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 17197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 17207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 17217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17224a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 17267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 17284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 17304a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 17317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 17327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 17337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 17347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17354a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 17407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 17414a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 17427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 17437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 17447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 17457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 17467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 17477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 17487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 17494a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 17507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 17517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 17527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 17537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 17547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 17557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1756a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1757a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 17584a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1759a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1760a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1761a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 17624a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1763a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 17644a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 1765a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1766a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1767a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17684a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1769a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1770a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1771a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 17724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 177366f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 17744a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], 0); 1775a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1776a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1777a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1778a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17794a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1780a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1781a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1782a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 17834a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1784a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1785a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1786a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1787a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1788a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 17894a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1790a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1791a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1792a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1793a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1794a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 17950d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 17960d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 17970d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17984a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1799921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 18000d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18010d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 18020d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 18034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 18050d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1806cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 18070d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1808cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 18090d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18104a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 1811921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 18124a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[0], i); 18130d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18140d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 18150d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 18164a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18170d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 18180d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 18190d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 18200d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18210d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 18220d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 18234a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1824a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 18250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 182680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 18270d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18280d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1829cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 18300d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 18310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1832921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 18330d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 18340d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18350d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1836cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 18370d48925a56ad4fb253386110b545abda82a25464Dave Airlie 18380d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 18390d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 18404a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 18410d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 18420d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 18430d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 18440d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 18450d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 18460d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 18494a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1850cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 18534a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1854cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1855a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 18566c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1857cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1858a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 185980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1860cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1861cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1862cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1864cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1865cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 18664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1867cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1868cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1869cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1870cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1871cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1872cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 18764a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1878dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 18807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 18817be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 18827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 18837be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 18844a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 18874a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 189080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1892cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 18947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 18974a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1902cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1903cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1904cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1905cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1906cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19074a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1908cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1909cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 19114a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 1912cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1913cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 19144a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 1915cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1916a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 191780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1919a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1920cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1924921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1927cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1928cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1929cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1930921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1934e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1935e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1936e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1937e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1938e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1939e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1940e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19474a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 1948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 19517be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 19546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 19556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 19566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 19596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 19606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 19616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 19636415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 19646415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 19656415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 19666415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19676415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 19686415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 19696415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 197033241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 197133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 197296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 197333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19744a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_tex tex; 19754a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 1976641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 197740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1979da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 1980da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 19816415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 198278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 198313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 19841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie u8 offset_x = 0, offset_y = 0, offset_z = 0; 1985641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19866415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 1987641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 19881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 19891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie /* get offset values */ 19901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie if (inst->Texture.NumOffsets) { 19911d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie assert(inst->Texture.NumOffsets == 1); 19921d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie 19931d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1; 19941d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1; 19951d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1; 19961d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } 19971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 199813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 199913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 200013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 200140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 200240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 20034a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 200440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 200540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 200640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 200740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 200840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 200940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 201040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 201140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 201240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 201340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 201440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 201540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 201640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 20174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 201840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 20194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[i], j); 202040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 202140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 202240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 202340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 202440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 20254a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 202640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 202740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 202840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 202913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 203040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 203140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 203240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 203340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 203440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 203540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 203640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 203740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 203840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 203940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 204040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 204140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 204240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 204340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 204440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 204540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 20464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 204740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 204840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 204913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 205013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 2052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 205389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 20557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 20564a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20584a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 2059bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 20607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 20637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 20657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20664a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 20727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 20734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 20747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 20754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 3); 20767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 20777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 20787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 20807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 20814a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 20859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 2086b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 20874a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2088a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2089b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 20914a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 2092b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2093b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2094b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 20954a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2096b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2097b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2098b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 20994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2100a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2101921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2102b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 2103b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2104b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 2105b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2106b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 21074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2108b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2109b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 211078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2111b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2112bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2113bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2114bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 21150e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 21160e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 2117bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2118bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 2119bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 21204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2121a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 21224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 21234a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 2124bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2125bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 2126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 2127bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 2128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 21294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2131bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2133bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2134bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 213589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 21374a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21484a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 21534a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 21577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 21597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 21617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 21624a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 21637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 21647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 21657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 21667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2167bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 2168bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 21697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 2170bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 21714a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2172a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2173bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2174bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2175bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2176bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 2177bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2178bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 21797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2180bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2181bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2182a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2184bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2185bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 2186bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2187bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21884a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2189bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2190bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2191bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 21924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2193a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2194bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 2195bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2196bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 2197bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 2198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 2199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 22007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2201bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 2202bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 2203a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 2204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 2206bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 2207bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 2208bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2209bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 22104a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2211bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2212bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2213bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 221478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2215bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2216bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2217bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 221878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2219b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 22204a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2221a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 22224a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 2223b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2224b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2225b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2226b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2227b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 22284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2229b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2230b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2231b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 223278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2233b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2234b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 22357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2236bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2237929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2238929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 22396b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2240929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || 2241929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) { 2242de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2243de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2244de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2245de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2246de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2247de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2248de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2249c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák case SQ_TEX_INST_SAMPLE_LB: 2250c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák opcode = SQ_TEX_INST_SAMPLE_C_LB; 2251c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák break; 2252de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2253de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2254de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2255de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2256de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 225733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 22584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&tex, 0, sizeof(struct r600_bytecode_tex)); 2259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 22606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 22616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2262077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2263641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 22646c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 22659d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 22669d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 22679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 22689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 226978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 227078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 227178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 227278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 227378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 227478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 227578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 227678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 227778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 227878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2279244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 228078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 22819a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2285bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2286bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22896b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 22906b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) { 229101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 229201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 229301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 22946b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_z = 1; 22956b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák tex.coord_type_w = 1; 2296bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 22971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_x = offset_x; 22981d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_y = offset_y; 22991d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie tex.offset_z = offset_z; 230069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2301929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* Put the depth for comparison in W. 2302929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W. 2303929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák * Some instructions expect the depth in Z. */ 2304929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || 2305929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D || 23066b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT || 2307929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) && 2308929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_L && 2309929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode != SQ_TEX_INST_SAMPLE_C_LB) { 231078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2311929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2312929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák 2313929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2314929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { 2315929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák if (opcode == SQ_TEX_INST_SAMPLE_C_L || 2316929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák opcode == SQ_TEX_INST_SAMPLE_C_LB) { 2317929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Y */ 2318929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_y = 0; 2319929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else { 2320929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2321929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2322929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.src_sel_z = tex.src_sel_y; 2323929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } 2324929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2325929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2326929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák /* the array index is read from Z */ 2327929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák tex.coord_type_z = 0; 2328bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 23294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_tex(ctx->bc, &tex); 2330bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2331bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2332bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2333bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2334bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 233533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 233633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2337b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2338b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2339b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 23404a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2341dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2342b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2343b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2344b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2345c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 23461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2347c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2348c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2349c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2350c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 23514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2352c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 23534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[1], i); 23544a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2355c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 235680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2357c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2358c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2359c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2360c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 23614a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2362c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2363c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2364c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2365c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2366c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2367c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2368b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2369dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2370dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2371dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2372dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23734a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2374a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2375921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2376b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 23774a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[0], i); 23784a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_toggle_neg(&alu.src[1]); 2379b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2380b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2381dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2382b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2383b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2384b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 23854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2387b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2388b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2389b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2390b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2391dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2392dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2393dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2394dffad730df17983cfaef0808555a8c26cad0aa15Christian König 23954a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2396a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 23994a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 2400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2401b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2402dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 24064a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2411b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2412dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2413dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2414dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2415dffad730df17983cfaef0808555a8c26cad0aa15Christian König 24164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 24194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 24204a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 2421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2423dffad730df17983cfaef0808555a8c26cad0aa15Christian König 242480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2426dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 24294a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2431b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2432b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2433dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2434b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 243687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 243787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 243887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24394a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 244087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2441dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 244287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 24447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 24457be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 244687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24474a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2448a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 24494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 24504a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 24514a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[2], &ctx->src[1], i); 245280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 245387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 245487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 245587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 24567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 245787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 24584a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 245987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 246087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 24617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 246287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 246387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 246487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 24650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 24660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 24670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 24680e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 24690e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 24704a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 24710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 24720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 24730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 24750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 24760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 24784a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2479a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 24800e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 24814a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 24824a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 24830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 24840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 24850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 24860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 24870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 24880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 24890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 24910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 24920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 24930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 24940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 24950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 24964a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 24970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 24980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 24990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 25024a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 25040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25050e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 25064a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 25074a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 25080e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 25090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 25100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 25110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 25120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 25130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 25160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 25170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 25180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 25190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 25200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 252180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 252280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 25230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 25240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 25250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 25260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 25270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 25284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 25300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 25310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 25320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 25330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 25340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 25350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 25360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 253736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 253836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 253936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 25404a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 254336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 254436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 254536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 25464a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 254736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2548a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 25494a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 255036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 255136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 255236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 255336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 255436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 25554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 255636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 255736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 255836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 255989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 25607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 256436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 25657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 25707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25714a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 25797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25844a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 258836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 25897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 259036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 259136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 25924a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 259336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2594a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 25954a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 259636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 259736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2598b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2599b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2600b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2601b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2602b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 260336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 260436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 260536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 260636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 260736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26084a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 260936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 261036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 261136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 261236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 261336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 261436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 261589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26174a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 26194a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 262036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 26247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 262736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26284a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26334a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 26354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 263636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 26407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 264736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 264836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 264936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 265036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 26514a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 265236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2653a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 265436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 265536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 265636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 265736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 265836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 265936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 266036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 26614a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 266236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 266336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 266436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 266536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 266636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 266787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2669460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 26714a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 2672460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2674460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2675f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.x = floor(log2(|src|)); */ 2676460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 267789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 26787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26794a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2680460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26824a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 26834a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 26847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 26887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26914a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 26927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2695460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26974a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 26987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27004a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27014a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 27057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27074a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2712460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2713460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2715460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2716460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2717460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2718460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2719460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2720460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 27214a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2723460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2724460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2725460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2726f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */ 2727460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2728460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 272989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27314a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 273296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27344a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27354a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 273696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27444a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27494a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 27524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 27534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 27577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27604a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 276496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27654a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 276696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 276796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 276896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 276996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 277096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 277196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 277296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 277396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 277496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 277596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27764a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 277796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 277896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 277996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 278089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 27817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 27824a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 27837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 27857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 27867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 27877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 27887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 27907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 27917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 27927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 279396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 27944a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 27977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 27987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 27994a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 28017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 280396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 28067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 280896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28094a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 281396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 281489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28164a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 28207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 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 alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 28357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 28367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 283796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 28407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 284296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28434a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 284796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28484a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 284996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 285096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 285196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 28524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28534a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 285496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 285596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 285696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2857460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2858460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2859460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 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 2868f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin /* result.z = log2(|src|);*/ 2869460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 287089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (ctx->bc->chip_class == CAYMAN) { 28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 28724a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2873460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28754a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28764a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 2877460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 2884460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 28854a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 28887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 28897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 28904a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 28917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 28934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 28944a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src_set_abs(&alu.src[0]); 28957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 28967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 28977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 28997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 29007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 29014a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 29027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 29047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2905460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2906460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2907460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2908460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 29094a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 2910460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2911460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2912460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2913460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2914460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2915460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2916460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2917460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2918460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2919460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 29204a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 2921460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2922460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2923460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2924460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2925460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2926460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2927460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 292898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 292998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 293098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29314a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 293298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 2933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 29344a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 293598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 293652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 293752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 293852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 293952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 294052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 294152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 294252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 29439b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 29448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 29459b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 294652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 294752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 294852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 294952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 295052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 29518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 295298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 29538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 29548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 29554a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 295698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 295798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 29588e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 29598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 296098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 296198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 296298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 296347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 296447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 29654a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 296647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 2967a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 29687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 29697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 2970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 29724a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 2974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2976077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29774a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 2979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2981077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 29828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.src[0].sel = ctx->bc->ar_reg; 29838e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 2984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29874a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 29897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 29907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 2991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2992077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 29934a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 29948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 2995077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 29984a47662beaa2092447939db7880531fb706afeddMarek Olšák if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 2999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 30007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 30019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie case TGSI_OPCODE_UARL: 30028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin memset(&alu, 0, sizeof(alu)); 30038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 30048e366dc365d01213b71b87ace47d30938db74845Vadim Girlin r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 30058e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.sel = ctx->bc->ar_reg; 30068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.dst.write = 1; 30078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin alu.last = 1; 30088e366dc365d01213b71b87ace47d30938db74845Vadim Girlin 30098e366dc365d01213b71b87ace47d30938db74845Vadim Girlin if ((r = r600_bytecode_add_alu(ctx->bc, &alu))) 30108e366dc365d01213b71b87ace47d30938db74845Vadim Girlin return r; 30119b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie break; 30127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 30137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 30147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 30157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 30167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30178e366dc365d01213b71b87ace47d30938db74845Vadim Girlin ctx->bc->ar_loaded = 0; 301847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 301947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 302047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 302157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 302257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 302357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 30244a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 302557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 302657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 302757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 30284a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 302957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3030a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 303180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 30327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 30337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 303457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 303557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 30364a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], i); 303757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 303857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3039a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 304057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 304157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 30424a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[1], &ctx->src[1], i); 304357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 304457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 304557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 30464a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu(ctx->bc, &alu); 304757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 304857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 304957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 305057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 305157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 305257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 3053a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 3054a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30554a47662beaa2092447939db7880531fb706afeddMarek Olšák struct r600_bytecode_alu alu; 3056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 3057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30584a47662beaa2092447939db7880531fb706afeddMarek Olšák memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 3060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 3061a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3062a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 3063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 3064a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 3065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30664a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_src(&alu.src[0], &ctx->src[0], 0); 3067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 3068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 30697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 3071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 30724a47662beaa2092447939db7880531fb706afeddMarek Olšák r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 3073a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 3074a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 3075a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3076a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3077a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 3079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 30802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin unsigned force_pop = ctx->bc->force_add_cf; 30812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 30822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (!force_pop) { 30832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin int alu_pop = 3; 30842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (ctx->bc->cf_last) { 30854f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)) 30862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 0; 30874f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER)) 30882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop = 1; 30892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 30902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin alu_pop += pops; 30912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (alu_pop == 1) { 30924f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER); 30932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else if (alu_pop == 2) { 30954f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER); 30962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin ctx->bc->force_add_cf = 1; 30972bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } else { 30982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin force_pop = 1; 30992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 31002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin } 31012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 31022bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin if (force_pop) { 31034a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 31048813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 31058813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 31068813842121d46d1be476807c98b0ba0b771f0c91Christian König } 31072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin 3108a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3109a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3110a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 311109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 3112a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 311309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 311409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 311509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 311609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 311709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 311909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 312009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 312109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 312209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 312309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 312409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 312509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 312609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 312809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 312909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 313009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 313109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 313209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 313309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 313609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 313809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 3139a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 3140a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 3141a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 314509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 314609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 314809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 31497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 315409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 315509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 315809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 315909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 316109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 316209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 316609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 31744a47662beaa2092447939db7880531fb706afeddMarek Olšák sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid, 31754a47662beaa2092447939db7880531fb706afeddMarek Olšák sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1)); 317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 318009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 318109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3182a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 318309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 318409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 318909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 319009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 319109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 319209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 319309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 319409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 319509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 319609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 319809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32034f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN)); 320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32104f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 321309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 3215a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 321809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 321909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 322509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 322609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 322709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 322809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 323009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 323209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 323509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32394a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 324309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 324609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32508b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); 325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 32524a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 325609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3257a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3258a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3259a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3260a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3261a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 32624a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3263a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3264a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 326509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3266a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3267a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3269a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3270a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3272a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3273a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3274a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3275a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3276a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3277a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3278a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3279a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3280a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3281a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3283a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 328509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 328909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 32924a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3295a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 329609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 330109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 330309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33054a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 330909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 332509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 333209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 333309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 333409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 333609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 333809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 334209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 334309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 334409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 33454a47662beaa2092447939db7880531fb706afeddMarek Olšák r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 334609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 334709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 334809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 334909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 335009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3353a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx) 3356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{ 3357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 3358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie struct r600_bytecode_alu alu; 3359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int i, j, r; 3360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 3361cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3362cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie /* src0 * src1 */ 3363cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3364cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3365cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3366cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3367cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.chan = i; 3370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.sel = ctx->temp_reg; 3371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.dst.write = 1; 3372cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3373c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT); 3374cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (j = 0; j < 2; j++) { 3375cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[j], &ctx->src[j], i); 3376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3377cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 33789b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie alu.last = 1; 3379cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3380cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3381cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3382cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3383cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3384cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3385cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie for (i = 0; i < lasti + 1; i++) { 3386cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 3387cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie continue; 3388cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3389cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie memset(&alu, 0, sizeof(struct r600_bytecode_alu)); 3390cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 3391cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3392c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 3393cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3394cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].sel = ctx->temp_reg; 3395cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.src[0].chan = i; 3396cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3397cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r600_bytecode_src(&alu.src[1], &ctx->src[2], i); 3398cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (i == lasti) { 3399cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie alu.last = 1; 3400cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3401cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie r = r600_bytecode_add_alu(ctx->bc, &alu); 3402cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie if (r) 3403cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return r; 3404cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie } 3405cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie return 0; 3406cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie} 3407cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie 3408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 340998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 34110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3412df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3413df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3414df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3415df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3416df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3417df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3418df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 341942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 342036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3424cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3425cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 342657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3427dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3429d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3430be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3433b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34433af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3444df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 34457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 34464558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 34480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3453e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 345488f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 34553af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 34563af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 34574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34630d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34650d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 346688f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3467d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 34680d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3470b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 347113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3472b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34799f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34830d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 348487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 348592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3486c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 3487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3489cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3490ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 349109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3492a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3496a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3504c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3505cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 35060ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3510c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3511c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 3512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3513cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 35161d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 351709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3539094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3543c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 3544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3545c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3546c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3547c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2}, 3548c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 3549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3550c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2}, 3551c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2}, 3552c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3553c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 3554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3555c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3556c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3557c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 3558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3559c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2}, 3560c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3561c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 3562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3563c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3564c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap}, 3565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3569cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3570cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3571cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3572cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3573cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3574cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3575cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3576cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3577cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3578cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3579cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3580cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 35819b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl}, 35829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 3583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 358550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 358650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 358798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 358850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 358950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 359050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 35918ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 359250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3593112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 359450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 359550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 359650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 359750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 359850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 359950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 360050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 360150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 360250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 360350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 360450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 360550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 360650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 360850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 360950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 361150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 361450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 361550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3616df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 361750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 361850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 361950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 362050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 362150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 362250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 362350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 362450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 362550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 362650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 362750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 362850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 362950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 363050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 363650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 363750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 363850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 363950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 364050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 364150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 364250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 364313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 364450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 364550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 36567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3658c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 36597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 36627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 36637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 36647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 36657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 36697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 36707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3676608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans}, 3677cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 36787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 36797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3682cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2}, 3683cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2}, 36847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3685cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 36867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 36881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 36957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 36997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3715cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2}, 37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3717cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3718cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 3719cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg}, 3720cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2}, 37217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3722cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 37237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3724cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2}, 3725cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2}, 37267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3727cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad}, 3728cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2}, 3729cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2}, 37307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans}, 3732cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2}, 3733cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2}, 37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3735cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap}, 3736cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2}, 37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3741cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3742cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3743cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3744cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3745cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3746cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3747cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3748cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3749cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3750cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3751cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3752cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 37539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl}, 37549b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 37627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 37667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 37717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3788df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2}, 37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 38007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 38087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 38107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 38117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 38137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 381513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 38177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3830c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex}, 383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3834ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 383550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 383750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 383850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 383950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 384150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 384250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 384350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 384850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2}, 38500ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 385150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 385350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 385650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2}, 385850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 38591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXF, 0, SQ_TEX_INST_LD, tgsi_tex}, 38601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie {TGSI_OPCODE_TXQ, 0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex}, 386150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 386250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 386550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 386750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 386850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 386950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 387550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 387950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 388450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 388550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 388650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 388850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3889cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2}, 3890cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2}, 389150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 389950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 390950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 391250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3913cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported}, 3914cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported}, 3915cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported}, 3916cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported}, 3917cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported}, 3918cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported}, 3919cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported}, 3920cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported}, 3921cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported}, 3922cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported}, 3923cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported}, 3924cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported}, 39259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UARL, 0, 0, tgsi_unsupported}, 39269b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie {TGSI_OPCODE_UCMP, 0, 0, tgsi_unsupported}, 392750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 392850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3929