r600_shader.c revision 09547e1bcee7df3444dd8682770d1b31da1a5822
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]; 51cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 *literals; 52cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen u32 nliterals; 532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction { 562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned tgsi_opcode; 572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned is_op3; 582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse unsigned r600_opcode; 592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse int (*process)(struct r600_shader_ctx *ctx); 602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse}; 612b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse 622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[]; 63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader); 64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader) 66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct util_format_description *desc; 69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse enum pipe_format resource_format[160]; 70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i, nresources = 0; 71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc *bc = &shader->bc; 72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_cf *cf; 73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx *vtx; 74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->processor_type != TGSI_PROCESSOR_VERTEX) 76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < rctx->vertex_elements->count; i++) { 78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format; 79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) { 81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (cf->inst) { 82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX: 83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC: 84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) { 85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse desc = util_format_description(resource_format[vtx->buffer_id]); 86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (desc == NULL) { 87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]); 88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_x = desc->swizzle[0]; 91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_y = desc->swizzle[1]; 92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_z = desc->swizzle[2]; 93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx->dst_sel_w = desc->swizzle[3]; 94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_bc_build(&shader->bc); 101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx, 1046f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rpshader, 1056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct tgsi_token *tokens) 106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_screen *rscreen = r600_screen(ctx->screen); 108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 11036efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n"); 11136efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0); 112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rpshader == NULL) 1136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return -ENOMEM; 114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->shader.family = radeon_get_family(rscreen->rw); 115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_from_tgsi(tokens, &rpshader->shader); 116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("translation from TGSI failed !\n"); 1186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_build(&rpshader->shader.bc); 121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) { 122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("building bytecode failed !\n"); 1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return r; 124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 12536efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n"); 1266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1296f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader) 13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 131ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 134313df4156279f84ebc5b98a7540820b994762650Jerome Glisse unsigned i, tmp; 13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1372184f3ec3059eaf8a9a2b04c995162543f000862Dave Airlie state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER); 1386e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1396e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse return -ENOMEM; 140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 10; i++) { 141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0; 142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse /* so far never got proper semantic id from tgsi */ 1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse for (i = 0; i < 32; i++) { 1456c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = i << ((i & 3) * 8); 1466c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp; 147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2); 149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr) | 150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie S_028868_STACK_SIZE(rshader->bc.nstack); 1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 1526e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1536e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo); 1546e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 2; 1556e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 156ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse rpshader->rstate->placement[2] = RADEON_GEM_DOMAIN_GTT; 15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader) 16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 162457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse const struct pipe_rasterizer_state *rasterizer; 163ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 165457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse struct r600_context *rctx = r600_context(ctx); 16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct radeon_state *state; 1675f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie unsigned i, tmp, exports_ps, num_cout; 16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 169457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse rasterizer = &rctx->rasterizer->state.rasterizer; 1706e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = radeon_state_decref(rpshader->rstate); 1712184f3ec3059eaf8a9a2b04c995162543f000862Dave Airlie state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER); 1726e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse if (state == NULL) 1736e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse return -ENOMEM; 17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse for (i = 0; i < rshader->ninput; i++) { 1756c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tmp = S_028644_SEMANTIC(i); 17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse tmp |= S_028644_SEL_CENTROID(1); 17735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || 17835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) { 17935e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse tmp |= S_028644_FLAT_SHADE(rshader->flat_shade); 18035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse } 181457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (rasterizer->sprite_coord_enable & (1 << i)) { 182457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse tmp |= S_028644_PT_SPRITE_TEX(1); 183457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp; 18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie 1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps = 0; 1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout = 0; 1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie for (i = 0; i < rshader->noutput; i++) { 1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= 1; 1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 1935f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie exports_ps |= (1 << (num_cout+1)); 1945f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie num_cout++; 1955f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 1965f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } 197bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse if (!exports_ps) { 198bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse /* always at least export 1 component per pixel */ 199bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse exports_ps = 2; 200bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse } 20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) | 20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse S_0286CC_PERSP_GRADIENT_ENA(1); 20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000; 204a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr) | 205a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie S_028868_STACK_SIZE(rshader->bc.nstack); 2065f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps; 2076e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate = state; 2086e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo); 2096e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->nbo = 1; 2106e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT; 21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return radeon_state_pm4(state); 21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader) 21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 216ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_screen *rscreen = r600_screen(ctx->screen); 217ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák struct r600_context *rctx = r600_context(ctx); 21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse struct r600_shader *rshader = &rpshader->shader; 21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* copy new shader */ 22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_decref(rscreen->rw, rpshader->bo); 22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rpshader->bo = NULL; 224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4, 22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 4096, NULL); 22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader->bo == NULL) { 22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return -ENOMEM; 22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_map(rscreen->rw, rpshader->bo); 230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4); 23172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse radeon_bo_unmap(rscreen->rw, rpshader->bo); 23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* build state */ 23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse rshader->flat_shade = rctx->flat_shade; 234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (rshader->processor_type) { 235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_vs(ctx, rpshader); 23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 23972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = r600_pipe_shader_ps(ctx, rpshader); 24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse default: 24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse r = -EINVAL; 24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse break; 24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return r; 24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 2486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader) 24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_context *rctx = r600_context(ctx); 25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse int r; 25272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 25372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse if (rpshader == NULL) 254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* there should be enough input */ 256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) { 257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d resources provided, expecting %d\n", 258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse rctx->vertex_elements->count, rpshader->shader.bc.nresource); 259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 26072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_shader_update(ctx, &rpshader->shader); 262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r600_pipe_shader(ctx, rpshader); 265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx) 268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction; 270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int j; 271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.NumDstRegs > 1) { 273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs); 274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 27572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Predicate) { 277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("predicate unsupported\n"); 278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 279c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse } 280a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0 281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Instruction.Label) { 282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("label unsupported\n"); 283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 28472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 285a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif 286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumSrcRegs; j++) { 287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Src[j].Register.Indirect || 288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Dimension || 289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i->Src[j].Register.Absolute) { 290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported src (indirect|dimension|absolute)\n"); 291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < i->Instruction.NumDstRegs; j++) { 295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) { 296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported dst (indirect|dimension)\n"); 297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 30172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 30272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx) 30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; 306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_vtx vtx; 307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned i; 308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int r; 30972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (d->Declaration.File) { 311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_INPUT: 312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->ninput++; 313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].name = d->Semantic.Name; 314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].sid = d->Semantic.Index; 31535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->input[i].interpolate = d->Declaration.Interpolate; 316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i; 317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx->type == TGSI_PROCESSOR_VERTEX) { 318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* turn input into fetch */ 319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&vtx, 0, sizeof(struct r600_bc_vtx)); 320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.inst = 0; 321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.fetch_type = 0; 322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.buffer_id = i; 323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register containing the index into the buffer */ 324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_gpr = 0; 325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.src_sel_x = 0; 326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.mega_fetch_count = 0x1F; 327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_gpr = ctx->shader->input[i].gpr; 328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_x = 0; 329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_y = 1; 330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_z = 2; 331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse vtx.dst_sel_w = 3; 332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_vtx(ctx->bc, &vtx); 333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_OUTPUT: 338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse i = ctx->shader->noutput++; 339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].name = d->Semantic.Name; 340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].sid = d->Semantic.Index; 341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i; 34235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse ctx->shader->output[i].interpolate = d->Declaration.Interpolate; 343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_CONSTANT: 345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_FILE_TEMPORARY: 34633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse case TGSI_FILE_SAMPLER: 347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported file %d declaration\n", d->Declaration.File); 350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 35372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 35472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader) 35672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_immediate *immediate; 358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_shader_ctx ctx; 359c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse struct r600_bc_output output[32]; 360457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse unsigned output_done, noutput; 361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned opcode; 362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, r = 0, pos0; 36372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.bc = &shader->bc; 365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.shader = shader; 366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_init(ctx.bc, shader->family); 367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.tokens = tokens; 370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_scan_shader(tokens, &ctx.info); 371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_init(&ctx.parse, tokens); 372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.type = ctx.parse.FullHeader.Processor.Processor; 373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse shader->processor_type = ctx.type; 374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* register allocations */ 376076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher /* Values [0,127] correspond to GPR[0..127]. 377076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [128,159] correspond to constant buffer bank 0 378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [160,191] correspond to constant buffer bank 1 379076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * Values [256,511] correspond to cfile constants c[0..255]. 380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * Other special values are shown in the list below. 381076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 244 ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+) 382076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 245 ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+) 383076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 246 ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+) 384076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher * 247 ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+) 385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 248 SQ_ALU_SRC_0: special constant 0.0. 386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 249 SQ_ALU_SRC_1: special constant 1.0 float. 387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 250 SQ_ALU_SRC_1_INT: special constant 1 integer. 388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 251 SQ_ALU_SRC_M_1_INT: special constant -1 integer. 389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 252 SQ_ALU_SRC_0_5: special constant 0.5 float. 390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 253 SQ_ALU_SRC_LITERAL: literal constant. 391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 254 SQ_ALU_SRC_PV: previous vector result. 392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse * 255 SQ_ALU_SRC_PS: previous scalar result. 393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse */ 394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < TGSI_FILE_COUNT; i++) { 395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[i] = 0; 396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_INPUT] = 1; 399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] + 401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_INPUT]; 402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] + 403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_OUTPUT]; 404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_CONSTANT] = 256; 405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253; 406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] + 407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.info.file_count[TGSI_FILE_TEMPORARY]; 408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 409cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals = 0; 410cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = NULL; 411cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen 412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse while (!tgsi_parse_end_of_tokens(&ctx.parse)) { 413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_token(&ctx.parse); 414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx.parse.FullToken.Token.Type) { 415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_IMMEDIATE: 416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse immediate = &ctx.parse.FullToken.FullImmediate; 417cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16); 418cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen if(ctx.literals == NULL) { 419cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen r = -ENOMEM; 420cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen goto out_err; 421cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen } 422cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint; 423cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint; 424cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint; 425cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint; 426cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx.nliterals++; 427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_DECLARATION: 429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_declaration(&ctx); 430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_TOKEN_TYPE_INSTRUCTION: 434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = tgsi_is_supported(&ctx); 435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode; 438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse ctx.inst_info = &r600_shader_tgsi_instruction[opcode]; 439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = ctx.inst_info->process(&ctx); 440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 4422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse r = r600_bc_add_literal(ctx.bc, ctx.value); 443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type); 448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* export output */ 453457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput = shader->noutput; 454457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 455c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 456c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].gpr = shader->output[i].gpr; 457c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].elem_size = 3; 458c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_x = 0; 459c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_y = 1; 460c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_z = 2; 461c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].swizzle_w = 3; 462c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].barrier = 1; 463c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 464c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = i - pos0; 465c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse switch (ctx.type) { 467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_VERTEX: 468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 60; 470c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* position doesn't count in array_base */ 472457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) { 475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 61; 476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS; 477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* position doesn't count in array_base */ 478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0++; 479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_PROCESSOR_FRAGMENT: 482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (shader->output[i].name == TGSI_SEMANTIC_COLOR) { 483b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output[i].array_base = shader->output[i].sid; 484c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 4855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie } else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) { 486c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].array_base = 61; 487c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } else { 489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported fragment output name %d\n", shader->output[i].name); 490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("unsupported processor type %d\n", ctx.type); 496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = -EINVAL; 497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 49872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add fake param output for vertex shader if no param is exported */ 501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (ctx.type == TGSI_PROCESSOR_VERTEX) { 502457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0, pos0 = 0; i < noutput; i++) { 503457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) { 504457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse pos0 = 1; 505457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse break; 506457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (!pos0) { 509457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse memset(&output[i], 0, sizeof(struct r600_bc_output)); 510457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].gpr = 0; 511457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].elem_size = 3; 512457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_x = 0; 513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_y = 1; 514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_z = 2; 515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].swizzle_w = 3; 516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].barrier = 1; 517457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM; 518457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].array_base = 0; 519457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 520457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse noutput++; 521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 522c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 523481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse /* add fake pixel export */ 524481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) { 525481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse memset(&output[0], 0, sizeof(struct r600_bc_output)); 526481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].gpr = 0; 527481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].elem_size = 3; 528481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_x = 7; 529481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_y = 7; 530481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_z = 7; 531481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].swizzle_w = 7; 532481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].barrier = 1; 533608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; 534481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].array_base = 0; 535481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT; 536481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse noutput++; 537481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse } 538457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* set export done on last export of each type */ 539457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = noutput - 1, output_done = 0; i >= 0; i--) { 540457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse if (i == (noutput - 1)) { 541457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse output[i].end_of_program = 1; 542457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse } 543b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse if (!(output_done & (1 << output[i].type))) { 544b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse output_done |= (1 << output[i].type); 545c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE; 546c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 547c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse } 548457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse /* add output to bytecode */ 549457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse for (i = 0; i < noutput; i++) { 550c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse r = r600_bc_add_output(ctx.bc, &output[i]); 551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse goto out_err; 553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 554cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err: 558cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen free(ctx.literals); 559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse tgsi_parse_free(&ctx.parse); 560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx) 564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode); 566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return -EINVAL; 567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx) 570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx, 575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_src_register *tgsi_src, 576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_src *r600_src) 577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 578cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen int index; 5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(r600_src, 0, sizeof(struct r600_bc_alu_src)); 580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = tgsi_src->Register.Index; 581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) { 582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel = 0; 583cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen index = tgsi_src->Register.Index; 584cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[0] = ctx->literals[index * 4 + 0]; 585cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[1] = ctx->literals[index * 4 + 1]; 586cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[2] = ctx->literals[index * 4 + 2]; 587cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen ctx->value[3] = ctx->literals[index * 4 + 3]; 588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 5891bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse r600_src->neg = tgsi_src->Register.Negate; 590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_src->sel += ctx->file_offset[tgsi_src->Register.File]; 591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx, 595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse const struct tgsi_full_dst_register *tgsi_dst, 596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse unsigned swizzle, 597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu_dst *r600_dst) 598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 5997a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6007a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse 601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel = tgsi_dst->Register.Index; 602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File]; 603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->chan = swizzle; 604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r600_dst->write = 1; 6057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse if (inst->Instruction.Saturate) { 6067a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse r600_dst->clamp = 1; 6077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse } 608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle) 6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse switch (swizzle) { 6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 0: 6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleX; 6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 1: 6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleY; 6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 2: 6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleZ; 6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse case 3: 6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return tgsi_src->Register.SwizzleW; 6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse default: 6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3]) 6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse int i, j, k, nconst, r; 6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) { 6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) { 6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse nconst++; 6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]); 6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) { 6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) { 6437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) { 6447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (k = 0; k < 4; k++) { 6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 6467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 6477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = r600_src[0].sel; 6487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = k; 6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.sel = ctx->temp_reg + j; 6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = k; 6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = 1; 6527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (k == 3) 6537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 6547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 6557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 6577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r600_src[0].sel = ctx->temp_reg + j; 6597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse j--; 6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 6627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 6637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 6647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 665d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap) 666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 6687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 671d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie int lasti = 0; 672d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < 4; i++) { 674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (inst->Dst[0].Register.WriteMask & (1 << i)) { 675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie lasti = i; 676d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 677d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } 678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 6797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 6807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 682d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie for (i = 0; i < lasti + 1; i++) { 683d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!(inst->Dst[0].Register.WriteMask & (1 << i))) 684d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie continue; 685d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 687d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 688d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (r) 689d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return r; 690d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 691d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 692d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (!swap) { 693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 6947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 6957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 697d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie } else { 698d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0] = r600_src[1]; 699d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[1], i); 700d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 701d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1] = r600_src[0]; 702d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* handle some special cases */ 705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse case TGSI_OPCODE_SUB: 707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.src[1].neg = 1; 708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 7097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse case TGSI_OPCODE_ABS: 7107a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse alu.src[0].abs = 1; 7117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse break; 712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse default: 713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse break; 714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 715d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie if (i == lasti) { 716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return 0; 723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 725d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx) 726d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 0); 728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx) 731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{ 732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie return tgsi_op2_s(ctx, 1); 733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie} 734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie 73588f5976484842671ecb2cefcfa91838a43032359Dave Airlie/* 73688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range 73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI 73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901 73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie */ 74088f5976484842671ecb2cefcfa91838a43032359Dave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx) 74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie{ 74288f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 74388f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct r600_bc_alu_src r600_src[3]; 74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie struct r600_bc_alu alu; 74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie int i, r; 74688f5976484842671ecb2cefcfa91838a43032359Dave Airlie uint32_t lit_vals[4]; 74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 74888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(lit_vals, 0, 4*4); 74988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_split_constant(ctx, r600_src); 75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0 /(3.1415926535 * 2)); 75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(0.5f); 75488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 75588f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 75688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 75788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 75888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 76388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0] = r600_src[0]; 76488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 766921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 768921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 77388f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 77588f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT; 78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 78688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie 79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (ctx->bc->chiprev == 0) { 79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(3.1415926535897f * 2.0f); 79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-3.1415926535897f); 79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie } else { 79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[0] = fui(1.0f); 79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie lit_vals[1] = fui(-0.5f); 79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie 80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.is_op3 = 1; 80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie 80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie 80888f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 81088f5976484842671ecb2cefcfa91838a43032359Dave Airlie 811921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_LITERAL; 81288f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[1].chan = 0; 813921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[2].sel = V_SQ_ALU_SRC_LITERAL; 81488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[2].chan = 1; 81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 81888f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 81988f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_literal(ctx->bc, lit_vals); 82088f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie 82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = ctx->inst_info->r600_opcode; 82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = 0; 82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.sel = ctx->temp_reg; 82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = 1; 82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie 82988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 83088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].chan = 0; 83188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 83288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 83388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 83488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 83588f5976484842671ecb2cefcfa91838a43032359Dave Airlie 83688f5976484842671ecb2cefcfa91838a43032359Dave Airlie /* replicate result */ 83788f5976484842671ecb2cefcfa91838a43032359Dave Airlie for (i = 0; i < 4; i++) { 83888f5976484842671ecb2cefcfa91838a43032359Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 83988f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.src[0].sel = ctx->temp_reg; 84088f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 84188f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.chan = i; 84288f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (i == 3) 84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie alu.last = 1; 84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie if (r) 85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie return r; 85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie } 85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie return 0; 85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie} 85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie 855094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx) 856094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{ 857094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 858094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse struct r600_bc_alu alu; 859094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse int i, r; 860094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 861094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse for (i = 0; i < 4; i++) { 862094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 863094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 864094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.dst.chan = i; 865921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_0; 8667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]); 867094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 868094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 870094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (i == 3) { 871094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse alu.last = 1; 872094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 873094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 874094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse if (r) 875094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return r; 876094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse } 877094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse return 0; 878094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse} 879094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse 8800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx) 8810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{ 8820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 8830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid struct r600_bc_alu alu; 8840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid int r; 8850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.x, <- 1.0 */ 8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 889921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; /*1.0*/ 8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst); 8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1; 8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 8980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.y = max(src.x, 0.0) */ 9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX; 9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 905921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_0; /*0.0*/ 9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], 0); 9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst); 9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1; 9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.z = NOP - fill Z slot */ 9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = 2; 9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse /* dst.w, <- 1.0 */ 9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 926921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = 0; 9287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst); 9297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1; 9327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 9347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 9357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (inst->Dst[0].Register.WriteMask & (1 << 2)) 9380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid { 9396a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int chan; 9406a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee int sel; 9416a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee 9420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = log(src.y) */ 9430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED; 9457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 9460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 9490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 9500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9576a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee chan = alu.dst.chan; 9586a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee sel = alu.dst.sel; 9590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */ 9610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT; 9637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 9667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].sel = sel; 9680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[1].chan = chan; 9697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]); 9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[2].chan = tgsi_chan(&inst->Src[0], 0); 9730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.sel = ctx->temp_reg; 9740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.chan = 0; 9750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.dst.write = 1; 9760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.is_op3 = 1; 9770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid /* dst.z = exp(tmp.x) */ 9830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid memset(&alu, 0, sizeof(struct r600_bc_alu)); 9840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 9850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].sel = ctx->temp_reg; 9860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.src[0].chan = 0; 9870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst); 9880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid alu.last = 1; 9910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid r = r600_bc_add_alu(ctx->bc, &alu); 9920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid if (r) 9930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return r; 9940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid } 9950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid return 0; 9960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid} 9970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid 9985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx) 9995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{ 10005cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse struct r600_bc_alu alu; 10025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse int i, j, r; 10035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 10045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (i = 0; i < 4; i++) { 10055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 10065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (inst->Dst[0].Register.WriteMask & (1 << i)) { 10075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 10085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 10097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); 10105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 10115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 10135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 10165cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10175cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse alu.last = 1; 10185cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10195cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse if (r) 10205cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return r; 10215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10225cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse } 10235cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse return 0; 10245cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse} 10255cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse 1026a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx) 10277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{ 10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu alu; 1030a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 10317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 10327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse for (i = 0; i < 4; i++) { 10337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 10347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].sel = ctx->temp_reg; 10357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 10367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.chan = i; 10377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 10387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1; 10417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (i == 3) 10427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.last = 1; 10437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 10447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 10457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 10467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse } 10477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return 0; 10487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse} 10497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse 1050a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx) 1051a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1052a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1053a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1054a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int i, r; 1055a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1056a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1057a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1058a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 1059a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]); 1060a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1061a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[i].chan = tgsi_chan(&inst->Src[i], 0); 1063a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse } 1064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* replicate result */ 1071a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1072a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1073a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx) 1075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{ 1076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 1077a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse struct r600_bc_alu alu; 1078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse int r; 1079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 1080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* LOG2(a) */ 1081a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE; 1083a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1088a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1092a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1093e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1094e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1095e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* b * LOG2(a) */ 1097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE; 1099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]); 1100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[1], 0); 1103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[1].sel = ctx->temp_reg; 1104a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1105a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1106a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1107a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1108a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1109a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1110e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1111e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1112e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1113a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse /* POW(a,b) = EXP2(b * LOG2(a))*/ 1114a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1115a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 1116a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1117a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.sel = ctx->temp_reg; 1118a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.dst.write = 1; 1119a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse alu.last = 1; 1120a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1121a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse if (r) 1122a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return r; 1123e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen r = r600_bc_add_literal(ctx->bc,ctx->value); 1124e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen if (r) 1125e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen return r; 1126a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse return tgsi_helper_tempx_replicate(ctx); 1127a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse} 1128a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse 11290d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx) 11300d48925a56ad4fb253386110b545abda82a25464Dave Airlie{ 11310d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 11320d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu alu; 11330d48925a56ad4fb253386110b545abda82a25464Dave Airlie struct r600_bc_alu_src r600_src[3]; 1134921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse int i, r; 11350d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11360d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_split_constant(ctx, r600_src); 11370d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11380d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11390d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11400d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* tmp = (src > 0 ? 1 : src) */ 11410d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 11420d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11430d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT; 11440d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 11450d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.sel = ctx->temp_reg; 11460d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.write = 1; 11470d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11480d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0] = r600_src[0]; 11490d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 11500d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1151921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 11520d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11530d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2] = r600_src[0]; 11540d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[0], i); 11550d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 11560d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 11570d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11580d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11590d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11600d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 11610d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11620d48925a56ad4fb253386110b545abda82a25464Dave Airlie /* dst = (-tmp > 0 ? -1 : tmp) */ 11630d48925a56ad4fb253386110b545abda82a25464Dave Airlie for (i = 0; i < 4; i++) { 11640d48925a56ad4fb253386110b545abda82a25464Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 11650d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT; 11660d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.is_op3 = 1; 11670d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 11680d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11690d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11700d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11710d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].sel = ctx->temp_reg; 11720d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[0].neg = 1; 11730d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1174921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[1].sel = V_SQ_ALU_SRC_1; 11750d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[1].neg = 1; 11760d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11770d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.src[2].sel = ctx->temp_reg; 11780d48925a56ad4fb253386110b545abda82a25464Dave Airlie 11790d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.dst.write = 1; 11800d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (i == 3) 11810d48925a56ad4fb253386110b545abda82a25464Dave Airlie alu.last = 1; 11820d48925a56ad4fb253386110b545abda82a25464Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 11830d48925a56ad4fb253386110b545abda82a25464Dave Airlie if (r) 11840d48925a56ad4fb253386110b545abda82a25464Dave Airlie return r; 11850d48925a56ad4fb253386110b545abda82a25464Dave Airlie } 11860d48925a56ad4fb253386110b545abda82a25464Dave Airlie return 0; 11870d48925a56ad4fb253386110b545abda82a25464Dave Airlie} 11880d48925a56ad4fb253386110b545abda82a25464Dave Airlie 1189cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst) 1190cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1191cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1192cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, r; 1193cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 11949961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 11959961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse if (r) 11969961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse return r; 1197cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (i = 0; i < 4; i++) { 1198cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1199cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (!(inst->Dst[0].Register.WriteMask & (1 << i))) { 1200cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP; 12016c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse alu.dst.chan = i; 1202cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } else { 1203cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1204cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 1205cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1206cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1207cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1208cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = i; 1209cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1210cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i == 3) { 1211cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.last = 1; 1212cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1213cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1214cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (r) 1215cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return r; 1216cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1217cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return 0; 1218cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1219cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx) 1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{ 1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse struct r600_bc_alu alu; 1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse int i, j, r; 1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 12277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 12287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* do it in 2 step as op3 doesn't support writemask */ 1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 12367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.sel = ctx->temp_reg; 1239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.dst.chan = i; 1240cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.is_op3 = 1; 1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse} 1251cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 1252cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx) 1253cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{ 1254cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1256cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse struct r600_bc_alu alu; 1257cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse int i, j, r; 1258cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse 12597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 12607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse for (i = 0; i < 4; i++) { 1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1264cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.inst = ctx->inst_info->r600_opcode; 1265cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { 12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j] = r600_src[j]; 12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[j].chan = tgsi_chan(&inst->Src[j], i); 1268cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1269cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.sel = ctx->temp_reg; 1270cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.chan = i; 1271cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.dst.write = 1; 1272cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse /* handle some special cases */ 1273cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse switch (ctx->inst_info->tgsi_opcode) { 1274cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP2: 1275cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 1) { 1276921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1277cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1278cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1279cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1280cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse case TGSI_OPCODE_DP3: 1281cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse if (i > 2) { 1282921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0; 1283cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse alu.src[0].chan = alu.src[1].chan = 0; 1284cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse } 1285cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1286e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie case TGSI_OPCODE_DPH: 1287e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie if (i == 3) { 1288e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 1289e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].chan = 0; 1290e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie alu.src[0].neg = 0; 1291e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie } 1292e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie break; 1293cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse default: 1294cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse break; 1295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (i == 3) { 1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse alu.last = 1; 1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse if (r) 1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse return r; 1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse } 1303cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse return tgsi_helper_copy(ctx, inst); 1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse} 1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse 130633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx) 130733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{ 130833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 130933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse struct r600_bc_tex tex; 1310641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse struct r600_bc_alu alu; 1311641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse unsigned src_gpr; 1312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie int r, i; 1313641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1314641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index; 1315641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse 1316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie /* Add perspective divide */ 1318b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE; 1320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1321b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 3); 1322b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1323b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1324b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1325b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1326b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1327b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1328b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1329b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie 1330b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 3; i++) { 1331b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1332b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1333b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = ctx->temp_reg; 1334b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 3; 1335b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].sel = src_gpr; 1336b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1337b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1338b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1339b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1340b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1341b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1342b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1343b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1344b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1345b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1346921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1347b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = 0; 1348b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1349b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = 3; 1350b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1351b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1352b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1353b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1354b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1355b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1356b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) { 1357b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie for (i = 0; i < 4; i++) { 1358b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1359b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 1360b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].sel = src_gpr; 1361b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.src[0].chan = i; 1362b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.sel = ctx->temp_reg; 1363b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.chan = i; 1364b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (i == 3) 1365b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.last = 1; 1366b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie alu.dst.write = 1; 1367b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 1368b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie if (r) 1369b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie return r; 1370b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 1371b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie src_gpr = ctx->temp_reg; 1372b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie } 137333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 137433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse memset(&tex, 0, sizeof(struct r600_bc_tex)); 137533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.inst = ctx->inst_info->r600_opcode; 137633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index; 137733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.sampler_id = tex.resource_id; 1378641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse tex.src_gpr = src_gpr; 13796c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index; 138033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_x = 0; 138133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_y = 1; 138233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_z = 2; 138333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.dst_sel_w = 3; 138433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_x = 0; 138533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_y = 1; 138633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_z = 2; 138733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse tex.src_sel_w = 3; 13889a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse 138901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie if (inst->Texture.Texture != TGSI_TEXTURE_RECT) { 139001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_x = 1; 139101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_y = 1; 13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse tex.coord_type_z = 1; 139301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie tex.coord_type_w = 1; 139401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie } 139533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse return r600_bc_add_tex(ctx->bc, &tex); 139633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse} 139733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse 1398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx) 1399b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{ 1400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse struct r600_bc_alu_src r600_src[3]; 1402b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse struct r600_bc_alu alu; 1403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse unsigned i; 1404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse int r; 1405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 14067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse r = tgsi_split_constant(ctx, r600_src); 14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse if (r) 14087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse return r; 1409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* 1 - src0 */ 1410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1411b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1412b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD; 1413921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse alu.src[0].sel = V_SQ_ALU_SRC_1; 1414b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = 0; 14157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[0]; 14167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[0], i); 1417b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[1].neg = 1; 1418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1419b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1420b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1426b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1431b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1432b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* (1 - src0) * src2 */ 1433b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1434b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 1436b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].sel = ctx->temp_reg; 1437b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[0].chan = i; 14387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[2]; 14397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 1440b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1441b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1442b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1443b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1444b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1445b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.write = 1; 1446b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1448b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1449b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1450b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_literal(ctx->bc, ctx->value); 1451b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1452b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1453b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 1454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse /* src0 * src1 + (1 - src0) * src2 */ 1455b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse for (i = 0; i < 4; i++) { 1456b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse memset(&alu, 0, sizeof(struct r600_bc_alu)); 1457b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 1458b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.is_op3 = 1; 14597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0] = r600_src[0]; 14607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 14617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1] = r600_src[1]; 14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse alu.src[1].chan = tgsi_chan(&inst->Src[1], i); 1463b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].sel = ctx->temp_reg; 1464b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.src[2].chan = i; 1465b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.sel = ctx->temp_reg; 1466b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.dst.chan = i; 1467b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (i == 3) { 1468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse alu.last = 1; 1469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1470b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse r = r600_bc_add_alu(ctx->bc, &alu); 1471b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse if (r) 1472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return r; 1473b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse } 1474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse return tgsi_helper_copy(ctx, inst); 1475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse} 1476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse 147787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx) 147887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{ 147987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 148087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu_src r600_src[3]; 148187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie struct r600_bc_alu alu; 148287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int use_temp = 0; 148387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie int i, r; 148487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 148587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_split_constant(ctx, r600_src); 148687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 148787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 148887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 148987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 149087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie use_temp = 1; 149187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 149287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie for (i = 0; i < 4; i++) { 149387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 149487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE; 149587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0] = r600_src[0]; 149687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], i); 149787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 149887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1] = r600_src[2]; 149987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[2], i); 150087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 150187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2] = r600_src[1]; 150287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.src[2].chan = tgsi_chan(&inst->Src[1], i); 150387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 150487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 150587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.sel = ctx->temp_reg; 150687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie else { 150787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 150887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 150987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 151087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 151187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.chan = i; 151287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.dst.write = 1; 151387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.is_op3 = 1; 151487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (i == 3) 151587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie alu.last = 1; 151687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 151787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (r) 151887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return r; 151987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie } 152087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie if (use_temp) 152187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return tgsi_helper_copy(ctx, inst); 152287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie return 0; 152387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie} 152487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 15250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx) 15260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{ 15270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 15280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu_src r600_src[3]; 15290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie struct r600_bc_alu alu; 15300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie uint32_t use_temp = 0; 15310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie int i, r; 15320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (inst->Dst[0].Register.WriteMask != 0xf) 15340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie use_temp = 1; 15350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_split_constant(ctx, r600_src); 15370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 15380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 15390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 15410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL; 15430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 15450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 15480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 15510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 15540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 15570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 15580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 15610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 15640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 15670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 15690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 15700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 15720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 15730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 15740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 15770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 15780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 15790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 15810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 15820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 15830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 15840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 15850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 15860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie for (i = 0; i < 4; i++) { 15880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 15890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD; 15900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 15910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0] = r600_src[0]; 15920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 15930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 15940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 1); 15950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 15970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 2); 15980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 15990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 16000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 16010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 16020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 16030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_0; 16040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[0].chan = i; 16050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 16070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1] = r600_src[1]; 16080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie switch (i) { 16090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 0: 16100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 2); 16110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 16120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 1: 16130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 0); 16140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 16150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 2: 16160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = tgsi_chan(&inst->Src[1], 1); 16170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie break; 16180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie case 3: 16190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 16200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[1].chan = i; 16210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 16230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].sel = ctx->temp_reg; 16240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].neg = 1; 16250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.src[2].chan = i; 16260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 16270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 16280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.sel = ctx->temp_reg; 16290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie else { 16300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 16310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 16320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 16330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.chan = i; 16350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.dst.write = 1; 16360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.is_op3 = 1; 16370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (i == 3) 16380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie alu.last = 1; 16390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 16400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (r) 16410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return r; 16420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie } 16430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie if (use_temp) 16440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return tgsi_helper_copy(ctx, inst); 16450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie return 0; 16460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie} 16470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie 164836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx) 164936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{ 165036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 165136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu_src r600_src[3]; 165236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie struct r600_bc_alu alu; 165309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int r; 165436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 165536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.x = 2^floor(src); */ 165636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (inst->Dst[0].Register.WriteMask & 1) { 165736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 165836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 165936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR; 166036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 166136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 166236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 166336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 166436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 166536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 166636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 166736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 166836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 166936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 167036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 167136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 167236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 167336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 167436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 167536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = ctx->temp_reg; 167636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 167736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 167836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 167936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 0; 168036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 168136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 168236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 168336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 168436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 168536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 168636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 168736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.y = tmp - floor(tmp); */ 168836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 1) & 1) { 168936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 169036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 169136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT; 169236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0] = r600_src[0]; 169336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 169436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 169536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 169636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 169736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 169836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 169936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); 170036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// if (r) 170136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie// return r; 170236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 170336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 1; 170436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 170536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 170636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 170736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 170836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 170936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 171036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 171136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 171236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.z = RoughApprox2ToX(tmp);*/ 171336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) { 171436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 171536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE; 171636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 171736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 171836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 171936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 172036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 172136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 172236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 172336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 2; 172436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 172536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 172636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 172736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 172836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 172936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 173036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 173136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 173236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 173336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie /* result.w = 1.0;*/ 173436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) { 173536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 173636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 173736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV; 173836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].sel = V_SQ_ALU_SRC_1; 173936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.src[0].chan = 0; 174036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie 174136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.sel = ctx->temp_reg; 174236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.chan = 3; 174336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.dst.write = 1; 174436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie alu.last = 1; 174536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie r = r600_bc_add_alu(ctx->bc, &alu); 174636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie if (r) 174736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return r; 174836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie } 174936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie return tgsi_helper_copy(ctx, inst); 175036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie} 175187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie 1752a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode) 1753a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 1754a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; 175509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_bc_alu alu; 1756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie int r; 1757a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1758a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie memset(&alu, 0, sizeof(struct r600_bc_alu)); 1759a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.inst = opcode; 1760a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.predicate = 1; 1761a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1762a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.sel = ctx->temp_reg; 1763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.write = 1; 1764a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.dst.chan = 0; 1765a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1766a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]); 1767a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 1768a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 1769a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[0].chan = tgsi_chan(&inst->Src[0], 0); 1770a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].sel = V_SQ_ALU_SRC_0; 1771a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.src[1].chan = 0; 1772a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie alu.last = 1; 1774a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1775a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r = r600_bc_add_alu_type(ctx->bc, &alu, V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE); 1776a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (r) 1777a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return r; 1778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 1779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 1780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops) 1782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 1783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_POP); 1784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = pops; 1785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 1786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 1787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 178809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason) 1789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 179009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch(reason) { 179109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 179209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current--; 179309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 179409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 179509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 179609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current -= 4; 179709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 179809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 179909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TOODO : for 16 vp asic should -= 2; */ 180009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current --; 180109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 180209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 180309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 1804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 180509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only) 180609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 180709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (check_max_only) { 180809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int diff; 180909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 181009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 181109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 1; 181209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 181309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 181409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie diff = 4; 181509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 181609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 181709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) > 181809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 181909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 182009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current + diff; 182109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 182209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return; 182309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 182409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie switch (reason) { 182509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_VPM: 182609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 182709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 182809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_PUSH_WQM: 182909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_LOOP: 183009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current += 4; 183109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 183209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie case FC_REP: 183309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current++; 183409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 183509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 183609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 183709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if ((ctx->bc->callstack[ctx->bc->call_sp].current) > 183809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max) { 183909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].max = 184009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->callstack[ctx->bc->call_sp].current; 184109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 184209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 184309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 184409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp) 184509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 184609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp]; 184709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 184809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid, 184909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sizeof(struct r600_bc_cf *) * (sp->num_mid + 1)); 185009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid[sp->num_mid] = ctx->bc->cf_last; 185109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid++; 185209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 1853a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 185409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type) 185509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 1856a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_sp++; 185709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].type = type; 185809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last; 185909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 186009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 186109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx) 186209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 186309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp]; 186409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (sp->mid) { 186509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie free(sp->mid); 186609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->mid = NULL; 186709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 186809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->num_mid = 0; 186909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->start = NULL; 187009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie sp->type = 0; 187109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_sp--; 187209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 187309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 187409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0 187509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx) 187609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 187709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN); 187809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 187909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 188009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 188109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset) 188209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 188309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 1884a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 188509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = pops; 188609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO work out offset */ 188709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 188809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 1889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 189009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value) 189109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 189209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 189309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 189409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 189509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx) 189609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 189709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 189809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 189909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 190009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx) 190109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 190209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 190309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_jump_to_offset(ctx, 1, 4); 190409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0); 190509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, ifidx + 1); 190609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_return(ctx); 190709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 190809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 190909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp) 191009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 191109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_testflag(ctx); 191209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 191309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 191409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 191509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 191609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fc_sp); 191709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 191809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 191909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 192009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif 192109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 192209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx) 192309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 192409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie emit_logic_pred(ctx, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE); 192509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 192609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP); 192709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 192809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_IF); 192909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 193009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 0); 1931a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 1932a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 1933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx) 1935a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 1936a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_ELSE); 1937a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->cf_last->pop_count = 1; 1938a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 193909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, ctx->bc->fc_sp); 1940a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id; 1941a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 1942a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 1943a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1944a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx) 1945a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{ 1946a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie pops(ctx, 1); 1947a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) { 1948a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie R600_ERR("if/endif unbalanced in shader\n"); 1949a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return -1; 1950a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 1951a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 1952a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) { 1953a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 1954a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1; 1955a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } else { 195609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2; 1957a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie } 195809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 195909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 196009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_PUSH_VPM); 196109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 196209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 196309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 196409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx) 196509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 196609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL); 196709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 196809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_pushlevel(ctx, FC_LOOP); 1969a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 197009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* check stack depth */ 197109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_LOOP, 0); 197209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 197309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 197409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 197509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx) 197609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 197709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie int i; 197809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 197909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END); 198009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 198109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) { 198209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("loop/endloop in shader code are not paired.\n"); 198309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 198409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 198509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 198609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* fixup loop pointers - from r600isa 198709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP END points to CF after LOOP START, 198809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie LOOP START point to CF after LOOP END 198909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie BRK/CONT point to LOOP END CF 199009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie */ 199109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2; 199209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 199309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2; 199409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 199509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) { 199609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id; 199709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 199809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie /* TODO add LOOPRET support */ 199909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_poplevel(ctx); 200009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_decrease_current(ctx, FC_LOOP); 200109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return 0; 200209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie} 200309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 200409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx) 200509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{ 200609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie unsigned int fscp; 200709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 200809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--) 200909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie { 201009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (FC_LOOP == ctx->bc->fc_stack[fscp].type) 201109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie break; 201209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 201309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 201409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie if (fscp == 0) { 201509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie R600_ERR("Break not inside loop/endloop pair\n"); 201609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie return -EINVAL; 201709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie } 201809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 201909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode); 202009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie ctx->bc->cf_last->pop_count = 1; 202109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 202209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie fc_set_mid(ctx, fscp); 202309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie 202409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie pops(ctx, 1); 202509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie callstack_check_depth(ctx, FC_PUSH_VPM, 1); 2026a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie return 0; 2027a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie} 2028a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie 2029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = { 2030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 20320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid {TGSI_OPCODE_LIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit}, 20337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RCP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate}, 20347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_RSQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate}, 203536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie {TGSI_OPCODE_EXP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp}, 2036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LOG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2}, 2038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2039cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP3, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2040cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2042dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse {TGSI_OPCODE_MIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2}, 2043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2}, 2044d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap}, 2045be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie {TGSI_OPCODE_SGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2}, 2046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MAD, 1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3}, 2047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2}, 2048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse {TGSI_OPCODE_LRP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp}, 2049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {20, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DP2A, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {22, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {23, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20563af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FRC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2}, 2057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CLAMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20583af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_FLR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2}, 2059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ROUND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse {TGSI_OPCODE_EX2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate}, 20614558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_LG2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate}, 2062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse {TGSI_OPCODE_POW, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow}, 20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie {TGSI_OPCODE_XPD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd}, 2064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {32, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse {TGSI_OPCODE_ABS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2}, 2067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RCC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2068e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie {TGSI_OPCODE_DPH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 206988f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_COS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig}, 20703af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDX, 0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex}, 20713af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie {TGSI_OPCODE_DDY, 0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex}, 2072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_KILP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* predicated kill */ 2073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PK4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20780d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2}, 2079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SFL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20800d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SGT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2}, 208188f5976484842671ecb2cefcfa91838a43032359Dave Airlie {TGSI_OPCODE_SIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig}, 2082d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie {TGSI_OPCODE_SLE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap}, 20830d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2}, 2084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_STR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2085b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TEX, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2087b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie {TGSI_OPCODE_TXP, 0, SQ_TEX_INST_SAMPLE, tgsi_tex}, 2088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2H, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP2US, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4B, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UP4UB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_X2D, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ARR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BRA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CAL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_RET, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 20980d48925a56ad4fb253386110b545abda82a25464Dave Airlie {TGSI_OPCODE_SSG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg}, 209987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie {TGSI_OPCODE_CMP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp}, 2100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SCS, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2101d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie {TGSI_OPCODE_TXB, 0, SQ_TEX_INST_SAMPLE_L, tgsi_tex}, 2102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2104cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse {TGSI_OPCODE_DP2, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp}, 2105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 210609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BRK, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont}, 2107a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_IF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if}, 2108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {75, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {76, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2111a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ELSE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else}, 2112a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie {TGSI_OPCODE_ENDIF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif}, 2113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {79, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {80, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_PUSHA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_POPA, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CEIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_I2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 21214558b634556f42867449a6e60d4badc72099f10dDave Airlie {TGSI_OPCODE_TRUNC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate}, 2122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SHL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {88, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_AND, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_OR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_MOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_XOR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXF, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_TXQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 213209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_CONT, 0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont}, 2133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_EMIT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDPRIM, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 213509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_BGNLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop}, 2136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BGNSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 213709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie {TGSI_OPCODE_ENDLOOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop}, 2138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSUB, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {103, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {104, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {105, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {106, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NOP, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {108, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {109, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {110, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {111, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_NRM4, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CALLNZ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IFC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_BREAKC, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2154094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse {TGSI_OPCODE_KIL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill}, /* conditional kill */ 2155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_END, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end}, /* aka HALT */ 2156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse /* gap */ 2157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {118, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2I, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_IMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_INEG, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ISLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_F2U, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_U2F, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UADD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UDIV, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMAX, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMIN, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMOD, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_UMUL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USEQ, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USGE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USHR, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USLT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_USNE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_SWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse {TGSI_OPCODE_LAST, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, 2185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}; 2186