r600_shader.c revision 0e6a02d29915db2ca460206656ab517ddaf0b455
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" 3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h" 34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h> 35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h> 36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction; 392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx { 412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_shader_info info; 422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct tgsi_parse_context parse; 432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse const struct tgsi_token *tokens; 442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned type; 452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned file_offset[TGSI_FILE_COUNT]; 462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned temp_reg; 472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader_tgsi_instruction *inst_info; 482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_bc *bc; 492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse struct r600_shader *shader; 502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse u32 value[4]; 512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[]; 61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx, 1026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rpshader, 1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct tgsi_token *tokens) 104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 10836efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 10936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0); 110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return -ENOMEM; 112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 12336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 12672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader) 12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 129ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 132313df4156279f84ebc5b98a7540820b994762650Jerome Glisse unsigned i, tmp; 13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1346e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1356e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER); 1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1376e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse return -ENOMEM; 138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 10; i++) { 139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0; 140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1416c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse /* so far never got proper semantic id from tgsi */ 1426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse for (i = 0; i < 32; i++) { 1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = i << ((i & 3) * 8); 1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp; 145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2); 147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 1486e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 1496e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1506e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 2; 1526e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 153ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse rpshader->rstate->placement[2] = RADEON_GEM_DOMAIN_GTT; 15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 15672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader) 15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 159457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse const struct pipe_rasterizer_state *rasterizer; 160ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 162457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse struct r600_context *rctx = r600_context(ctx); 16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 1645f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie unsigned i, tmp, exports_ps, num_cout; 16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 166457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse rasterizer = &rctx->rasterizer->state.rasterizer; 1676e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1686e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER); 1696e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1706e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse return -ENOMEM; 17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse for (i = 0; i < rshader->ninput; i++) { 1726c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = S_028644_SEMANTIC(i); 17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_SEL_CENTROID(1); 17435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 17535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) { 17635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 17735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse } 178457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (rasterizer->sprite_coord_enable & (1 << i)) { 179457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 180457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp; 18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1835f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie 1845f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps = 0; 1855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout = 0; 1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie for (i = 0; i < rshader->noutput; i++) { 1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= 1; 1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= (1 << (num_cout+1)); 1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout++; 1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 1935f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 194bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse if (!exports_ps) { 195bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse /* always at least export 1 component per pixel */ 196bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse exports_ps = 2; 197bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse } 19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) | 19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000; 201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr); 2025f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps; 2036e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 2046e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 2056e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 1; 2066e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 20772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 20872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 212ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 213ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 22472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 23572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 23872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 23972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 24872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 25672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 27172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 275c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 27972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Src[j].Register.Indirect || 282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Dimension || 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported src (indirect|dimension|absolute)\n"); 285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) { 290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported dst (indirect|dimension)\n"); 291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 29572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 29672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 29872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 30372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 30935e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 33635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 34033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 34772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 353c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 354457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 35772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 370076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 371076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 372076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 373076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 375076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 376076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 377076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 4082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[0] = immediate->u[0].Uint; 4092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[1] = immediate->u[1].Uint; 4102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[2] = immediate->u[2].Uint; 4112b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse ctx.value[3] = immediate->u[3].Uint; 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 4272b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 438457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 439457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 440c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 441c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 442c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 443c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 444c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 445c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 446c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 447c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 448c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 449c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 450c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 451457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 454c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 455c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 457457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 458457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 459457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 460457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 461457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 462457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 463457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 468b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 4705f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 471c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 472c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 48372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 491457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 494457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 495457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 496457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 502457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 503457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 504457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 505457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 507c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 508481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 509481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 510481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 511481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 512481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 513481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 514481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 515481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 516481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 517481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 518608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 519481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 520481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 521481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 522481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 524457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 525457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 526457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 527457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 528b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 529b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 530c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE; 531c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 532c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 533457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 534457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 535c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5661bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 5777a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 5827a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 5837a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 5847a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) { 6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = r600_src[0].sel; 6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.sel = ctx->temp_reg + j; 6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r600_src[0].sel = ctx->temp_reg + j; 6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx) 643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 6566c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 6727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 6737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 6747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 68888f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 68988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 69088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 69188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 69288f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 69388f5976484842671ecb2cefcfa91838a43032359Dave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 69488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 69588f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 69688f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct r600_bc_alu_src r600_src[3]; 69788f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct r600_bc_alu alu; 69888f5976484842671ecb2cefcfa91838a43032359Dave Airlie int i, r; 69988f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 70088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 70188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 70288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 70388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 70488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 70588f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 70688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 70788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 70888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 70988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 71088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 71188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 71288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 71388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 71488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 71588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 71688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 71788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 71888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 719921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 72088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 721921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 72288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 72388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 72488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 72588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 72688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 72788f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 72888f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 72988f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 73088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 73188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 73288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT; 73388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 73488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 73588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 73688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 74088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 74288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 74388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 74688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 74888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 74988f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 75488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 75588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 75688f5976484842671ecb2cefcfa91838a43032359Dave Airlie 75788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 75888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 76388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 764921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 766921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 76888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 77388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 77588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 78688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = i; 79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (i == 3) 80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 808094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 809094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 810094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 811094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 812094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 813094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 814094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 815094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 816094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 817094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 818921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 820094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 821094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 823094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 824094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 825094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 826094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 827094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 828094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 829094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 830094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 831094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 832094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx) 834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r; 839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 8476c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 8507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 8517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[1]; 8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 86672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 8680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 8690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 8700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 8720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 8730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 877921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX; 8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 893921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], 0); 8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.z = NOP - fill Z slot */ 9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = 2; 9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 914921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 9260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 9276a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 9286a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 9296a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 9300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 9310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED; 9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 9340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 9370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 9380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9456a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 9466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 9470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 9490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT; 9517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 9520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 9550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 9560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 9577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]); 9580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 9610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 9620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 9630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 9710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 9730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 9740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 9750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 9760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 9830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 9840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 9850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9865cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 9875cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 9885cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 9895cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 9905cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 9915cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 9925cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 9935cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9945cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 9955cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 9965cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 9985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 9995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 10015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 10045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 10065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 10085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 10125cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 10135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 1014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 10157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 10167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1018a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 10197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 10207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 10217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 10227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 10237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 10247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 10257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 10307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 10317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 10357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 10367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 10377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1038a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1039a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1040a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1041a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1042a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1043a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1044a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1045a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1046a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1047a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1048a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1049a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1050a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1051a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1052a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1053a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1054a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1055a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1056a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1057a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1058a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1059a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1060a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1061a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1063a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE; 1071a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1072a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1073a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1077a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1081a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1083a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE; 1084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1088a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1092a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1093a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1094a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1095a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 1098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1104a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1105a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1106a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1107a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 11080d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 11090d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 11100d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11110d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 11120d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1113921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 11140d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11150d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 11160d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11170d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11180d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11190d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 11200d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 11210d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11220d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT; 11230d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 11240d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 11250d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.write = 1; 11260d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11270d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 11280d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 11290d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1130921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 11310d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11320d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 11330d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 11340d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 11350d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 11360d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11370d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11380d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11390d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 11400d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11410d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 11420d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 11430d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11440d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT; 11450d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 11460d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11470d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11480d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11490d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11500d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 11510d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 11520d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1153921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 11540d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 11550d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11560d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 11570d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11580d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.write = 1; 11590d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 11600d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 11610d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11620d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11630d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11640d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 11650d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 11660d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 11670d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1168cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1169cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1170cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1171cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1172cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 11739961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 11749961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 11759961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1176cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1177cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1178cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1179cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 11806c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1181cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1182cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1183cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1185cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1186cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1187cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1188cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1189cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1190cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1191cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1192cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1193cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1194cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1195cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1196cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1197cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1198cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 12067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 12077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 12157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1219cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1229cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1230cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1231cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1232cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1235cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1236cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1237cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 12387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 12397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1243cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1244cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 12467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1247cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1248cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1251cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1252cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1253cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1254cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1255921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1256cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1257cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1258cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1259cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1260cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1261921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1262cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1263cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1264cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1265cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1266cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1275cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 127833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 127933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 128033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 128133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1282641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1283641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1284b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1285641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1286641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1287641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1288b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1289b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1291b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 1292b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1293b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1294b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1299b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1300b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie 1302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1303b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1306b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1307b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].sel = src_gpr; 1308b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1313b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1314b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1318921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1321b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1322b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1323b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1324b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1325b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1326b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1327b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1328b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) { 1329b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1330b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1331b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1332b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1333b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1334b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1335b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1336b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1337b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1338b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1339b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1340b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1341b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1342b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1343b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1344b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 134533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 134633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 134733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.inst = ctx->inst_info->r600_opcode; 134833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 134933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1350641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 13516c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 135233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 135333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 135433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 135533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 135633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 135733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 135833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 135933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 13609a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 136101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 136201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 136301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 13647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 136501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 136601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 136733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse return r600_bc_add_tex(ctx->bc, &tex); 136833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 136933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1370b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1371b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1372b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1374b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1375b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1376b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1377b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 13787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 13807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1381b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1382b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1383b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1384b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD; 1385921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 13877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1389b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1390b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1391b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1392b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1393b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1394b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1395b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1396b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1399b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1401b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1402b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1406b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1412b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1413b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1414b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1416b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1417b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1419b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1420b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1426b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 1430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 14317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 14327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 14337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 14347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1436b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1437b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1438b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1440b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1441b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1442b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1443b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1444b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1445b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1446b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1448b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 144987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 145087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 145187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 145287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 145387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 145487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 145587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 145687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 145787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 145887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 145987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 146087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 146187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 146287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 146387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 146487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 146587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 146687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE; 146787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 146887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 146987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 147087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 147187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 147287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 147387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 147487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 147587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 147687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 147787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 147887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 147987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 148087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 148187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 148287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 148387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 148487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 148587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 148687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 148787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 148887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 148987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 149087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 149187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 149287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 149387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 149487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 149587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 149687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 14970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 14980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 14990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 15010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 15020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 15030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 15040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 15060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 15070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 15090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 15100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 15110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 15130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 15150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 15170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 15200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 15230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 15260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 15290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 15300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 15330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 15360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 15390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 15420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 15450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 15460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 15490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 15500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 15510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 15530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 15540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 15560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 15570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 15600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 15620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 15640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 15670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 15700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 15730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 15760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 15770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 15800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 15830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 15860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 15890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 15920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 15930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 15960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 15970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 15980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 16000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 16010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 16020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 16040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 16050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 16070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 16080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 16090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 16100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 16110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 16130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 16140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 16160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 16170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 16180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 16190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 162087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 16240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 16267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1634dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 1635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 1636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt}, 1637be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 1639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 1640b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 1641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16483af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 1649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16503af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 16534558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 1654a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 16550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 1656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16587a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 166188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 16623af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 16633af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 1664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* predicated kill */ 1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16700d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16720d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 167388f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 1674be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_slt}, 16750d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1677b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 1678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1679b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 16900d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 169187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1693d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRK, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 17134558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CONT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1746094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 1777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 1778