r600_shader.c revision abe74a9820bc5b512ab24518622368db20187637
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h" 24f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák#include "tgsi/tgsi_info.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 28de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 299c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 32077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h" 33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h> 38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano 397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes 407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here. 417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots. 437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT 447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four 457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is 467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels. 477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT 487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and 497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots. 507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64 517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64 527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64 537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS 547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the 557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be 567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well. 577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x 587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/ 597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 61dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs, 621235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *ps, int id) 631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 641235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader_io *input = &ps->input[id]; 651235becaa1cf7e29f580900592563c3329d326deJerome Glisse 661235becaa1cf7e29f580900592563c3329d326deJerome Glisse for (int i = 0; i < vs->noutput; i++) { 671235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (input->name == vs->output[i].name && 681235becaa1cf7e29f580900592563c3329d326deJerome Glisse input->sid == vs->output[i].sid) { 691235becaa1cf7e29f580900592563c3329d326deJerome Glisse return i - 1; 701235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 711235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 721235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 731235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 741235becaa1cf7e29f580900592563c3329d326deJerome Glisse 75a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) 761235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 771235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 781235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_shader *rshader = &shader->shader; 79843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano uint32_t *ptr; 80843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano int i; 811235becaa1cf7e29f580900592563c3329d326deJerome Glisse 821235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* copy new shader */ 831235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 842f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich /* use PIPE_BIND_VERTEX_BUFFER so we use the cache buffer manager */ 852f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_IMMUTABLE); 861235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (shader->bo == NULL) { 871235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -ENOMEM; 881235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 89843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, 0, NULL); 90d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet if (R600_BIG_ENDIAN) { 91d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet for (i = 0; i < rshader->bc.ndw; ++i) { 92d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet ptr[i] = bswap_32(rshader->bc.bytecode[i]); 93d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } 94d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet } else { 95d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr)); 96843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 97294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse r600_bo_unmap(rctx->radeon, shader->bo); 981235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 991235becaa1cf7e29f580900592563c3329d326deJerome Glisse /* build state */ 1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse switch (rshader->processor_type) { 1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_VERTEX: 1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_vs(ctx, shader); 1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_vs(ctx, shader); 1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse case TGSI_PROCESSOR_FRAGMENT: 1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (rshader->family >= CHIP_CEDAR) { 1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse evergreen_pipe_shader_ps(ctx, shader); 1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse } else { 1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse r600_pipe_shader_ps(ctx, shader); 1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse break; 1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse default: 1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse return -EINVAL; 1171235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse return 0; 1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse 1213b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 1223b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet 123dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens) 1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse{ 125052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König static int dump_shaders = -1; 1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse int r; 1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse 129c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* Would like some magic "get_bool_option_once" routine. 130c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse */ 131c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (dump_shaders == -1) 132c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE); 133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König 134052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "--------------------------------------------------------------\n"); 136052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König tgsi_dump(tokens, 0); 137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse shader->shader.family = r600_get_family(rctx->radeon); 1393b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet r = r600_shader_from_tgsi(tokens, &shader->shader); 1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("translation from TGSI failed !\n"); 1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse r = r600_bc_build(&shader->shader.bc); 1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse if (r) { 1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse R600_ERR("building bytecode failed !\n"); 1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse return r; 1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse } 149052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König if (dump_shaders) { 150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König r600_bc_dump(&shader->shader.bc); 151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König fprintf(stderr, "______________________________________________________________\n"); 152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König } 153afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse return r600_pipe_shader(ctx, shader); 1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse} 1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse 15669251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader) 157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{ 158ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; 159ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck r600_bo_reference(rctx->radeon, &shader->bo, NULL); 161f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck r600_bc_clear(&shader->shader.bc); 162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck} 163ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck 1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse/* 1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader 1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse */ 1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 1682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src { 170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned sel; 171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned swizzle[4]; 172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned neg; 173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned abs; 174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned rel; 175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet uint32_t value[4]; 176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}; 177a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 185077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned ar_reg; 1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 1882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 18940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy struct r600_shader_src src[4]; 190cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 191cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 192e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* needed for evergreen interpolation */ 194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_centroid; 195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_linear; 196fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie boolean input_perspective; 197fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_interp_gpr; 1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 2077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[]; 20842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 222c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell if (i->Src[j].Register.Dimension) { 2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell R600_ERR("unsupported src %d (dimension %d)\n", j, 2328260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell i->Src[j].Register.Dimension); 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input) 24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 24750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 24850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int gpr = 0, base_chan = 0; 250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int ij_index = 0; 251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) { 253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) { 257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index = 0; 258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective add one */ 259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) { 260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* if we have perspective centroid */ 262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[input].centroid) 266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ij_index++; 267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 2687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* work out gpr and base_chan from index */ 270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie gpr = ij_index / 2; 271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie base_chan = (2 * (ij_index % 2)) + 1; 27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 282fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.dst.sel = ctx->shader->input[input].gpr; 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].sel = gpr; 289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[0].chan = (base_chan - (i % 2)); 290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos; 29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse} 3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 3037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 30572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 30896bbc627f369c0100b950f81531b1fe9ef586c34Christian König int r; 30972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 31535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 3168a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie ctx->shader->input[i].centroid = d->Declaration.Centroid; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 3187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev >= CHIPREV_EVERGREEN) { 31950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 320fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) { 321fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->shader->input[i].interpolate > 0) { 322fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->shader->input[i].lds_pos = ctx->shader->nlds++; 323fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie evergreen_interp_alu(ctx, i); 324fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 325fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 32650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 33335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 33733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 33847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 34096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 341c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse case TGSI_FILE_SYSTEM_VALUE: 342c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 343c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse struct r600_bc_alu alu; 344c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 34596bbc627f369c0100b950f81531b1fe9ef586c34Christian König 346c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT); 347c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].sel = 0; 348c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.src[0].chan = 3; 34996bbc627f369c0100b950f81531b1fe9ef586c34Christian König 35096bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.sel = 0; 35196bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.chan = 3; 35296bbc627f369c0100b950f81531b1fe9ef586c34Christian König alu.dst.write = 1; 353c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse alu.last = 1; 35496bbc627f369c0100b950f81531b1fe9ef586c34Christian König 355c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse if ((r = r600_bc_add_alu(ctx->bc, &alu))) 356c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse return r; 357c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse break; 358c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } 35996bbc627f369c0100b950f81531b1fe9ef586c34Christian König 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 36572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 36672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 367be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 368be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 369be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 370be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 371be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 3727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to 374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation. 375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * 376fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit 377fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs 378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required 379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/ 380fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx) 381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{ 382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int i; 383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie int num_baryc; 384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = FALSE; 386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = FALSE; 387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = FALSE; 388fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr = 1; 389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* any centroid inputs */ 391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie for (i = 0; i < ctx->info.num_inputs; i++) { 392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* skip position/face */ 393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION || 394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) 395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie continue; 396fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) 397fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_linear = TRUE; 398fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE) 399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_perspective = TRUE; 400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->info.input_centroid[i]) 401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->input_centroid = TRUE; 402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie } 403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 404fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc = 0; 405fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* ignoring sample for now */ 406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_perspective) 407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_linear) 409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc++; 410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie if (ctx->input_centroid) 411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie num_baryc *= 2; 412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx->num_interp_gpr += (num_baryc + 1) >> 1; 414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie /* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */ 416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie return ctx->num_interp_gpr; 417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie} 418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie 4191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx, 4201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet const struct tgsi_full_src_register *tgsi_src, 4211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet struct r600_shader_src *r600_src) 4221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{ 4231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memset(r600_src, 0, sizeof(*r600_src)); 4241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[0] = tgsi_src->Register.SwizzleX; 4251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[1] = tgsi_src->Register.SwizzleY; 4261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ; 4271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->swizzle[3] = tgsi_src->Register.SwizzleW; 4281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->neg = tgsi_src->Register.Negate; 4291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->abs = tgsi_src->Register.Absolute; 43096bbc627f369c0100b950f81531b1fe9ef586c34Christian König 4311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 4321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet int index; 4331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) && 4341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) && 4351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet (tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) { 4361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 4371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX; 4381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg); 4391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (r600_src->sel != V_SQ_ALU_SRC_LITERAL) 4401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet return; 4411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet index = tgsi_src->Register.Index; 4431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = V_SQ_ALU_SRC_LITERAL; 4441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value)); 44596bbc627f369c0100b950f81531b1fe9ef586c34Christian König } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 446c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse /* assume we wan't TGSI_SEMANTIC_INSTANCEID here */ 447c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[0] = 3; 448c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[1] = 3; 449c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[2] = 3; 450c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->swizzle[3] = 3; 451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse r600_src->sel = 0; 452c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse } else { 4531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (tgsi_src->Register.Indirect) 4541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->rel = V_SQ_REL_RELATIVE; 4551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel = tgsi_src->Register.Index; 4561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 4571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet } 4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet} 4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 460077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg) 461077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{ 462077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet struct r600_bc_vtx vtx; 463077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet unsigned int ar_reg; 464077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int r; 465077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 466077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (offset) { 467077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet struct r600_bc_alu alu; 468077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 469077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 470077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 471077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT); 472077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 473077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 474077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 475077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[1].value = offset; 476077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 477077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = dst_reg; 478077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 479077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 480077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 481077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = r600_bc_add_alu(ctx->bc, &alu))) 482077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 483077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 484077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = dst_reg; 485077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else { 486077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ar_reg = ctx->ar_reg; 487077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 488077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 489077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&vtx, 0, sizeof(vtx)); 490077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.fetch_type = 2; /* VTX_FETCH_NO_INDEX_OFFSET */ 491077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.src_gpr = ar_reg; 492077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.mega_fetch_count = 16; 493077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_gpr = dst_reg; 494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_x = 0; /* SEL_X */ 495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_y = 1; /* SEL_Y */ 496077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_z = 2; /* SEL_Z */ 497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.dst_sel_w = 3; /* SEL_W */ 498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.data_format = FMT_32_32_32_32_FLOAT; 499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.num_format_all = 2; /* NUM_FORMAT_SCALED */ 500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.format_comp_all = 1; /* FORMAT_COMP_SIGNED */ 501077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet vtx.srf_mode_all = 1; /* SRF_MODE_NO_ZERO */ 502d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet vtx.endian = r600_endian_swap(32); 503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = r600_bc_add_vtx(ctx->bc, &vtx))) 505077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 507077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return 0; 508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet} 509077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 5107687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx) 5117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct r600_bc_alu alu; 5147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nconst, r; 5157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 5177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 5187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nconst++; 5197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet tgsi_src(ctx, &inst->Src[i], &ctx->src[i]); 5217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 523077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) { 524077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet continue; 525077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } 526077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 527077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if (ctx->src[i].rel) { 528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet int treg = r600_get_temp(ctx); 529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg))) 530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].sel = treg; 533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx->src[i].rel = 0; 534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet j--; 535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet } else if (j > 0) { 5367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 5377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 5387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet memset(&alu, 0, sizeof(struct r600_bc_alu)); 5397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 5407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 5417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 5427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].rel = ctx->src[i].rel; 5437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 5477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 5537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].rel =0; 5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 5587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 5597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 5617687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) 5627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{ 5637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet struct r600_bc_alu alu; 5657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int i, j, k, nliteral, r; 5667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 5687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 5697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet nliteral++; 5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) { 5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) { 5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet int treg = r600_get_temp(ctx); 5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet for (k = 0; k < 4; k++) { 5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet memset(&alu, 0, sizeof(struct r600_bc_alu)); 5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].sel = ctx->src[i].sel; 5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].chan = k; 5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.src[0].value = ctx->src[i].value[k]; 5817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.sel = treg; 5827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.chan = k; 5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.dst.write = 1; 5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (k == 3) 5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet alu.last = 1; 5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if (r) 5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return r; 5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet ctx->src[i].sel = treg; 5917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet j--; 5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet } 5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet return 0; 5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet} 5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet 5973b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 59872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 6005555cd776b970bce020be59193054474a2a63317Dave Airlie struct tgsi_full_property *property; 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 602c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 603457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 60672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 617f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse ctx.bc->type = shader->processor_type; 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 620076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 621076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 622076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 623f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG) 624f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [256,287] correspond to constant buffer bank 2 (EG) 625f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet * Values [288,319] correspond to constant buffer bank 3 (EG) 626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 627076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 628076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 629076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 630076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 6457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx.bc->chiprev >= CHIPREV_EVERGREEN) { 646f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 647f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } else { 648f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS); 649f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse } 650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 6517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev >= CHIPREV_EVERGREEN) { 652fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx); 65384457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas } 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 658d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie 65997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet /* Outside the GPR range. This will be translated to one of the 66097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet * kcache banks later. */ 66197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet ctx.file_offset[TGSI_FILE_CONSTANT] = 512; 662d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 6637728bef29097c8406d35c6dd969544382abdf935Christian König ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL; 664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet ctx.temp_reg = ctx.ar_reg + 1; 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 668cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 669cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 6705555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = FALSE; 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 676cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 677cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 678cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 679cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 680cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 681cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 682cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 683cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 684cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 685cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 696be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 697be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 698be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 6991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet 7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_constant(&ctx))) 7027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet if ((r = tgsi_split_literal_constant(&ctx))) 7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet goto out_err; 7057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx.bc->chiprev == CHIPREV_CAYMAN) 7067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie ctx.inst_info = &cm_shader_tgsi_instruction[opcode]; 7077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else if (ctx.bc->chiprev >= CHIPREV_EVERGREEN) 70850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 70950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 71050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 715876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie case TGSI_TOKEN_TYPE_PROPERTY: 7165555cd776b970bce020be59193054474a2a63317Dave Airlie property = &ctx.parse.FullToken.FullProperty; 7175555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 7185555cd776b970bce020be59193054474a2a63317Dave Airlie if (property->u[0].Data == 1) 7195555cd776b970bce020be59193054474a2a63317Dave Airlie shader->fs_write_all = TRUE; 7205555cd776b970bce020be59193054474a2a63317Dave Airlie } 721876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie break; 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 729457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 730457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 731c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 732c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 733c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 734c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 735c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 736c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 737c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 7388ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 741c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 742a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 743457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 746c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 747c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 749457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 750457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 752457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 753457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 754457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 755457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 760b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 761c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 7625f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 763c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 764b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 76539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 7; 76639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 76739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 76839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) { 76939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].array_base = 61; 77039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_x = 7; 77139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_y = 1; 77239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie output[i].swizzle_z = output[i].swizzle_w = 7; 773c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 78472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 785457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 786457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 787457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 788457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 789457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 790457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 791457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 792457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 796457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 797457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 8028ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[i].burst_count = 1; 803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 805457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 8067e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 807457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 809c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 810481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 811481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 812481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 813481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 814481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 815481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 816481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 817481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 818481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 8198ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König output[0].burst_count = 1; 820481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 821608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 822481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 823a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 824481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 825481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 826457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 827457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 8287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx.bc->chiprev < CHIPREV_CAYMAN) { 8297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == (noutput - 1)) { 8307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie output[i].end_of_program = 1; 8317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 832457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 833b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 834b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 835a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 836c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 837c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 838457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 839457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 840c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 8447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* add program end */ 8457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx.bc->chiprev == CHIPREV_CAYMAN) 8467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie cm_bc_add_cf_end(ctx.bc); 8477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 8483b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet free(ctx.literals); 849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 852cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 859f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák R600_ERR("%s tgsi opcode unsupported\n", 860f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode)); 861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 869a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic void r600_bc_src(struct r600_bc_alu_src *bc_src, 870a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet const struct r600_shader_src *shader_src, 871a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet unsigned chan) 872a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{ 873a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->sel = shader_src->sel; 874a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->chan = shader_src->swizzle[chan]; 875a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->neg = shader_src->neg; 876a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->abs = shader_src->abs; 877a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->rel = shader_src->rel; 878a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet bc_src->value = shader_src->value[bc_src->chan]; 879a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet} 880a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 88180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx, 88280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet const struct tgsi_full_dst_register *tgsi_dst, 88380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet unsigned swizzle, 88480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet struct r600_bc_alu_dst *r600_dst) 885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 8867a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8877a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 89247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 89347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 8947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 8957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 8967a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 899dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask) 900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 901dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, lasti = 0; 902d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 903d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 904dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (writemask & (1 << i)) { 905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 907d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 908dffad730df17983cfaef0808555a8c26cad0aa15Christian König return lasti; 909dffad730df17983cfaef0808555a8c26cad0aa15Christian König} 910dffad730df17983cfaef0808555a8c26cad0aa15Christian König 911dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 912dffad730df17983cfaef0808555a8c26cad0aa15Christian König{ 913dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 914dffad730df17983cfaef0808555a8c26cad0aa15Christian König struct r600_bc_alu alu; 915dffad730df17983cfaef0808555a8c26cad0aa15Christian König int i, j, r; 916dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 918d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 919d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 920d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 92380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 9247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 925d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 926d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[j], &ctx->src[j], i); 929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 930d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[1], i); 9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[0], i); 933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 9397a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 9407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 9416372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie if (alu.src[0].neg) 9426372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie alu.src[0].neg = 0; 9437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 947d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 957d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 959d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 960d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 962d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 963d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 964d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 965d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 966d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 9677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx) 9687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 9697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, j, r; 9717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct r600_bc_alu alu; 9727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 9737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < last_slot; i++) { 9757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 9767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 9777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[j], &ctx->src[j], 0); 9797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 9807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 9817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 9827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 9847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 9857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 9867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 9887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 9897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 9907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 9917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 9927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/* 99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 9971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx) 99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 99996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float half_inv_pi = 1.0 /(3.1415926535 * 2); 100096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float double_pi = 3.1415926535 * 2; 100196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float neg_pi = -3.1415926535; 100296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 100396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König int r; 100492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 10057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 10141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 10157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1016921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1018a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&half_inv_pi; 101996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 1020ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1027a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 10287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1041a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 10507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1051921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 1053921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1054ac6334145ec8eef42505cdd727aed7fae0831e12Christian König alu.src[2].chan = 0; 105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König if (ctx->bc->chiprev == CHIPREV_R600) { 1057a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[1].value = *(uint32_t *)&double_pi; 1058a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&neg_pi; 105996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } else { 106096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[1].sel = V_SQ_ALU_SRC_1; 106196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].sel = V_SQ_ALU_SRC_0_5; 106296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König alu.src[2].neg = 1; 106396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König } 106496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König 106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 106688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 10727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx) 10737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 10747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct r600_bc_alu alu; 10767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 10777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 10787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = tgsi_setup_trig(ctx); 10807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 10817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 10827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 10857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 10867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 10877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 10887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 10917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 10927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 10937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 10947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 10957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 10967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 10977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 10987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 10997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 11017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 11027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 110392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 110492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 110592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 110692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 110792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 1108dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 110992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 11101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 111192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 112588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 1128be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 1129be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 1130be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 1131be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 113288f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1133a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1134be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 1135be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 113680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1137be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 113988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 114088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 114288f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 114388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 114488f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 114692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 114792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 114892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 114992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 11507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 115192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 11561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r = tgsi_setup_trig(ctx); 115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 116092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 116192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 116257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 11637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 11647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 11657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 11677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 11707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 11747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 11757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 11767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 11777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 11797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 11807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 11817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 11827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 11847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 11867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 11877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 11887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 11897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 11917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 11927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 119357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 119492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 119592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 119657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 11977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 11987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0 ; i < 3; i++) { 11997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 12007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 12017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 12037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 12047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie else 12057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 12067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 12077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 12087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 12097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 12157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 12167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 12177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 121857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 12197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 12207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 12217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 12227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 12237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 12247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 12257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 122657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 122792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1228ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 1229ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 1230ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1231ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1232ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1233ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 123480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 1235ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1236ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 1237ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1238ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1239ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1240ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1241ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1242ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1243ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1244ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1245ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1246ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1247ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1248ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1249ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1250ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1251ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 125280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1253ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1254ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1255ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1256ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1257ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1258ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1259ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1260ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1261ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1262ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1263ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 126492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 126592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1267094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1268094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1269094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1270094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1271094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1272094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1273094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1274094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12754502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1276094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 12774502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1278921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 12794502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12804502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 12814502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 12824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 12834502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 12841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[0], i); 12854502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1286094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1287094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1288094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1289094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1290094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1291094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1292094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 12934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 12944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 12954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 12964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1297094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1298094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1299094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 13020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 13070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 13086a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 13096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 13107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 13116a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 13127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 13137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 13147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = log(src.y) */ 13157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 13167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 13177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 1); 13187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 13207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 13237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 13257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = log(src.y) */ 13317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 13327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 13337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 1); 13342fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.sel = ctx->temp_reg; 13352fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.chan = 2; 13362fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin alu.dst.write = 1; 13377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13436a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 13446a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1348a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 13491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 3); 13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1352ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 13531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[2], &ctx->src[0], 0); 13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 13560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 13570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 13580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 13590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 13600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 13610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 13620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 13677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else 13757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 0; 13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 13817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* dst.z = exp(tmp.x) */ 13827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 13837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 13847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 13877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 13907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 13920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 1393abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1394abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.y = max(src.x, 0.0) */ 1395abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer memset(&alu, 0, sizeof(struct r600_bc_alu)); 1396abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1397abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer r600_bc_src(&alu.src[0], &ctx->src[0], 0); 1398abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 1399abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[1].chan = 0; 1400abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 1401abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 1402abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer r = r600_bc_add_alu(ctx->bc, &alu); 1403abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1404abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1405abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1406abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.x, <- 1.0 */ 1407abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer memset(&alu, 0, sizeof(struct r600_bc_alu)); 1408abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1409abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 1410abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1411abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 1412abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 1413abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer r = r600_bc_add_alu(ctx->bc, &alu); 1414abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1415abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1416abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 1417abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer /* dst.w, <- 1.0 */ 1418abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer memset(&alu, 0, sizeof(struct r600_bc_alu)); 1419abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1420abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].sel = V_SQ_ALU_SRC_1; 1421abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.src[0].chan = 0; 1422abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1423abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 1424abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer alu.last = 1; 1425abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer r = r600_bc_add_alu(ctx->bc, &alu); 1426abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer if (r) 1427abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer return r; 1428abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer 14290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 14310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 143242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 143342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 143442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 143542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 143642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 143742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 143842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1439df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1440df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1441df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1442df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1443df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1444df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1445df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 14471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[i], &ctx->src[i], 0); 144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 145342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 145442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 145542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 145642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 145742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 145842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 145942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 14617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 14657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 14667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 14687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 147180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 14737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 14747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 14757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 14767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 14807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1485a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 14911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[i], &ctx->src[i], 0); 1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1497a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1498a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1502a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx) 15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{ 15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i, r; 15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie struct r600_bc_alu alu; 15087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3; 15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* b * LOG2(a) */ 15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[1], 0); 15287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[1].sel = ctx->temp_reg; 15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < last_slot; i++) { 15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* POW(a,b) = EXP2(b * LOG2(a))*/ 15387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == last_slot - 1) 15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 15467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 15507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return 0; 15517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie} 15527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1560a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 15611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1567a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1568a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 157066f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 15711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[1], 0); 1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1581a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1589a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 15920d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 15930d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 1596921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 15970d48925a56ad4fb253386110b545abda82a25464Dave Airlie 15980d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16000d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1601a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16020d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1603cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 16040d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1605cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 16060d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], i); 1608921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[2], &ctx->src[0], i); 16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16120d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16180d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 16200d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1621a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 16220d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 162380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16240d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1626cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1629921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 16300d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1633cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie 16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 16360d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 16410d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 16430d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1652a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 16536c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1655a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 165680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1666cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1668cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1675dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 16777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 16787be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 16797be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 16807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 16841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[j], &ctx->src[j], i); 1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König 168780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 16917be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) { 1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 16987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 17111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[j], &ctx->src[j], i); 1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1713a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König 171480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1716a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1718cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1721921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1727921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1728cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1729cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1730cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1731e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1732e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1733e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1734e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1735e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1736e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1737e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1738cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1739cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 17487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König return 0; 1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 17516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx, 17526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 17536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 17546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return (inst->Src[index].Register.File != TGSI_FILE_TEMPORARY && 17566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy inst->Src[index].Register.File != TGSI_FILE_INPUT) || 17576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy ctx->src[index].neg || ctx->src[index].abs; 17586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 17596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 17606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx, 17616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy unsigned index) 17626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{ 17636415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17646415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index; 17656415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy} 17666415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 176733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 176833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 176996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König static float one_point_five = 1.5f; 177033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 177133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1772641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1773641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 177440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy int r, i, j; 1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1776da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler /* Texture fetch instructions can only use gprs as source. 1777da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler * Also they cannot negate the source or take the absolute value */ 17786415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0); 177978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler boolean src_loaded = FALSE; 178013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie unsigned sampler_src_reg = 1; 1781641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 17826415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy src_gpr = tgsi_tex_get_src_gpr(ctx, 0); 1783641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 178413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 178513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie /* TGSI moves the sampler to src reg 3 for TXD */ 178613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie sampler_src_reg = 3; 178713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 178840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (i = 1; i < 3; i++) { 178940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy /* set gradients h/v */ 179040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy memset(&tex, 0, sizeof(struct r600_bc_tex)); 179140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H : 179240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy SQ_TEX_INST_SET_GRADIENTS_V; 179340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 179440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 179540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 179640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (tgsi_tex_src_requires_loading(ctx, i)) { 179740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = r600_get_temp(ctx); 179840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = 0; 179940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = 1; 180040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = 2; 180140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = 3; 180240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy 180340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy for (j = 0; j < 4; j++) { 180440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy memset(&alu, 0, sizeof(struct r600_bc_alu)); 180540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 180640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy r600_bc_src(&alu.src[0], &ctx->src[i], j); 180740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.sel = tex.src_gpr; 180840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.chan = j; 180940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (j == 3) 181040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.last = 1; 181140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy alu.dst.write = 1; 181240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy r = r600_bc_add_alu(ctx->bc, &alu); 181340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 181440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 181540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 181613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie 181740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } else { 181840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i); 181940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_x = ctx->src[i].swizzle[0]; 182040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_y = ctx->src[i].swizzle[1]; 182140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_z = ctx->src[i].swizzle[2]; 182240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_sel_w = ctx->src[i].swizzle[3]; 182340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.src_rel = ctx->src[i].rel; 182440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 182540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */ 182640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7; 182740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 182840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_x = 1; 182940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_y = 1; 183040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_z = 1; 183140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy tex.coord_type_w = 1; 183240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy } 183340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy r = r600_bc_add_tex(ctx->bc, &tex); 183440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy if (r) 183540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy return r; 183613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } 183713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int out_chan; 1839b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 2; 18427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 18437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 18447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 18457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 3); 1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 18477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 18487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 18497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 18507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (out_chan == i) 18527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 18537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 18547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie out_chan = 3; 18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 18627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 3); 18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = out_chan; 18667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 18729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse 1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1875a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = out_chan; 18781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[0], i); 1879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1884b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1885b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1886b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1887a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1888921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1889b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1890b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1891b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1892b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1893b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1894b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1895b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1896b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 189778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 1898b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 19020e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src0_swizzle[] = {2, 2, 0, 1}; 19030e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned src1_swizzle[] = {1, 0, 2, 2}; 1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1908a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 19090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 19100e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]); 1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 19227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 19237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 19247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 19257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 19267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 19277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 19287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 19297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 19307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 19317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 19327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 19337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 19347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 19367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 19397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 19407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 19417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 19437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 2; 19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].abs = 1; 19457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 19497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 19537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 19567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse * muladd has no writemask, have to use another temp 1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1959a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 19667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1969a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 1970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1980a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 19877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1990a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet alu.src[2].value = *(uint32_t *)&one_point_five; 1991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 200178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 200578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_requires_loading && !src_loaded) { 2006b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 2007b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2008a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 20091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], i); 2010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 2011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 2012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 2013b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 2014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 2015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 2016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 2017b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 2018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 201978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler src_loaded = TRUE; 2020b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 2021b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 20227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2023bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 2024de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) { 2025de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy switch (opcode) { 2026de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE: 2027de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C; 2028de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2029de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_L: 2030de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_L; 2031de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2032de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy case SQ_TEX_INST_SAMPLE_G: 2033de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy opcode = SQ_TEX_INST_SAMPLE_C_G; 2034de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy break; 2035de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 2036de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy } 203733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 203833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 2039bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 20406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy 20416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg); 2042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS; 2043641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 20446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 20459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7; 20469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7; 20479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7; 20489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7; 204978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler if (src_loaded) { 205078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = 0; 205178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = 1; 205278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = 2; 205378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = 3; 205478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } else { 205578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_x = ctx->src[0].swizzle[0]; 205678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_y = ctx->src[0].swizzle[1]; 205778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = ctx->src[0].swizzle[2]; 205878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = ctx->src[0].swizzle[3]; 2059244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler tex.src_rel = ctx->src[0].rel; 206078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler } 20619a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 2063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 2065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 2066bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 2067bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 2068bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 206901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 207001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 207101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 20727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 207301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 207401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 2075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 207669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) { 207769d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie tex.coord_type_z = 0; 207878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_z = tex.src_sel_y; 207969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie } else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY) 208069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie tex.coord_type_z = 0; 208169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 2082bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 208378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler tex.src_sel_w = tex.src_sel_z; 2084bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2085bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 2086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 2087bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 2088bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 2089bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 2090bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 209133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 209233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 2097dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2101c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König /* optimize if it's just an equal balance */ 21021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) { 2103c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König for (i = 0; i < lasti + 1; i++) { 2104c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2105c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König continue; 2106c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2107c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König memset(&alu, 0, sizeof(struct r600_bc_alu)); 2108c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 21091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[1], i); 21101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[2], i); 2111c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.omod = 3; 211280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2113c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.dst.chan = i; 2114c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (i == lasti) { 2115c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König alu.last = 1; 2116c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2117c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König r = r600_bc_add_alu(ctx->bc, &alu); 2118c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König if (r) 2119c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return r; 2120c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2121c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König return 0; 2122c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König } 2123c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König 2124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 2125dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2126dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2127dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2128dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2130a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 2131921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 2132b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 21331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[0], i); 2134b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 2135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2137dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 2147dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2148dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2149dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2150dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2152a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 2153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 2154b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 21551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[2], i); 2156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 2157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2158dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 2162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2165b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 2167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 2168dffad730df17983cfaef0808555a8c26cad0aa15Christian König for (i = 0; i < lasti + 1; i++) { 2169dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 2170dffad730df17983cfaef0808555a8c26cad0aa15Christian König continue; 2171dffad730df17983cfaef0808555a8c26cad0aa15Christian König 2172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 2174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 21751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], i); 21761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[1], i); 2177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 2178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 2179dffad730df17983cfaef0808555a8c26cad0aa15Christian König 218080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 2182dffad730df17983cfaef0808555a8c26cad0aa15Christian König if (i == lasti) { 2183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 2184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 2186b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 2187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 2188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 2189dffad730df17983cfaef0808555a8c26cad0aa15Christian König return 0; 2190b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 2191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 219287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 219387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 219487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 219587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 219687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 2197dffad730df17983cfaef0808555a8c26cad0aa15Christian König int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask); 219887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 21997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König for (i = 0; i < lasti + 1; i++) { 22007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 22017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König continue; 220287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 220387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2204a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 22051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], i); 22061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[2], i); 22071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[2], &ctx->src[1], i); 220880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 220987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 221087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 221187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 22127be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König if (i == lasti) 221387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 221487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 221587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 221687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 22177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 221887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 221987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 222087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 22240e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src0_swizzle[] = {2, 0, 1}; 22250e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet static const unsigned int src1_swizzle[] = {1, 2, 0}; 22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2235a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 22360e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 22370e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); 22380e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); 22390e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2259a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet if (i < 3) { 22620e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); 22630e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); 22640e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet } else { 22650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 22660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 22670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 22680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 22730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 227780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet else 227880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 22790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 22800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 22870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 22880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 22890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 22900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 22910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 22920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 229709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 22987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2304a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 23051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 231336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 231436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 0; 23357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 23417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 23457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2350a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 23511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 2354b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0 2355b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 2356b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet if (r) 2357b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet return r; 2358b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif 235936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 236236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 236336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 236436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 236536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 236636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 23717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 23727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 23737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 23747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 23797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) { 23807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 23857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 23867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 23877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 23887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 23897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 23907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 23917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 23937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 23947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 23957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 23967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 23977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 23987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 23997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 24007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 240636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 240736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 240836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2409a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 241036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 241136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 241236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 241336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 241436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 241536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 241636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 241736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 241836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 241936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 242036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 242136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 242236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 242387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2424460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2425460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2426460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2427460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie int i; 2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 24347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 24397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 24427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 0) 24437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 24457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 24477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 0; 24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 24997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 25067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 25097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 25137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 25357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 255596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 25587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 256096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 256596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 25707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 1) 25767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 25787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 25797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 25807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 25817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 25847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 25867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].sel = ctx->temp_reg; 25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.src[0].chan = 1; 258996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 25917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 1; 25927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 259496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 25957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 25967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 25977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 25987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 259996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 260096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 260196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 260296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 260396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 26041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 260596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 260696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 260796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2612460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2613460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2615460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2616460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2617460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2619460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2620460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (ctx->bc->chiprev == CHIPREV_CAYMAN) { 26227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie for (i = 0; i < 3; i++) { 26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2624460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = i; 26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (i == 2) 26337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 26357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 26367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 26397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } else { 26407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 26437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r600_bc_src(&alu.src[0], &ctx->src[0], 0); 26447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.sel = ctx->temp_reg; 26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.write = 1; 26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.dst.chan = 2; 26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie alu.last = 1; 26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 26507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie if (r) 26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie return r; 26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie } 2654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2661460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2664460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2669460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2672460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2673460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2674460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2675460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2676460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 267798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx) 267898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{ 267998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 268098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie struct r600_bc_alu alu; 268198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie int r; 2682a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 268398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 268498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie 268552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher switch (inst->Instruction.Opcode) { 268652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARL: 268752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR; 268852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 268952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher case TGSI_OPCODE_ARR: 269052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 269152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher break; 269252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher default: 269352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher assert(0); 269452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher return -1; 269552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher } 269652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher 26971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 269898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2699077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 270098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.dst.write = 1; 2701495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 270298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 270398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 2704077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2705077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet /* TODO: Note that the MOVA can be avoided if we never use AR for 2706077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * indexing non-CB registers in the current ALU clause. Similarly, we 2707077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * need to load AR from ar_reg again if we started a new clause 2708077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * between ARL and AR usage. The easy way to do that is to remove 2709077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * the MOVA here, and load it for the first AR access after ar_reg 2710077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet * has been modified in each clause. */ 271198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 271298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2713077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 271498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.src[0].chan = 0; 271598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie alu.last = 1; 2716495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 271798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie if (r) 271898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return r; 271998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie return 0; 272098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie} 272198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx) 272247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 272347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 272447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 272547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 272647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 2727a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet 27287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse switch (inst->Instruction.Opcode) { 27297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARL: 2730077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2731077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 2732077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 2733077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2734077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2735077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2736077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2737077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = r600_bc_add_alu(ctx->bc, &alu))) 2738077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 2739077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2740077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2741077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 2742077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 2743077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2744077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2745077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2746077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2747077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = r600_bc_add_alu(ctx->bc, &alu))) 2748077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 27497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 27507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse case TGSI_OPCODE_ARR: 2751077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2752077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT; 2753077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 2754077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.sel = ctx->ar_reg; 2755077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.dst.write = 1; 2756077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.last = 1; 2757077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet 2758077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet if ((r = r600_bc_add_alu(ctx->bc, &alu))) 2759077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet return r; 27607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse break; 27617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse default: 27627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse assert(0); 27637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse return -1; 27647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 27657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2766077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet memset(&alu, 0, sizeof(alu)); 2767077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT; 2768077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet alu.src[0].sel = ctx->ar_reg; 276947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 277047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2771495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet r = r600_bc_add_alu(ctx->bc, &alu); 277247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 277347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2774c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 277547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 277647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 277747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 277857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 277957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 278057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 278157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 278257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 278357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 278457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 278557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 278657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 278880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 27897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 27907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse if (i == 0 || i == 3) { 279157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 279257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 27931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], i); 279457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 279557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2796a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet if (i == 0 || i == 2) { 279757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 279857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 27991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[1], &ctx->src[1], i); 280057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 280157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 280257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 280357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 280457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 280557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 280657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 280757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 280857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 280957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2821a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2822a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 28231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet r600_bc_src(&alu.src[0], &ctx->src[0], 0); 2824a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2825a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 28267ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 2827a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2828a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2830a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2832a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2833a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2834a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2835a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 28378813842121d46d1be476807c98b0ba0b771f0c91Christian König int alu_pop = 3; 28388813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last) { 28398813842121d46d1be476807c98b0ba0b771f0c91Christian König if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3) 28408813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 0; 28418813842121d46d1be476807c98b0ba0b771f0c91Christian König else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3) 28428813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop = 1; 28438813842121d46d1be476807c98b0ba0b771f0c91Christian König } 28448813842121d46d1be476807c98b0ba0b771f0c91Christian König alu_pop += pops; 28458813842121d46d1be476807c98b0ba0b771f0c91Christian König if (alu_pop == 1) { 28468813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3; 28478813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 28488813842121d46d1be476807c98b0ba0b771f0c91Christian König } else if (alu_pop == 2) { 28498813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3; 28508813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->force_add_cf = 1; 28518813842121d46d1be476807c98b0ba0b771f0c91Christian König } else { 28528813842121d46d1be476807c98b0ba0b771f0c91Christian König r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 28538813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->pop_count = pops; 28548813842121d46d1be476807c98b0ba0b771f0c91Christian König ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2; 28558813842121d46d1be476807c98b0ba0b771f0c91Christian König } 2856a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2857a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2858a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2887a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2888a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2889a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 28977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse } 289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2927a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2930a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2958a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 296209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 296509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 29717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 297409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 297509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 297609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 297709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 297809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 298009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 298109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 298209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 298309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 298409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 298509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 298709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 299309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 299409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 299609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2998a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 299909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 3000a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 3005a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3006a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3008a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 3009a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 3011a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 3012a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 3014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 3015a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3016a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3017a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3018a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 3019a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 3020a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 3021a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 3022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 3023a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 3024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 3025a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3026a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 3027a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 3028a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 3029a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 3031a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 303209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 303509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 3040a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 3043a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 3053a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 305609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 305709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 305809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 306009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 306109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 306209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 306309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 306409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 306809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 307009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 307209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 307309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 307409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 307509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 307609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 307709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 307809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 307909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 308009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 308109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 308209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 308309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 308409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 308609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 308709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 308909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 309109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 309209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 309709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 309809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 3100a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 3101a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 3102a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 310498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 31060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 3107df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 3108df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 3109df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 3110df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 3111df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 3112df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 3113df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 311442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 311536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3119cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3120cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 312157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 3122dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 3123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 3124d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 3125be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 3128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31363af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 3137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 3139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 31414558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 3142a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 31430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 3144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 3147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3148e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 314988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 31503af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 31513af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 31524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31580d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31600d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 316188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 3162d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 31630d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3165b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 316613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 3167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 3168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31749f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl}, 3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 31780d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 317987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 318092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 3181d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 3182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3185ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 3187a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3191a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 3192a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 3193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 32010ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 3213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 3216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 3218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 3235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 3236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 3237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 3265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 326898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 32728ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq}, 327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 3274112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 328850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 329750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 329850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 329950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 330050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 330150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 330250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 330350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 330450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 330550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 330650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 330750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 330850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 330950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 331050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 331150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 331750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 331850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 331950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 332050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 332150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 332250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 332350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 332413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 332550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 332650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 33337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 33377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 33387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 33397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 33407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 33437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 33447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 33457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 33467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 33507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 33517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 33607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 33717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 33747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 33767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 33937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 33947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 33957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 33997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}; 34247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 34257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = { 34267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 34277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 34287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 34297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr}, 34307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr}, 34317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 34327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 34337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 34347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 34357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 34367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 34377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 34387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 34397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 34407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 34417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 34427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 34437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 34447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 34457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 34477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 34507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 34537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 34557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr}, 34577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr}, 34587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow}, 34597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 34607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie /* gap */ 34617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 34637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 34657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig}, 34667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 34677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 34687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 34697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 34757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 34777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig}, 34787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 34797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 34807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 34817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 348213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie {TGSI_OPCODE_TXD, 0, SQ_TEX_INST_SAMPLE_G, tgsi_tex}, 34837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 34847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 348550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 348650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 348750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 348850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 348950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 349052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl}, 349150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 349250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 349350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 349450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 349550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 349650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 349750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 349850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 349950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 350050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 3501ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie {TGSI_OPCODE_TXL, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 350250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 350350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 350450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 350550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 350650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 350750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 350850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 350950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 351050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 35170ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2}, 351850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 351950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 352050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 352850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 352950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 353250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 353450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 353650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 353950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 354250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 354950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 355150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 355250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 355350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 355950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 356950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 357950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 358150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3582