r600_shader.c revision 84b2773f00161441c4fe06ce6dbf979c5ce78dae
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" 24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h" 25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h" 2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h" 27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h" 2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h" 2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h" 30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h" 31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h" 32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h" 33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h" 3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 37de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 52cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 53cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 54e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe u32 max_driver_temp_used; 552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 612b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 6450526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[]; 6542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx); 66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6759276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie/* called from hw states files to find VS->FS mapping */ 6859276b8541049a2d07d32fbb139fb14e21e387fcDave Airlieint r600_find_vs_semantic_index(struct r600_context *rctx, struct r600_shader *rshader, int id) 6959276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie{ 7059276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie int i; 7159276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie struct r600_shader *vs = &rctx->vs_shader->shader; 7259276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie struct r600_shader_io *input = &rshader->input[id]; 7359276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie 7459276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie for (i = 0; i < vs->noutput; i++) { 7559276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie if (input->name == vs->output[i].name && 7659276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie input->sid == vs->output[i].sid) { 7759276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie return i - 1; 7859276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie } 7959276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie } 8059276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie return 0; 8159276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie} 8259276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx, 1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rpshader, 1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct tgsi_token *tokens) 124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 12836efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 12936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0); 130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 1316f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return -ENOMEM; 132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 133d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie rpshader->shader.use_mem_constant = rscreen->use_mem_constant; 134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 1376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 1426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 14436efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 1456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader) 14972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1509ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie struct r600_context *rctx = r600_context(ctx); 15172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 15272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 15367234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse state = &rpshader->rstate[0]; 15467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_state_fini(&rpshader->rstate[0]); 1559ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie 1569ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie return rctx->vtbl->vs_shader(rctx, rpshader, state); 15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader) 16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse struct r600_context *rctx = r600_context(ctx); 16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 16467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse state = &rpshader->rstate[0]; 16566e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_state_fini(state); 1665f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie 1679ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie return rctx->vtbl->ps_shader(rctx, rpshader, state); 16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 172ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 173ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 176f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie void *data; 17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 179f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie radeon_ws_bo_reference(rscreen->rw, &rpshader->bo, NULL); 18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 181f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie rpshader->bo = radeon_ws_bo(rscreen->rw, rshader->bc.ndw * 4, 1827c1fcc41be15b6d648f84c8c1870a3a00575a48fDave Airlie 4096, 0); 18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1860f099f2906773690210661fb533e207626dc8e40Jerome Glisse data = radeon_ws_bo_map(rscreen->rw, rpshader->bo, 0, ctx); 187f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie memcpy(data, rshader->bc.bytecode, rshader->bc.ndw * 4); 188f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie radeon_ws_bo_unmap(rscreen->rw, rpshader->bo); 18972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 20872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 236c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 237a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 242a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 24447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Src[j].Register.Dimension || 245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 24647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j, 24747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Dimension, 24847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie i->Src[j].Register.Absolute); 249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 25347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (i->Dst[j].Register.Dimension) { 25447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie R600_ERR("unsupported dst (dimension)\n"); 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 25972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 26072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 26150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int gpr) 26250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 26350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie int i, r; 26450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie struct r600_bc_alu alu; 26550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 26650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie for (i = 0; i < 8; i++) { 26750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 26850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 26950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (i < 4) 27050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW; 27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY; 27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i > 1) && (i < 6)) { 27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.sel = ctx->shader->input[gpr].gpr; 27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.write = 1; 27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.dst.chan = i % 4; 28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[0].chan = (1 - (i % 2)); 28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + gpr; 28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.bank_swizzle_force = SQ_ALU_VEC_210; 28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if ((i % 4) == 3) 28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie alu.last = 1; 28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 28750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (r) 28850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return r; 28950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 29050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie} 29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 29572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 30072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 30635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 32750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) { 32850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* turn input into interpolate on EG */ 32950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie evergreen_interp_alu(ctx, i); 33050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 33735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 34133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 34247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie case TGSI_FILE_ADDRESS: 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 34972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 351be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx) 352be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 353be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return ctx->temp_reg + ctx->max_driver_temp_used++; 354be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 355be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 35772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 360c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 361457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 36472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 370d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.bc->use_mem_constant = shader->use_mem_constant; 371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 379076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 380076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 381076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 383076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 384076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 385076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 386076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 406d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie if (ctx.shader->use_mem_constant) 407d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 128; 408d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie else 409d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 410d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie 411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 415cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 416cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 417cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 423cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 424cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 425cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 426cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 427cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 428cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 429cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 430cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 431cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 432cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 443be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie ctx.max_driver_temp_used = 0; 444be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie /* reserve first tmp for everyone */ 445be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_get_temp(&ctx); 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 44750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie if (ctx.bc->chiprev == 2) 44850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &eg_shader_tgsi_instruction[opcode]; 44950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else 45050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 4542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 465457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 467c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 468c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 470c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 471c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 472c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 473c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 474c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 475c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 476c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 481c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 482c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 495b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 4975f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 498c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 499b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_x = 2; 500b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie output[i].swizzle_y = output[i].swizzle_z = output[i].swizzle_w = 7; 501c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 51272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 517457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 518457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 519457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 520457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 521457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 522457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 524457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 525457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 526457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 527457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 528457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 529457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 530457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 531457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 532457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 5337e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 534457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 536c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 537481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 538481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 539481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 540481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 541481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 542481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 543481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 544481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 545481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 546481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 547608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 548481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 549a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT); 550481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 551481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 552457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 553457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 554457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 555457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 556457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 557b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 558b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 559a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE); 560c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 561c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 562457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 563457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 564c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 568cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 592cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 597cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 598cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 599cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 600cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 601cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 60347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_src->Register.Indirect) 60447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_src->rel = V_SQ_REL_RELATIVE; 6051bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 6157a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6167a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 62147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (tgsi_dst->Register.Indirect) 62247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r600_dst->rel = V_SQ_REL_RELATIVE; 6237a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 6247a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 6257a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 6467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 6477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 6547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 6567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 6577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) { 662be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 6637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 6647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 6669bbc54a10d225679a180a085f7ca5bb88ee2bd15Dave Airlie alu.src[0].sel = r600_src[j].sel; 6677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 668be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 6697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 6707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 6717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 6727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 6737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 677be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_src[j].sel = treg; 6787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 6797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 684be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */ 685be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 686be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{ 687be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 688be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie struct r600_bc_alu alu; 689be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int i, j, k, nliteral, r; 690be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 691be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) { 692be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) { 693be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie nliteral++; 694be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 695be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 696be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0, j = 0; i < inst->Instruction.NumSrcRegs; i++) { 697be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Src[j].Register.File == TGSI_FILE_IMMEDIATE) { 698be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int treg = r600_get_temp(ctx); 699be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (k = 0; k < 4; k++) { 700be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 701a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 702be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = r600_src[j].sel; 703be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].chan = k; 704be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.sel = treg; 705be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.chan = k; 706be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.dst.write = 1; 707be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (k == 3) 708be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.last = 1; 709be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 710be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 711be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 712be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 713be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 714be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 715be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 716be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r600_src[j].sel = treg; 717be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie j++; 718be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 719be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 720be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return 0; 721be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie} 722be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 723d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 7267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 735d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 7377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 7387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 7397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 740d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 741d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 742d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 743d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 745d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 746d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 747d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 748d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 749d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 750d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 7527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 7537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 755d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 756d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 757d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 758d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 759d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 760d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 7677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 7687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 7697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 773d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 783d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 784d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 785d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 786d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 788d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 789d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 790d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 791d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 792d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 79892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx, 79992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]) 80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 80292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 80492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 80592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 80888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 810be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 811be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 812be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (r) 813be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie return r; 814be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 81888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 819a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 82088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 829921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 83088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 831921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 83288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 83388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 83488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 83588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 83688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 83788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 83888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 83988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 84088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 84188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 842a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 85588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 85688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 85788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 85888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 85988f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 86088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 86188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 86288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 86388f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 864a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 86588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 86688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 86788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 86888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 86988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 87088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 87188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 87288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 87388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 874921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 87588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 876921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 87788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 87888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 87988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 88088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 88188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 88288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 88388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 88488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 88592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 88692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 88792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 88892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 88992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 89092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 89192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 89292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 89392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int i, r; 894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie int lasti = 0; 89592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 89692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie r = tgsi_setup_trig(ctx, r600_src); 89792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie if (r) 89892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return r; 89988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 90088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 90188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 90288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 90388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 90488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 90588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 90688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 90788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 90888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 90988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 91088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 91188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 91288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 91388f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 91488f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 915be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) 916be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie lasti = i; 917be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie } 918be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie for (i = 0; i < lasti + 1; i++) { 919be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 920be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie continue; 921be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 92288f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 923a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 924be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie 925be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie alu.src[0].sel = ctx->temp_reg; 92688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 92788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 92888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 929be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie if (i == lasti) 93088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 93188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 93288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 93388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 93488f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 93588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 93688f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 93788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 93892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx) 93992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{ 94092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 94192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu_src r600_src[3]; 94292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie struct r600_bc_alu alu; 94392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie int r; 94492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 94557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck /* We'll only need the trig stuff if we are going to write to the 94657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck * X or Y components of the destination vector. 94757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck */ 94857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) { 94957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_setup_trig(ctx, r600_src); 95057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 95157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 95257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 95392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 95492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.x = COS */ 95557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { 95657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 95757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS); 95857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 95957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 96057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 96192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 96257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 96357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 96457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 96557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 96657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 96757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 96857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 96992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 97092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie /* dst.y = SIN */ 97157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { 97257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 97357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN); 97457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 97557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 97657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 97757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck 97857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 97957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.src[0].chan = 0; 98057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck alu.last = 1; 98157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 98257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck if (r) 98357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck return r; 98457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck } 98592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 986ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.z = 0.0; */ 987ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { 988ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 989ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 990ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 991ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 992ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 993ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 994ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 995ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 996ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_0; 997ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 998ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 999ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1000ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1001ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1002ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1003ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1004ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1005ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1006ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1007ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1008ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1009ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1010ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck /* dst.w = 1.0; */ 1011ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { 1012ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1013ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1014ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1015ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1016ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 1017ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1018ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1019ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1020ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 1021ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.src[0].chan = 0; 1022ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1023ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck alu.last = 1; 1024ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1025ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 1026ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1027ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1028ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 1029ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 1030ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck if (r) 1031ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck return r; 1032ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck } 1033ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck 103492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie return 0; 103592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie} 103692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie 1037094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 1038094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 1039094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1040094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 1041094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 1042094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 1043094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 1044094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1045094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 10464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1047094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 10484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 1049921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 10504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 10514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) { 10524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 10534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].neg = 1; 10544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } else { 10554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 10564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 10574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 10584502b17901ad491e0598ee59a12d372c008ae03bDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 10594502b17901ad491e0598ee59a12d372c008ae03bDave Airlie } 1060094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 1061094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 1062094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 1063094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1064094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 1065094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 1066094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 10674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 10684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie if (r) 10694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie return r; 10704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie 10714502b17901ad491e0598ee59a12d372c008ae03bDave Airlie /* kill must be last in ALU */ 10724502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->bc->force_add_cf = 1; 10734502b17901ad491e0598ee59a12d372c008ae03bDave Airlie ctx->shader->uses_kill = TRUE; 1074094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 1075094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 1076094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 10770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 10780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 10790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 1081ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie struct r600_bc_alu_src r600_src[3]; 10820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 10830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 1084ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie r = tgsi_split_constant(ctx, r600_src); 1085ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie if (r) 1086ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie return r; 1087d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie r = tgsi_split_literal_constant(ctx, r600_src); 1088d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie if (r) 1089d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie return r; 1090ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 10917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 10927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1093a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1094921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 10957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 10967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 10977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 11007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 11017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 11057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1106a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX); 1107ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1108921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 110985e401d8bfd80450a31eac234e13008e33e64227Dave Airlie alu.src[1].chan = 0; 11107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 11117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 11147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 11157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 11197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1120a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1121921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 11227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 11237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 11247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 11277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 11287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 11297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 11307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 11310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 11335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 11345ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 11355ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 11360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 11370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 11386a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 11396a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 11406a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 11410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 11420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1143a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED); 1144ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 1145ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 11460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 11470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 11480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 11490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 11500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 11510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 11520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 11530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11545ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 11555ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 11565ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 115785e401d8bfd80450a31eac234e13008e33e64227Dave Airlie 11586a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 11596a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 11600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 11620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1163a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT); 1164ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[0] = r600_src[0]; 11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 11660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 11670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 1168ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie 1169ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie alu.src[2] = r600_src[0]; 11707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 11710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 11720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 11730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 11740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 11750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 11760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 11770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 11780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 11790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 11805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 11815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 11825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 11830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 11840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 1185a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 11860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 11870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 11880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 11890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 11900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 11910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 11920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 11930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 11940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 11950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 11960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 11970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 11980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 119942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx) 120042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{ 120142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 120242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck struct r600_bc_alu alu; 120342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck int i, r; 120442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 120542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 1206df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 1207df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 1208df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 1209df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIPSQRT_IEEE instead. 1210df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 1211df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED); 1212df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 121342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 121442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 121542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 121642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 121742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 121842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.src[i].abs = 1; 121942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck } 122042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 122142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.dst.write = 1; 122242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck alu.last = 1; 122342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 122442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 122542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 122642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 122742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck if (r) 122842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return r; 122942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck /* replicate result */ 123042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck return tgsi_helper_tempx_replicate(ctx); 123142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck} 123242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck 12335cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 12345cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 12355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 12375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 12385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 12395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 12405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 12415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 12425cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 12435cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 12455cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 12465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 12485cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 12495cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12505cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 12515cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 12525cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 12535cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12545cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 12555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 12565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 12575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 12585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 12595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 12605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 1261a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1265a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1270a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 12717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 12837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 12847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1285a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1286a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1287a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1288a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1289a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1290a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1291a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1292a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1293a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1294a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1295a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1296a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1297a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1298a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1299a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1300a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1301a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1302a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1303a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1304a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 13055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 13065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 13075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 1308a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1309a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1310a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1311a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1312a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1313a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1314a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1315a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1316a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1317a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1318a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1319a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1320a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 1321a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1322a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1323a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1324a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1325a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1326a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1327a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1328a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1329a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1330a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1331e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1332e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1333e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1334a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1335a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1336a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE); 1337a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1338a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1339a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1340a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1341a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1342a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1343a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1344a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1345a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1346a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1347a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1348e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1349e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1350e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1351a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1352a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1353a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 1354a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1355a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1356a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1357a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1358a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1359a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1360a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1361e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1362e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1363e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1364a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1365a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1366a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 13670d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 13680d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 13690d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13700d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 13710d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1372921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 13730d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13740d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 13750d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 13760d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 13770d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13780d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 13790d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 13800d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1381a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 13820d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 1383cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie 13840d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 1385cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.dst.chan = i; 13860d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13870d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 13880d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 13890d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1390921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 13910d48925a56ad4fb253386110b545abda82a25464Dave Airlie 13920d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 13930d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 13940d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 13950d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 13960d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 13970d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 13980d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 13990d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 1400cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 1401cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie if (r) 1402cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie return r; 14030d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14040d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 14050d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 14060d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1407a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT); 14080d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 14090d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 14100d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14110d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14120d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14130d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 1414cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[0].chan = i; 14150d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 14160d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1417921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 14180d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 14190d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14200d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 1421cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie alu.src[2].chan = i; 14220d48925a56ad4fb253386110b545abda82a25464Dave Airlie 14230d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 14240d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 14250d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 14260d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 14270d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 14280d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 14290d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 14300d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 14310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1432cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1433cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1434cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1435cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1436cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 14379961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 14389961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 14399961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1440cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1441cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1442cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP); 14446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1445cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1447cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1448cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1449cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1450cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1451cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1452cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1453cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1454cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1455cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1456cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1457cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1458cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1459cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1460cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1461cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1462cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 14717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1483cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1492cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1493cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1494cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1495cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1496cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1497cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1499cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1500cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1501cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 15027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 15037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 15047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1508cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 15097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 15107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1512cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1513cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1514cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1515cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1516cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1517cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1518cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1519921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1520cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1521cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1522cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1523cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1524cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1525921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1526cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1527cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1528cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1529e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1530e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1531e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1532e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1533e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1534e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1535e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1536cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1537cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 154933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 155033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 155133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 155233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1553641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1554641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1555b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1556bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int opcode; 1557bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY; 1558bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie uint32_t lit_vals[4]; 1559641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1560641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1561641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1562b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1563b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1564b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1565a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1566bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1567bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1568bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1569bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1570b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1571b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1572b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1573b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1574b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1575b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1576b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1577b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1578b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie 1579b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1580b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1581a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1582b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1583b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1584bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1585bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1586bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1587b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1588b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1589b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1590b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1591b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1592b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1593b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1594b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1595b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1596a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1597921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1598b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1599b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1600b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1601b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1602b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1603b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1604b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1605b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 160607b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1607b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1608bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1609bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1610bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1611bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie int src_chan, src2_chan; 1612bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1613bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */ 1614bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie for (i = 0; i < 4; i++) { 1615bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1616a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE); 1617bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie switch (i) { 1618bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 0: 1619bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1620bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 1; 1621bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1622bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 1: 1623bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 2; 1624bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 0; 1625bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1626bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 2: 1627bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 0; 1628bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1629bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 1630bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie case 3: 1631bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_chan = 1; 1632bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src2_chan = 2; 1633bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie break; 163484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee default: 163584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee assert(0); 163684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src_chan = 0; 163784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee src2_chan = 0; 163884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee break; 1639bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1640bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1641bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1642bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1643bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan); 1644bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 1645bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1646bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1647bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan); 1648bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1649bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = i; 1650bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (i == 3) 1651bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1652bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1653bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1654bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1655bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1656bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1657bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1658bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* tmp1.z = RCP_e(|tmp1.z|) */ 1659bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1660a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 1661bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1662bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 2; 1663bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].abs = 1; 1664bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1665bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 2; 1666bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1667bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1668bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1669bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1670bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1671bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1672bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* MULADD R0.x, R0.x, PS1, (0x3FC00000, 1.5f).x 1673bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * MULADD R0.y, R0.y, PS1, (0x3FC00000, 1.5f).x 1674bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie * muladd has no writemask, have to use another temp 1675bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie */ 1676bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1677a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1678bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1679bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1680bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1681bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 0; 1682bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1683bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1684bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1685bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1686bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1687bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1689bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 0; 1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1691bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1692bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1693bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1694bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1695bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.is_op3 = 1; 1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].sel = ctx->temp_reg; 1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[0].chan = 1; 1702bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].sel = ctx->temp_reg; 1703bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[1].chan = 2; 1704bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1705bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 1706bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.src[2].chan = 0; 1707bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1708bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.sel = ctx->temp_reg; 1709bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.chan = 1; 1710bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.dst.write = 1; 1711bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1712bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie alu.last = 1; 1713bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1715bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1717bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie lit_vals[0] = fui(1.5f); 1718bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1719bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 1720bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1721bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 172207b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson src_not_temp = FALSE; 1723bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie src_gpr = ctx->temp_reg; 1724bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1726bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (src_not_temp) { 1727b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1728b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1729a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1736b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1738b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1739b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1740b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1741b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1742b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = ctx->inst_info->r600_opcode; 1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (opcode == SQ_TEX_INST_SAMPLE && 1746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)) 1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie opcode = SQ_TEX_INST_SAMPLE_C; 174833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 174933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.inst = opcode; 175133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 175233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1753641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 17546c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 175533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 175633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 175733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 175833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 175933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 176033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 176133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 176233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 17639a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) { 1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_x = 1; 1766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_y = 0; 1767bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_z = 3; 1768bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie tex.src_sel_w = 1; 1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie } 1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 177101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 177201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 177301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 17747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 177501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 177601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) 17795d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie tex.src_sel_w = 2; 1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie r = r600_bc_add_tex(ctx->bc, &tex); 1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie if (r) 1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return r; 1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie /* add shadow ambient support - gallium doesn't do it yet */ 1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie return 0; 1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie 178833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 178933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1790b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1791b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1792b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 17937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1794b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1795b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1796b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1797b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 17987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 17997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 18007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1801b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1802b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1803b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD); 1805921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1806b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 18077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 18087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1809b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1810b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1811b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1812b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1813b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1814b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1815b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1816b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1817b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1818b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1819b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1820b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1821b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1822b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1823b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1824b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1825b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1826b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1827a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 1828b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1829b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 18307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 18317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1832b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1833b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1834b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1835b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1836b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1837b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1838b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1839b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1840b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1841b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1842b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1843b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1844b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1845b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1846b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1847b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1848b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1849a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 1850b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 18517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 18527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 18537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 18547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1855b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1856b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1857b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1858b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1859b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1860b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1861b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1862b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1863b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1864b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1865b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1866b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1867b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1868b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 186987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 187087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 187187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 187287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 187387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 187487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 187587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 187687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 187787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 187887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 187987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 188087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 188187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 188287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 188387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 188487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 188587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1886a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE); 188787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 188887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 188987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 189087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 189187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 189287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 189387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 189487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 189587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 189687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 189787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 189887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 189987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 190087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 190187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 190287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 190387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 190487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 190587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 190687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 190787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 190887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 190987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 191087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 191187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 191287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 191387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 191487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 191587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 191687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 19170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 19180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 19190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 19200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 19210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 19220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 19230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 19240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 19260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 19270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 19290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 19300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 19310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 19330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1934a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 19350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 19370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 19380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 19390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 19400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 19420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 19430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 19450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 19460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 19480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 19490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 19500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 19510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 19530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 19540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 19550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 19560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 19580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 19590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 19610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 19620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 19640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 19650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 19660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 19670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 19690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 19700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 19710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 19730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 19740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 19750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 19760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 19771e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 19781e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 19791e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 19801e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 19810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 19820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 19840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1985a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD); 19860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 19870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 19880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 19890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 19900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 19910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 19930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 19940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 19960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 19970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 19980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 19990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 20000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 20010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 20040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 20050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 20060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 20070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 20090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 20100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 20120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 20130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 20140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 20150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 20160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 20170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 20200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 20210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 20220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 20230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 20240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 20250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 20260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 20270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 20310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 20320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 20330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 20340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 20350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 20360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 20370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 20381e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck 20391e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 20401e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck if (r) 20411e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck return r; 20420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 20430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 20440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 20450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 20460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 20470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 204836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 204936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 205036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 205136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 205236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 205309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 205436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 205536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 205636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 205736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 205836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2059a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 206036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 206136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 206236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 206336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 206436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 206536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 206636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 206736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 206836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 206936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 207036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 207136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 207236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 207336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 20745ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 20755ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 20765ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 20775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 2078a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 207936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 208036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 208136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 208236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 208336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 208436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 208536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 208636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 208736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 208836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 20895ea238b7991331c854e66a16911d616d36965dc9Dave Airlie 20905ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 20915ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 20925ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 209336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 209436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 209536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 209636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 209736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 209836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2099a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT); 210036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 210136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 210236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 210336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 210436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 210536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 210636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 210736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 210836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 210936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 211036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 211136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 211236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 211336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 211436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 211536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 211636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 211736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 21185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 21195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 21205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 212136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 212236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 212336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 212436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 212536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2126a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 212736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 212836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 212936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 213036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 213136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 213236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 213336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 213436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 213536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 213636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 213736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 213836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 213936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 214036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 21415ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 21425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 21435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 214436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 214536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 214636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 214736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 214836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 214936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 215136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 215236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 215336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 215436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 215536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 215636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 215736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 215836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 215936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 216036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 21615ea238b7991331c854e66a16911d616d36965dc9Dave Airlie r = r600_bc_add_literal(ctx->bc, ctx->value); 21625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie if (r) 21635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie return r; 216436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 216536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 216636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 216787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 2168460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx) 2169460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{ 2170460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 2171460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck struct r600_bc_alu alu; 2172460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck int r; 2173460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2174460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.x = floor(log2(src)); */ 2175460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (inst->Dst[0].Register.WriteMask & 1) { 2176460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2177460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2178460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2179460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2180460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2181460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2182460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2183460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2184460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2185460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2186460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2187460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2188460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2189460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2190460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2191460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2192460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2193460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2194460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2195460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2196460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2197460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 2198460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 2199460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2200460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2201460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2202460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 0; 2203460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2204460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2205460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2206460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2207460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2208460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2209460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2210460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2211460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2212460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2213460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2214460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 221596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck /* result.y = src.x / (2 ^ floor(log2(src.x))); */ 2216460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 2217460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2218460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 221996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 222096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 222196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 222296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 222396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 222496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 222596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 222696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 222796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 222896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 222996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 223096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 223196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 223296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 223396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 223496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 223596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 223696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 223796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 223896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 223996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 224096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 224196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR); 224296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 224396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 224496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 224596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 224696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 224796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 224896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 224996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 225096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 225196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 225296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 225396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 225496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 225596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 225696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 225796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 225896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 225996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 226096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE); 226196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 226296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 226396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 226496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 226596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 226696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 226796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 226896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 226996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 227096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 227196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 227296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 227496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 227596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 227696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 227896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 227996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE); 228096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].sel = ctx->temp_reg; 228196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = 1; 228296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 228396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.sel = ctx->temp_reg; 228496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.chan = 1; 228596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.dst.write = 1; 228696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.last = 1; 228796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 228896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 228996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 229096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 229196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 229296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 229396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 229496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 229596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 229696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 229796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 229896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 229996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 230196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck if (r) 230296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck return r; 230396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 230596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck 230696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].sel = ctx->temp_reg; 230796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck alu.src[1].chan = 1; 2308460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2309460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2310460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 1; 2311460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.z = log2(src);*/ 2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 2) & 1) { 2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE); 2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 2; 2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck /* result.w = 1.0; */ 2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if ((inst->Dst[0].Register.WriteMask >> 3) & 1) { 2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck memset(&alu, 0, sizeof(struct r600_bc_alu)); 2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV); 2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].sel = V_SQ_ALU_SRC_1; 2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.src[0].chan = 0; 2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.sel = ctx->temp_reg; 2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.chan = 3; 2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.dst.write = 1; 2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck alu.last = 1; 2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_alu(ctx->bc, &alu); 2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck r = r600_bc_add_literal(ctx->bc, ctx->value); 2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck if (r) 2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return r; 2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck } 2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck return tgsi_helper_copy(ctx, inst); 2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck} 2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck 237350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */ 237447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx) 237547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{ 237647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie /* TODO from r600c, ar values don't persist between clauses */ 237747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 237847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie struct r600_bc_alu alu; 237947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie int r; 238047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 238147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 238247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR; 238347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 238447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 238547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 238647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 238747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 238847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 238947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie alu.last = 1; 239047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 2391a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU)); 239247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie if (r) 239347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return r; 2394c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie ctx->bc->cf_last->r6xx_uses_waterfall = 1; 239547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie return 0; 239647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie} 239747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie 239857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx) 239957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{ 240057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 240157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie struct r600_bc_alu alu; 240257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie int i, r = 0; 240357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 240457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie for (i = 0; i < 4; i++) { 240557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 240657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2407a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL); 240857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 240957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 241057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 241157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 241257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 3) { 241357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 241457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 241557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 241657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 241757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 241857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 241957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 242057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 242157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 0 || i == 2) { 242257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_1; 242357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } else { 242457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]); 242557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 242657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 242757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 242857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 242957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (i == 3) 243057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie alu.last = 1; 243157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 243257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie if (r) 243357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return r; 243457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie } 243557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie return 0; 243657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie} 243757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie 2438a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 2439a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2440a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 244109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 2442a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 2443a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2444a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 2445a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 2446a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 2447a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2448a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 2449a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 2450a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 2451a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2452a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 2453a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2454a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2455a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 2456a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 2457a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 2458a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2459a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 2460a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2461a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE)); 2462a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 2463a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 2464a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2465a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2466a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2467a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 2468a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP)); 2470a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 2471a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2472a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2473a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 247409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 2475a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 247609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 247709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 247809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 247909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 248009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 248109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 248209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 248309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 248409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 248509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 248609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 248709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 248809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 248909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2490a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 249109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 249309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 249409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 249509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 249609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 249709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 249809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 249909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 250009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 250109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 2502a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee default: 2503a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee assert(0); 2504a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee diff = 0; 250509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 250609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 250709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 250809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 250909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 251009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 251109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 251209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 251309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 251409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 251509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 251609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 251709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 251809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 251909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 252009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 252109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 252209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 252309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 252409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 252509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 252609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 252709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 252809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 252909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 253009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 253109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 253209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 253309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 253409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 253509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 253609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 253709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 253809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 253909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 254009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2542a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 254309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 254409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2545a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 254609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 254709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 254809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 254909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 255009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 255109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 255209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 255309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 255409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 255509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 255609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 255709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 255809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 255909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 256009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 256109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 256209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 256309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 256409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 256509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 256609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 256709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 256809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 256909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 257009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 257109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 257209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2573a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 257409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 257509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 257609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 257709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 2578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 257909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 258009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 258109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 258209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 258309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 258509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 258609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 258709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 258809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 258909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 259009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 259109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 259209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 259309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 259409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 259509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 259609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 259709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 259809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 260009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 260109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 260309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 260509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 260609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 260709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 260809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 260909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 261009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 261109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 261209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2613a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE)); 261409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2615a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP)); 261609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 261809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 2620a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2621a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2622a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2623a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 2624a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2625a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE)); 2626a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 2627a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 2629a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 2630a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2631a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2632a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2633a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 2634a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 2635a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 2636a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 2637a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 2638a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 2639a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 2640a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2641a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 2642a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 2643a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 2644a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 264509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 2646a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 264709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 265309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 2655a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL)); 265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 2658a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 2668a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END)); 266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 268809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 269009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2715a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2716a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2717a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 271947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl}, 2720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 27210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 2722df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 2723df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck /* FIXME: 2724df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * For state trackers other than OpenGL, we'll want to use 2725df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck * _RECIP_IEEE instead. 2726df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck */ 2727df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate}, 2728df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck 272942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq}, 273036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2731460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log}, 2732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 273657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 2737dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2739d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2740be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2743b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27513af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27533af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 27564558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2757a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 27580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2763e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 276488f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 27653af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 27663af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 27674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 2768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27730d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27750d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 277688f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 27780d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2780b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2782b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 27930d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 279487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 279592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 2796d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 28164558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2849094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 288150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 288250526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = { 288350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 288450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 288550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 288650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 288750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RSQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 288850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EXP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 288950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LOG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 289050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 289150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 289250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP3, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 289350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 289450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst}, 289550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 289650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 289750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 289850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 289950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MAD, 1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 290050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 290150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LRP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 290250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 290350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 290450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {20, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 290550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2A, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 290650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 290750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {22, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 290850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {23, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 290950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FRC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 291050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CLAMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 291150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_FLR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 291250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ROUND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 291350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EX2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 291450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LG2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 291550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POW, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 291650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XPD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 291750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 291850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {32, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 291950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ABS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 292050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RCC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 292150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DPH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 292250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_COS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 292350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 292450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 292550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KILP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* predicated kill */ 292650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 292750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 292850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 292950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PK4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 293050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 293150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 293250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SFL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 293350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SGT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 293450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 293550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SLE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 293650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 293750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_STR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 293850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 293950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 294150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2H, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP2US, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4B, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UP4UB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_X2D, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ARR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 294950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CAL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_RET, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SSG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 295250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CMP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 295350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SCS, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs}, 295450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 295550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DP2, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 295850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 295950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BRK, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 296050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 296150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 296250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {75, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 296350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {76, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 296450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ELSE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 296550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDIF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 296650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 296750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {79, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 296850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {80, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 296950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_PUSHA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_POPA, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CEIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_I2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TRUNC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 297550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SHL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 297750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {88, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_AND, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 297950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_OR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_MOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_XOR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXF, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_TXQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CONT, 0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 298650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_EMIT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDPRIM, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 298850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 298950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BGNSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 299150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSUB, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 299350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {103, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {104, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {105, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {106, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NOP, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 299850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 299950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {108, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {109, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {110, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {111, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_NRM4, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CALLNZ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IFC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_BREAKC, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 300750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_KIL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 300850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_END, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 300950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie /* gap */ 301050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {118, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2I, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_IMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_INEG, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ISLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 301950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_F2U, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_U2F, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UADD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UDIV, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMAX, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMIN, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMOD, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_UMUL, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USEQ, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USGE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USHR, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USLT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_USNE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_SWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie {TGSI_OPCODE_LAST, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}; 3039