nv50_program.c revision 44d8c9add2f095fc365ede751253d9fb7fc5c6e1
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/* 2857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Copyright 2008 Ben Skeggs 3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 4857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"), 6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation 7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions: 10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in 12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software. 13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * SOFTWARE. 21857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */ 22857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs 23f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_context.h" 24f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_defines.h" 25f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_state.h" 26f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_inlines.h" 27f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 28f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "pipe/p_shader_tokens.h" 29fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_parse.h" 30fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_util.h" 31f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 32f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#include "nv50_context.h" 33f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 34ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller#define NV50_SU_MAX_TEMP 127 35c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller#define NV50_SU_MAX_ADDR 4 36b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs//#define NV50_PROGRAM_DUMP 37f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 38c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller/* $a5 and $a6 always seem to be 0, and using $a7 gives you noise */ 39c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 409a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs/* ARL - gallium craps itself on progs/vp/arl.txt 4121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 4221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * MSB - Like MAD, but MUL+SUB 4321e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * - Fuck it off, introduce a way to negate args for ops that 4421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * support it. 4521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 46ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Look into inlining IMMD for ops other than MOV (make it general?) 4733e4d30d50344be26398a51365bea1be37487403Ben Skeggs * - Maybe even relax restrictions a bit, can't do P_RESULT + P_IMMD, 4833e4d30d50344be26398a51365bea1be37487403Ben Skeggs * but can emit to P_TEMP first - then MOV later. NVIDIA does this 49ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * 502fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * In ops such as ADD it's possible to construct a bad opcode in the !is_long() 512fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * case, if the emit_src() causes the inst to suddenly become long. 522fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * 53ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Verify half-insns work where expected - and force disable them where they 54ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * don't work - MUL has it forcibly disabled atm as it fixes POW.. 55afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * 56afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * FUCK! watch dst==src vectors, can overwrite components that are needed. 57afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * ie. SUB R0, R0.yzxw, R0 58776e9581d16fc0fd28058fbcd879756fd5d40b96Ben Skeggs * 59b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * Things to check with renouveau: 60b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * FP attr/result assignment - how? 616d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * attrib 626d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16bc maps vp output onto fp hpos 636d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16c0 maps vp output onto fp col0 646d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * result 656d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - colr always 0-3 666d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - depr always 4 676d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16bc->0x16e8 --> some binding between vp/fp regs 686d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16b8 --> VP output count 696d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 706d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1298 --> "MOV rcol.x, fcol.y" "MOV depr, fcol.y" = 0x00000005 716d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * "MOV rcol.x, fcol.y" = 0x00000004 726d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x19a8 --> as above but 0x00000100 and 0x00000000 736d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x00100000 used when KIL used 746d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x196c --> as above but 0x00000011 and 0x00000000 756d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 766d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1988 --> 0xXXNNNNNN 776d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - XX == FP high something 7821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs */ 79f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_reg { 80f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs enum { 81f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_TEMP, 82f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_ATTR, 83f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_RESULT, 84f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_CONST, 85ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller P_IMMD, 86ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller P_ADDR 87f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } type; 88f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int index; 89f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 90f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int hw; 91317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller int mod; 92bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 93dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller int rhw; /* result hw for FP outputs, or interpolant index */ 94bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller int acc; /* instruction where this reg is last read (first insn == 1) */ 95f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 96f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 97317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller#define NV50_MOD_NEG 1 98317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller#define NV50_MOD_ABS 2 99317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller#define NV50_MOD_SAT 4 100317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller 101e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* arbitrary limits */ 1021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller#define MAX_IF_DEPTH 4 103e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller#define MAX_LOOP_DEPTH 4 1041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 105f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_pc { 106f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p; 107f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 108f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* hw resources */ 109f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r_temp[NV50_SU_MAX_TEMP]; 110ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg r_addr[NV50_SU_MAX_ADDR]; 111f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 112f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* tgsi resources */ 113f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *temp; 114f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int temp_nr; 115f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *attr; 116f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int attr_nr; 117f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *result; 118f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int result_nr; 119f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *param; 120f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int param_nr; 121f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *immd; 122f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs float *immd_buf; 123f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int immd_nr; 124ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg **addr; 125ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int addr_nr; 1262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 12721e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs struct nv50_reg *temp_temp[16]; 1282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs unsigned temp_temp_nr; 129bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 130234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* broadcast and destination replacement regs */ 131234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_brdc; 132234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_dst[4]; 133234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 134f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller struct nv50_reg reg_instances[16]; 135f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller unsigned reg_instance_nr; 136f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller 137e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller unsigned interp_mode[32]; 138dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller /* perspective interpolation registers */ 139dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_p; 140dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_c; 141e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 1421196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_cond; 1431196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_insn[MAX_IF_DEPTH]; 1441196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *br_join[MAX_IF_DEPTH]; 145e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller struct nv50_program_exec *br_loop[MAX_LOOP_DEPTH]; /* for BRK branch */ 146e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int if_lvl, loop_lvl; 147e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller unsigned loop_pos[MAX_LOOP_DEPTH]; 1481196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 149bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller /* current instruction and total number of insns */ 150bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_cur; 151bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_nr; 152d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 153d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller boolean allow32; 154f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 155f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 156f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumillerstatic INLINE struct nv50_reg * 157f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumillerreg_instance(struct nv50_pc *pc, struct nv50_reg *reg) 158f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller{ 159f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller struct nv50_reg *dup = NULL; 160f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller if (reg) { 161f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller assert(pc->reg_instance_nr < 16); 162f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller dup = &pc->reg_instances[pc->reg_instance_nr++]; 163f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller *dup = *reg; 164f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller reg->mod = 0; 165f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller } 166f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller return dup; 167f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller} 168f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller 169e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerstatic INLINE void 170e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerctor_reg(struct nv50_reg *reg, unsigned type, int index, int hw) 171e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller{ 172e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->type = type; 173e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->index = index; 174e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->hw = hw; 175317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller reg->mod = 0; 176e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->rhw = -1; 177e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->acc = 0; 178e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller} 179e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller 1806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 1816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerpopcnt4(uint32_t val) 1826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 1836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller static const unsigned cnt[16] 1846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 1856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return cnt[val & 0xf]; 1866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 1876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 188f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 189ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerterminate_mbb(struct nv50_pc *pc) 190ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 191ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 192ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 193ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* remove records of temporary address register values */ 194ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 195ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index < 0) 196ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 197ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 198ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 199ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 200f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_reg(struct nv50_pc *pc, struct nv50_reg *reg) 201f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 202f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller int i = 0; 203f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 204fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (reg->type == P_RESULT) { 205fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (pc->p->cfg.high_result < (reg->hw + 1)) 206fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs pc->p->cfg.high_result = reg->hw + 1; 207fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs } 208fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs 2098ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->type != P_TEMP) 210f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 211f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2128ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->hw >= 0) { 2138ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs /*XXX: do this here too to catch FP temp-as-attr usage.. 2148ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs * not clean, but works */ 2158ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (reg->hw + 1)) 2168ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = reg->hw + 1; 2178ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs return; 2188ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs } 2198ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 220f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (reg->rhw != -1) { 221f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* try to allocate temporary with index rhw first */ 222f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (!(pc->r_temp[reg->rhw])) { 223f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->r_temp[reg->rhw] = reg; 224f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller reg->hw = reg->rhw; 225f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (pc->p->cfg.high_temp < (reg->rhw + 1)) 226f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->p->cfg.high_temp = reg->rhw + 1; 227f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller return; 228f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 229f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* make sure we don't get things like $r0 needs to go 230f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller * in $r1 and $r1 in $r0 231f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller */ 232f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller i = pc->result_nr * 4; 233f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 234f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller 235f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller for (; i < NV50_SU_MAX_TEMP; i++) { 236f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!(pc->r_temp[i])) { 237f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = reg; 238f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs reg->hw = i; 2398ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (i + 1)) 2408ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = i + 1; 241f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 242f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 243f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 244f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 245f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 246f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 247f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 248e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* XXX: For shaders that aren't executed linearly (e.g. shaders that 249e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * contain loops), we need to assign all hw regs to TGSI TEMPs early, 250e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * lest we risk temp_temps overwriting regs alloc'd "later". 251e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 252f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 253f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_temp(struct nv50_pc *pc, struct nv50_reg *dst) 254f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 255f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r; 256f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i; 257f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 258f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (dst && dst->type == P_TEMP && dst->hw == -1) 259f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return dst; 260f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 261f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < NV50_SU_MAX_TEMP; i++) { 262f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->r_temp[i]) { 263e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller r = MALLOC_STRUCT(nv50_reg); 264e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_TEMP, -1, i); 265f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = r; 266f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return r; 267f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 268f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 269f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 270f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 271f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return NULL; 272f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 273f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 274dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller/* Assign the hw of the discarded temporary register src 275dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller * to the tgsi register dst and free src. 276dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller */ 277dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic void 278dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerassimilate_temp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 279dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 280dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assert(src->index == -1 && src->hw != -1); 281dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 282dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (dst->hw != -1) 283dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[dst->hw] = NULL; 284dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[src->hw] = dst; 285dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller dst->hw = src->hw; 286dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 287dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller FREE(src); 288dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 289dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 2907ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller/* release the hardware resource held by r */ 2917ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 2927ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerrelease_hw(struct nv50_pc *pc, struct nv50_reg *r) 2937ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 2947ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(r->type == P_TEMP); 2957ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->hw == -1) 2967ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller return; 2977ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2987ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(pc->r_temp[r->hw] == r); 2997ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller pc->r_temp[r->hw] = NULL; 3007ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 3017ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller r->acc = 0; 3027ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->index == -1) 3037ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller FREE(r); 3047ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 3057ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 306f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 307f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsfree_temp(struct nv50_pc *pc, struct nv50_reg *r) 308f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 309f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (r->index == -1) { 310619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs unsigned hw = r->hw; 311619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs 312619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs FREE(pc->r_temp[hw]); 313619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs pc->r_temp[hw] = NULL; 314f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 315f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 316f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3173f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic int 3183f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsalloc_temp4(struct nv50_pc *pc, struct nv50_reg *dst[4], int idx) 3193f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3203f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3213f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3223f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if ((idx + 4) >= NV50_SU_MAX_TEMP) 3233f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 1; 3243f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3253f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if (pc->r_temp[idx] || pc->r_temp[idx + 1] || 3263f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + 2] || pc->r_temp[idx + 3]) 327a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller return alloc_temp4(pc, dst, idx + 4); 3283f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3293f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) { 330e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller dst[i] = MALLOC_STRUCT(nv50_reg); 331e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(dst[i], P_TEMP, -1, idx + i); 3323f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + i] = dst[i]; 3333f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs } 3343f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3353f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 0; 3363f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3373f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3383f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic void 3393f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsfree_temp4(struct nv50_pc *pc, struct nv50_reg *reg[4]) 3403f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3413f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3423f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3433f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) 3443f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs free_temp(pc, reg[i]); 3453f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3463f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 347f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 3482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggstemp_temp(struct nv50_pc *pc) 3492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 35021e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (pc->temp_temp_nr >= 16) 3512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs assert(0); 3522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp[pc->temp_temp_nr] = alloc_temp(pc, NULL); 3542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return pc->temp_temp[pc->temp_temp_nr++]; 3552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3562a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 3582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggskill_temp_temp(struct nv50_pc *pc) 3592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 3602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs int i; 3612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs for (i = 0; i < pc->temp_temp_nr; i++) 3632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs free_temp(pc, pc->temp_temp[i]); 3642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp_nr = 0; 3652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 36733e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic int 36833e4d30d50344be26398a51365bea1be37487403Ben Skeggsctor_immd(struct nv50_pc *pc, float x, float y, float z, float w) 36933e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 370f1aa2a43b7588aaca3ef175c8cc5366414cac2f8Christoph Bumiller pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * 4 * sizeof(float)), 371861629d1fd4a1d256c913470c33d9522e83d615dBen Skeggs (pc->immd_nr + 1) * 4 * sizeof(float)); 37233e4d30d50344be26398a51365bea1be37487403Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 0] = x; 373686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 1] = y; 374686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 2] = z; 375686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 3] = w; 37633e4d30d50344be26398a51365bea1be37487403Ben Skeggs 37733e4d30d50344be26398a51365bea1be37487403Ben Skeggs return pc->immd_nr++; 37833e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 37933e4d30d50344be26398a51365bea1be37487403Ben Skeggs 38033e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic struct nv50_reg * 38133e4d30d50344be26398a51365bea1be37487403Ben Skeggsalloc_immd(struct nv50_pc *pc, float f) 38233e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 383e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller struct nv50_reg *r = MALLOC_STRUCT(nv50_reg); 38433e4d30d50344be26398a51365bea1be37487403Ben Skeggs unsigned hw; 38533e4d30d50344be26398a51365bea1be37487403Ben Skeggs 3867e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller for (hw = 0; hw < pc->immd_nr * 4; hw++) 3877e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (pc->immd_buf[hw] == f) 3887e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller break; 3897e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 3907e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (hw == pc->immd_nr * 4) 3917e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller hw = ctor_immd(pc, f, -f, 0.5 * f, 0) * 4; 3927e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 393e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_IMMD, -1, hw); 39433e4d30d50344be26398a51365bea1be37487403Ben Skeggs return r; 39533e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 39633e4d30d50344be26398a51365bea1be37487403Ben Skeggs 39740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic struct nv50_program_exec * 39840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsexec(struct nv50_pc *pc) 39940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs{ 40040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = CALLOC_STRUCT(nv50_program_exec); 40140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 4021c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = -1; 40340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs return e; 40440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs} 40540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 40655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 40740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsemit(struct nv50_pc *pc, struct nv50_program_exec *e) 40855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 40955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs struct nv50_program *p = pc->p; 41055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 41140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (p->exec_tail) 41240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail->next = e; 41340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (!p->exec_head) 41440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e; 41540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = e; 41640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size += (e->inst[0] & 1) ? 2 : 1; 41755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 41855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 41940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic INLINE void set_long(struct nv50_pc *, struct nv50_program_exec *); 42055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 42240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_long(struct nv50_program_exec *e) 42355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 42440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 1) 42555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 42655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 42755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 42855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 43040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_immd(struct nv50_program_exec *e) 43155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 43240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && (e->inst[1] & 3) == 3) 43355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 43455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 43555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 43655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 43840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred(struct nv50_pc *pc, unsigned pred, unsigned idx, 43940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 44055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 44140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 44240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x1f << 7) | (0x3 << 12)); 44340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (pred << 7) | (idx << 12); 44455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 44555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 44655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 44740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred_wr(struct nv50_pc *pc, unsigned on, unsigned idx, 44840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 44955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 45040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 45140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x3 << 4) | (1 << 6)); 45240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (idx << 4) | (on << 6); 45355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 45455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 45640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_long(struct nv50_pc *pc, struct nv50_program_exec *e) 45755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 45840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e)) 45955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return; 46055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 46140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 1; 46240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0xf, 0, e); 46340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 46455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 46555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 46655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 46740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_dst(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_program_exec *e) 46855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 46955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (dst->type == P_RESULT) { 47040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 47140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000008; 47255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 47355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 47455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, dst); 475ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (dst->hw > 63) 476ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 47740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (dst->hw << 2); 47855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 47955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 48055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 48140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct nv50_program_exec *e) 48255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 483317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller unsigned val; 484c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller float f = pc->immd_buf[imm->hw]; 485317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller 486317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (imm->mod & NV50_MOD_ABS) 487317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller f = fabsf(f); 488317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller val = fui((imm->mod & NV50_MOD_NEG) ? -f : f); 48955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 49040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 49155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: can't be predicated - bits overlap.. catch cases where both 49255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * are required and avoid them. */ 49340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0, 0, e); 49440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 49555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 49640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000002 | 0x00000001; 49740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (val & 0x3f) << 16; 49840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (val >> 6) << 2; 49955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 50055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 501c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumillerstatic INLINE void 502c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumillerset_addr(struct nv50_program_exec *e, struct nv50_reg *a) 503c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller{ 504c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller assert(!(e->inst[0] & 0x0c000000)); 505c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller assert(!(e->inst[1] & 0x00000004)); 506c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 507c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] |= (a->hw & 3) << 26; 508c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[1] |= (a->hw >> 2) << 2; 509c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller} 510c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 511ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 512c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumilleremit_add_addr_imm(struct nv50_pc *pc, struct nv50_reg *dst, 513c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller struct nv50_reg *src0, uint16_t src1_val) 514ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 515ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 516ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 517c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] = 0xd0000000 | (src1_val << 9); 518ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] = 0x20000000; 519ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 520c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] |= dst->hw << 2; 521c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (src0) /* otherwise will add to $a0, which is always 0 */ 522c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller set_addr(e, src0); 523ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 524ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 525ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 526ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 527ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic struct nv50_reg * 528ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleralloc_addr(struct nv50_pc *pc, struct nv50_reg *ref) 529ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 530ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 531c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller struct nv50_reg *a_tgsi = NULL, *a = NULL; 532ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 533ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!ref) { 534c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller /* allocate for TGSI address reg */ 535ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) { 536ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) 537ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 538ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw >= 0 && 539ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc == pc->insn_cur) 540ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 541ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 542ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 543ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].index = i; 544ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 545ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 546ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(0); 547ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return NULL; 548ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 549ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 550c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller /* Allocate and set an address reg so we can access 'ref'. 551c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * 552c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * If and r_addr has index < 0, it is not reserved for TGSI, 553c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * and index will be the negative of the TGSI addr index the 554c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * value in rhw is relative to, or -256 if rhw is an offset 555c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * from 0. If rhw < 0, the reg has not been initialized. 556c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller */ 557ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = NV50_SU_MAX_ADDR - 1; i >= 0; --i) { 558ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) /* occupied for TGSI */ 559ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 560ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw < 0) { /* unused */ 561ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 562ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 563ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 564ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!a && pc->r_addr[i].acc != pc->insn_cur) 565ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 566ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 567c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (ref->hw - pc->r_addr[i].rhw >= 128) 568c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller continue; 569c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 570c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if ((ref->acc >= 0 && pc->r_addr[i].index == -256) || 571c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller (ref->acc < 0 && -pc->r_addr[i].index == ref->index)) { 572ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc = pc->insn_cur; 573ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 574ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 575ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 576ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(a); 577ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 578c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (ref->acc < 0) 579c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a_tgsi = pc->addr[ref->index]; 580c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 581c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller emit_add_addr_imm(pc, a, a_tgsi, (ref->hw & ~0x7f) * 4); 582c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 583c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a->rhw = ref->hw & ~0x7f; 584ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a->acc = pc->insn_cur; 585c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a->index = a_tgsi ? -ref->index : -256; 586ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return a; 587ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 588e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 589e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_LINEAR 0 590ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller#define INTERP_FLAT 1 591e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_PERSPECTIVE 2 592e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_CENTROID 4 593e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 594dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller/* interpolant index has been stored in dst->rhw */ 59555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 596dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumilleremit_interp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *iv, 597dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller unsigned mode) 5988ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs{ 599dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller assert(dst->rhw != -1); 60040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 6018ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 60240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x80000000; 60340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 604dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (dst->rhw << 16); 605dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 606dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_FLAT) { 607dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 8); 608dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } else { 609dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_PERSPECTIVE) { 610dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 25); 611dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller alloc_reg(pc, iv); 612dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (iv->hw << 9); 613dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 614dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 615dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_CENTROID) 616dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 24); 6175a3ea9ee59ac586955f7784eb25e7fd70d0c8882Ben Skeggs } 6188ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 61940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 6208ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs} 6218ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 6228ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggsstatic void 6231c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggsset_data(struct nv50_pc *pc, struct nv50_reg *src, unsigned m, unsigned s, 6241c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs struct nv50_program_exec *e) 6252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 62640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6271c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 628c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->param.index = src->hw & 127; 6291c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.shift = s; 6301c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.mask = m << (s % 32); 63194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 632ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->hw > 127) 633ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, alloc_addr(pc, src)); 634ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller else 635ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->acc < 0) { 636ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src->type == P_CONST); 637ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, pc->addr[src->index]); 638ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 639ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 64094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller e->inst[1] |= (((src->type == P_IMMD) ? 0 : 1) << 22); 6412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 64455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsemit_mov(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 64555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 64640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 64755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6482eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller e->inst[0] = 0x10000000; 6492eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!pc->allow32) 6502eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_long(pc, e); 65155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 65240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 65355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6542eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!is_long(e) && src->type == P_IMMD) { 65540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_immd(pc, src, e); 65655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: 32-bit, but steals part of "half" reg space - need to 65755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * catch and handle this case if/when we do half-regs 65855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs */ 65955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else 66055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_IMMD || src->type == P_CONST) { 66140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6621c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 9, e); 66344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x20000000; /* mov from c[] */ 66455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else { 66555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_ATTR) { 66640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 66740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 66855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 66955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 67055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, src); 671ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 672ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 67340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 67455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 67555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 67640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && !is_immd(e)) { 67740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x04000000; /* 32-bit */ 67844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x0000c000; /* 32-bit c[] load / lane mask 0:1 */ 679d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (!(e->inst[1] & 0x20000000)) 68044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x00030000; /* lane mask 2:3 */ 681d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller } else 682d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[0] |= 0x00008000; 68355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 68440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 68555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 68655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6874a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumillerstatic INLINE void 6884a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumilleremit_mov_immdval(struct nv50_pc *pc, struct nv50_reg *dst, float f) 6894a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller{ 6904a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller struct nv50_reg *imm = alloc_immd(pc, f); 6914a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov(pc, dst, imm); 6924a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller FREE(imm); 6934a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller} 6944a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller 69544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 69644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_nop(struct nv50_pc *pc) 69744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 69844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e = exec(pc); 69944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 70044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] = 0xf0000000; 70144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 70244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] = 0xe0000000; 70344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 70444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 70544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 706f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 7072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggscheck_swap_src_0_1(struct nv50_pc *pc, 7082a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg **s0, struct nv50_reg **s1) 7092a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src0 = *s0, *src1 = *s1; 7112a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type == P_CONST) { 7132a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type != P_CONST) { 7142a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 7152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 7162a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 7172a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type == P_ATTR) { 7202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type != P_ATTR) { 7212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 7222a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 7232a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 7242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return FALSE; 7282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 731001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerset_src_0_restricted(struct nv50_pc *pc, struct nv50_reg *src, 732001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_program_exec *e) 733001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller{ 734001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_reg *temp; 735001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 736001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (src->type != P_TEMP) { 737001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller temp = temp_temp(pc); 738001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller emit_mov(pc, temp, src); 739001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller src = temp; 740001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller } 741001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 742001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller alloc_reg(pc, src); 743ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 744ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 745001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller e->inst[0] |= (src->hw << 9); 746001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller} 747001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 748001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerstatic void 74940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_0(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 75240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 75340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 7542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 7562a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 763ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 764ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 76540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 7662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 76940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_1(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7712a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 7722a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7752a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7772a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 77840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x00800000)); 77940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x01000000) { 78034a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 78134a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 78234a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 78334a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 78434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 7851c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 16, e); 78640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x00800000; 78734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 7882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 791ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 792ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 793ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= ((src->hw & 127) << 16); 7942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 79740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_2(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 79940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 8002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 8022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 8032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 8052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 8062a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 8072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 80840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x01000000)); 80940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x00800000) { 81034a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 81134a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 81234a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 81334a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 81434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 8151c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 32+14, e); 81640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x01000000; 81734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 8182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 8192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 821ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= ((src->hw & 127) << 14); 8222a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8232a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 82544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_mov_from_pred(struct nv50_pc *pc, struct nv50_reg *dst, int pred) 82644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 82744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e = exec(pc); 82844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 82944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller assert(dst->type == P_TEMP); 83044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] = 0x20000000 | (pred << 12); 83144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 83244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_dst(pc, dst, e); 83344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 83444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 83544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 83644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 83744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 83844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_mov_to_pred(struct nv50_pc *pc, int pred, struct nv50_reg *src) 83944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 84044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e = exec(pc); 84144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 84244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] = 0x000001fc; 84344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] = 0xa0000008; 84444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 84544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred_wr(pc, 1, pred, e); 84644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_src_0_restricted(pc, src, e); 84744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 84844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 84944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 85044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 85144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 8522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mul(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 8532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 8542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 85540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8562a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 85740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xc0000000; 8582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 859708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (!pc->allow32) 860708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 861708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 8622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 86340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 86440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 865c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_IMMD && !is_long(e)) { 866317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src0->mod & NV50_MOD_NEG) 867c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 868708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 869c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } else { 870708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_src_1(pc, src1, e); 871317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if ((src0->mod ^ src1->mod) & NV50_MOD_NEG) { 872c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (is_long(e)) 873c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 874c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 875c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 876c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 877c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 8782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 87940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8802a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8822a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 88352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_add(struct nv50_pc *pc, struct nv50_reg *dst, 88452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 8852a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 88640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 888ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller e->inst[0] = 0xb0000000; 8892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 890ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller alloc_reg(pc, src1); 891c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 892c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 893317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (!pc->allow32 || (src0->mod | src1->mod) || src1->hw > 63) { 894708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 895317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= ((src0->mod & NV50_MOD_NEG) << 26) | 896317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller ((src1->mod & NV50_MOD_NEG) << 27); 897c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 898708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 89940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 90040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 901c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_CONST || src1->type == P_ATTR || is_long(e)) 90240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src1, e); 90352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs else 904708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (src1->type == P_IMMD) 905708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 906708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller else 90740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 90852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 90940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 91052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs} 91152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 91252a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsstatic void 913ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleremit_arl(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 914ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller uint8_t s) 915ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 916ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 917ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 918ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 919ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= 0xc0000000; 920ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 921ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= dst->hw << 2; 922ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= s << 16; /* shift left */ 923ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_src_0_restricted(pc, src, e); 924ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 925ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 926ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 927ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 928ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 92952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_minmax(struct nv50_pc *pc, unsigned sub, struct nv50_reg *dst, 93052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 93152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs{ 93240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 93352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 93440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 93540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 93640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 93752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 93852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 93940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 94040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 94140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 9422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 943317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src0->mod & NV50_MOD_ABS) 944317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= 0x00100000; 945317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src1->mod & NV50_MOD_ABS) 946317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= 0x00080000; 947317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller 94840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 951c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 9522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_sub(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 9532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 9542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 955317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src1->mod ^= NV50_MOD_NEG; 956c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_add(pc, dst, src0, src1); 957317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src1->mod ^= NV50_MOD_NEG; 9582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 9602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 96199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumilleremit_bitop2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 96299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller struct nv50_reg *src1, unsigned op) 96399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller{ 96499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller struct nv50_program_exec *e = exec(pc); 96599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 96699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] = 0xd0000000; 96799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_long(pc, e); 96899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 96999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 97099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_dst(pc, dst, e); 97199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_src_0(pc, src0, e); 97299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 97399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op != TGSI_OPCODE_AND && op != TGSI_OPCODE_OR && 97499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller op != TGSI_OPCODE_XOR) 97599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller assert(!"invalid bit op"); 97699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 97799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (src1->type == P_IMMD && src0->type == P_TEMP && pc->allow32) { 97899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_immd(pc, src1, e); 97999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_OR) 98099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] |= 0x0100; 98199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller else 98299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_XOR) 98399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] |= 0x8000; 98499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } else { 98599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_src_1(pc, src1, e); 98699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x04000000; /* 32 bit */ 98799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_OR) 98899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x4000; 98999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller else 99099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_XOR) 99199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x8000; 99299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } 99399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 99499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller emit(pc, e); 99599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller} 99699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 99799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumillerstatic void 9982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mad(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 9992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 10002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 100140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 10022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 100340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xe0000000; 10042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 10052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 100640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 100740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 100840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 100940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src2, e); 10102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 1011317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if ((src0->mod ^ src1->mod) & NV50_MOD_NEG) 1012c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x04000000; 1013317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src2->mod & NV50_MOD_NEG) 1014c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 1015c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 101640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 10172a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 10182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 1019c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 102021e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsemit_msb(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 102121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 102221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs{ 1023317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src2->mod ^= NV50_MOD_NEG; 1024c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_mad(pc, dst, src0, src1, src2); 1025317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src2->mod ^= NV50_MOD_NEG; 102621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs} 102721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs 102821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsstatic void 10292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_flop(struct nv50_pc *pc, unsigned sub, 10302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *dst, struct nv50_reg *src) 10312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 103240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 10332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 103440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x90000000; 103552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs if (sub) { 103640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 103740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 103852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs } 10392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 104040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 1041001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 1042001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (sub == 0 || sub == 2) 1043001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0_restricted(pc, src, e); 1044001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller else 1045001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0(pc, src, e); 10462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 104740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 10482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 10492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 1050d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsstatic void 1051d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsemit_preex2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1052d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs{ 105340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 1054d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 105540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 1056d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 105740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 105840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 105940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 106040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29) | 0x00004000; 1061d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 106240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 1063d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs} 1064faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1065bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggsstatic void 10667b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_precossin(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 10677b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs{ 106840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 10697b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 107040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 10717b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 107240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 107340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 107440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 107540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29); 10767b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 107740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 10787b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs} 10797b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 108087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_RN 0x01 108187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_FLOOR 0x03 108287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_CEIL 0x05 108387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_TRUNC 0x07 108487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_SAT 0x08 108587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_ABS 0x10 108687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 10871635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller/* 0x04 == 32 bit dst */ 10882b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x40 == dst is float */ 10892b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x80 == src is float */ 109087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_F32 0xc4 109187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_S32 0x44 109287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_F32 0x8c 109387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_S32 0x0c 1094ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_NEG 0x20 1095ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_RI 0x08 109687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 109787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic void 109887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumilleremit_cvt(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 10992b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller int wp, unsigned cvn, unsigned fmt) 110087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller{ 110187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller struct nv50_program_exec *e; 110287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 110387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e = exec(pc); 110487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_long(pc, e); 110587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 110687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0xa0000000; 11071635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] |= 0x00004000; /* 32 bit src */ 11082b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= (cvn << 16); 110987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= (fmt << 24); 111087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_src_0(pc, src, e); 111187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 111287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (wp >= 0) 111387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_pred_wr(pc, 1, wp, e); 111487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 111587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (dst) 111687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_dst(pc, dst, e); 111787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller else { 111887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0x000001fc; 111987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= 0x00000008; 112087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller } 112187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 112287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit(pc, e); 112387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller} 112487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 11252b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* nv50 Condition codes: 11262b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x1 = LT 11272b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x2 = EQ 11282b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x3 = LE 11292b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x4 = GT 11302b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x5 = NE 11312b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x6 = GE 11322b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x7 = set condition code ? (used before bra.lt/le/gt/ge) 11332b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x8 = unordered bit (allows NaN) 11342b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller */ 11357b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsstatic void 11362b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumilleremit_set(struct nv50_pc *pc, unsigned ccode, struct nv50_reg *dst, int wp, 1137bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 1138bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs{ 1139d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller static const unsigned cc_swapped[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 1140d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller 114140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 1142bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *rdst; 1143bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 11442b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(ccode < 16); 1145bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (check_swap_src_0_1(pc, &src0, &src1)) 1146d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller ccode = cc_swapped[ccode & 7] | (ccode & 8); 1147bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1148bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs rdst = dst; 11492b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst && dst->type != P_TEMP) 1150bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs dst = alloc_temp(pc, NULL); 1151bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1152bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs /* set.u32 */ 115340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 115440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 11552b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x60000000 | (ccode << 14); 11562b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 11572b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* XXX: decuda will disasm as .u16 and use .lo/.hi regs, but 11582b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * that doesn't seem to match what the hw actually does 11592b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x04000000; << breaks things, u32 by default ? 1160bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs */ 11612b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 11622b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (wp >= 0) 11632b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_pred_wr(pc, 1, wp, e); 11642b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst) 11652b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_dst(pc, dst, e); 11662b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller else { 11672b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[0] |= 0x000001fc; 11682b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x00000008; 11692b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 11702b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 117140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 117240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 1173bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 117440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 11751196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_cond = pc->p->exec_tail; /* record for OPCODE_IF */ 1176bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 11772b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* cvt.f32.u32/s32 (?) if we didn't only write the predicate */ 11782b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst) 11792b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_cvt(pc, rdst, dst, -1, CVTOP_ABS | CVTOP_RN, CVT_F32_S32); 11802b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst && rdst != dst) 1181bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs free_temp(pc, dst); 1182bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs} 1183d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 11842b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillerstatic INLINE unsigned 11852b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillermap_tgsi_setop_cc(unsigned op) 11862b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller{ 11872b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller switch (op) { 11882b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLT: return 0x1; 11892b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: return 0x6; 11902b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: return 0x2; 11912b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: return 0x4; 11922b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: return 0x3; 11932b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: return 0xd; 11942b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller default: 11952b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(0); 11962b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller return 0; 11972b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 11982b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller} 11992b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 120087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1201b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggsemit_flr(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1202b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs{ 1203ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_FLOOR, CVT_F32_F32 | CVT_RI); 1204b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs} 1205b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs 1206faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsstatic void 1207faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsemit_pow(struct nv50_pc *pc, struct nv50_reg *dst, 1208faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *v, struct nv50_reg *e) 1209faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs{ 1210faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *temp = alloc_temp(pc, NULL); 1211faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1212faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 3, temp, v); 1213faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_mul(pc, temp, temp, e); 1214faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_preex2(pc, temp, temp); 1215faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 6, dst, temp); 1216faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1217faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs free_temp(pc, temp); 1218faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs} 1219faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 122087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1221fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsemit_abs(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1222fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 122387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_ABS, CVT_F32_F32); 1224fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1225fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1226234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic INLINE void 1227234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumilleremit_sat(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1228234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 1229234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_SAT, CVT_F32_F32); 1230234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 1231234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 123201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggsstatic void 12337b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_lit(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 12347b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs struct nv50_reg **src) 123501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs{ 123601e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *one = alloc_immd(pc, 1.0); 123701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *zero = alloc_immd(pc, 0.0); 123801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *neg128 = alloc_immd(pc, -127.999999); 123901e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *pos128 = alloc_immd(pc, 127.999999); 124001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *tmp[4]; 1241708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller boolean allow32 = pc->allow32; 1242708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1243708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = FALSE; 124401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12457b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (3 << 1)) { 1246dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller tmp[0] = alloc_temp(pc, NULL); 12477b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[0], src[0], zero); 12487b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 124901e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12507b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 2)) { 125140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 1, 0, pc->p->exec_tail); 125201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12537b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[1] = temp_temp(pc); 12547b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[1], src[1], zero); 125501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12567b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[3] = temp_temp(pc); 12577b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[3], src[3], neg128); 12587b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 5, tmp[3], tmp[3], pos128); 125901e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12607b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_pow(pc, dst[2], tmp[1], tmp[3]); 12617b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_mov(pc, dst[2], zero); 126240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 3, 0, pc->p->exec_tail); 12637b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 12649417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 1265dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 1)) 1266dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assimilate_temp(pc, dst[1], tmp[0]); 1267dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller else 1268dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 2)) 1269dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller free_temp(pc, tmp[0]); 1270dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1271708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = allow32; 1272708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1273dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller /* do this last, in case src[i,j] == dst[0,3] */ 1274dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 0)) 1275dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[0], one); 1276dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1277dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 3)) 1278dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[3], one); 1279dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 12809417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pos128); 12819417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(neg128); 12829417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(zero); 12839417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(one); 128401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs} 128501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12861635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic INLINE void 128731f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggsemit_neg(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 128831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs{ 12891635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_RN, CVT_F32_F32 | CVT_NEG); 129031f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs} 129131f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs 1292d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsstatic void 1293d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsemit_kil(struct nv50_pc *pc, struct nv50_reg *src) 1294d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs{ 1295d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs struct nv50_program_exec *e; 1296d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs const int r_pred = 1; 1297eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller unsigned cvn = CVT_F32_F32; 1298d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1299317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src->mod & NV50_MOD_NEG) 1300eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller cvn |= CVT_NEG; 1301eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* write predicate reg */ 1302eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller emit_cvt(pc, NULL, src, r_pred, CVTOP_RN, cvn); 1303d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1304eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* conditional discard */ 1305d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs e = exec(pc); 1306eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller e->inst[0] = 0x00000002; 1307d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs set_long(pc, e); 1308eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller set_pred(pc, 0x1 /* LT */, r_pred, e); 1309d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit(pc, e); 1310d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs} 1311d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 131244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic struct nv50_program_exec * 131344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_branch(struct nv50_pc *pc, int pred, unsigned cc, 131444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec **join) 131544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 131644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e = exec(pc); 131744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 131844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (join) { 131944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 132044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= 0xa0000002; 132144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 132244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller *join = e; 132344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e = exec(pc); 132444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 132544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 132644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 132744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= 0x10000002; 132844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (pred >= 0) 132944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred(pc, cc, pred, e); 133044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 133144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller return pc->p->exec_tail; 133244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 133344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 133444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller#define QOP_ADD 0 133544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller#define QOP_SUBR 1 133644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller#define QOP_SUB 2 133744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller#define QOP_MOV_SRC1 3 133844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 133944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller/* For a quad of threads / top left, top right, bottom left, bottom right 134044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * pixels, do a different operation, and take src0 from a specific thread. 134144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller */ 134244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 134344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_quadop(struct nv50_pc *pc, struct nv50_reg *dst, int wp, int lane_src0, 134444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_reg *src0, struct nv50_reg *src1, ubyte qop) 134544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 134644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e = exec(pc); 134744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 134844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] = 0xc0000000; 134944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] = 0x80000000; 135044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_long(pc, e); 135144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= lane_src0 << 16; 135244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_src_0(pc, src0, e); 135344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_src_2(pc, src1, e); 135444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 135544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (wp >= 0) 135644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred_wr(pc, 1, wp, e); 135744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 135844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (dst) 135944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_dst(pc, dst, e); 136044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller else { 136144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= 0x000001fc; 136244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x00000008; 136344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 136444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 136544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= (qop & 3) << 20; 136644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= (qop >> 2) << 22; 136744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 136844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 136944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 137044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 137144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerstatic void 1372618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumillerload_cube_tex_coords(struct nv50_pc *pc, struct nv50_reg *t[4], 1373d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller struct nv50_reg **src, unsigned arg, boolean proj) 1374618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller{ 1375618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller int mod[3] = { src[0]->mod, src[1]->mod, src[2]->mod }; 1376618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1377618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[0]->mod |= NV50_MOD_ABS; 1378618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[1]->mod |= NV50_MOD_ABS; 1379618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[2]->mod |= NV50_MOD_ABS; 1380618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1381618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_minmax(pc, 4, t[2], src[0], src[1]); 1382618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_minmax(pc, 4, t[2], src[2], t[2]); 1383618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1384618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[0]->mod = mod[0]; 1385618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[1]->mod = mod[1]; 1386618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[2]->mod = mod[2]; 1387618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1388618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (proj && 0 /* looks more correct without this */) 1389618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[2], t[2], src[3]); 1390d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller else 1391d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (arg == 4) /* there is no textureProj(samplerCubeShadow) */ 1392d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_mov(pc, t[3], src[3]); 1393d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1394618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_flop(pc, 0, t[2], t[2]); 1395618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1396618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[0], src[0], t[2]); 1397618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[1], src[1], t[2]); 1398618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[2], src[2], t[2]); 1399618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller} 1400618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1401618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumillerstatic void 1402d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumillerload_proj_tex_coords(struct nv50_pc *pc, struct nv50_reg *t[4], 1403d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller struct nv50_reg **src, unsigned dim, unsigned arg) 14043accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller{ 1405d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller unsigned c, mode; 1406d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1407d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (src[0]->type == P_TEMP && src[0]->rhw != -1) { 1408d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller mode = pc->interp_mode[src[0]->index] | INTERP_PERSPECTIVE; 1409d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1410d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller t[3]->rhw = src[3]->rhw; 1411d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_interp(pc, t[3], NULL, (mode & INTERP_CENTROID)); 1412d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_flop(pc, 0, t[3], t[3]); 14133accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1414d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller for (c = 0; c < dim; ++c) { 1415d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller t[c]->rhw = src[c]->rhw; 1416d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_interp(pc, t[c], t[3], mode); 1417d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller } 1418d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (arg != dim) { /* depth reference value */ 1419d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller t[dim]->rhw = src[2]->rhw; 1420d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_interp(pc, t[dim], t[3], mode); 1421d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller } 1422d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller } else { 1423d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller /* XXX: for some reason the blob sometimes uses MAD 1424d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller * (mad f32 $rX $rY $rZ neg $r63) 1425d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller */ 1426d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_flop(pc, 0, t[3], src[3]); 1427d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller for (c = 0; c < dim; ++c) 1428d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_mul(pc, t[c], src[c], t[3]); 1429d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (arg != dim) /* depth reference value */ 1430d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_mul(pc, t[dim], src[2], t[3]); 1431d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller } 1432d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller} 14333accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1434d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumillerstatic INLINE void 1435d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumillerget_tex_dim(unsigned type, unsigned *dim, unsigned *arg) 1436d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller{ 14373accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller switch (type) { 14383accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_1D: 1439d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *arg = *dim = 1; 1440d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller break; 1441d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_TEXTURE_SHADOW1D: 1442d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *dim = 1; 1443d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *arg = 2; 14443accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 14453accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_UNKNOWN: 14463accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_2D: 14473accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_RECT: 1448d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *arg = *dim = 2; 1449d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller break; 1450d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_TEXTURE_SHADOW2D: 1451d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_TEXTURE_SHADOWRECT: 1452d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *dim = 2; 1453d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *arg = 3; 14543accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 14553accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_3D: 14563accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_CUBE: 1457d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller *dim = *arg = 3; 14583accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 14593accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller default: 14603accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assert(0); 14613accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 14623accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 1463d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller} 1464d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 146544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller/* We shouldn't execute TEXLOD if any of the pixels in a quad have 146644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * different LOD values, so branch off groups of equal LOD. 146744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller */ 146844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 146944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_texlod_sequence(struct nv50_pc *pc, struct nv50_reg *tlod, 147044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_reg *src, struct nv50_program_exec *tex) 147144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 147244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *join_at; 147344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller unsigned i, target = pc->p->exec_size + 7 * 2; 147444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 147544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller /* Subtract lod of each pixel from lod of top left pixel, jump 147644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * texlod insn if result is 0, then repeat for 2 other pixels. 147744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller */ 147844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_quadop(pc, NULL, 0, 0, tlod, tlod, 0x55); 147944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_branch(pc, 0, 2, &join_at)->param.index = target; 148044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 148144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (i = 1; i < 4; ++i) { 148244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_quadop(pc, NULL, 0, i, tlod, tlod, 0x55); 148344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_branch(pc, 0, 2, NULL)->param.index = target; 148444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 148544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 148644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, tlod, src); /* target */ 148744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, tex); /* texlod */ 148844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 148944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller join_at->param.index = target + 2 * 2; 149044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_nop(pc); 149144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller pc->p->exec_tail->inst[1] |= 2; /* join _after_ tex */ 149244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 149344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 149444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumillerstatic void 149544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumilleremit_texbias_sequence(struct nv50_pc *pc, struct nv50_reg *t[4], unsigned arg, 149644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *tex) 149744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller{ 149844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_program_exec *e; 149944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller struct nv50_reg imm_1248, *t123[4][4], *r_bits = alloc_temp(pc, NULL); 150044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller int r_pred = 0; 150144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller unsigned n, c, i, cc[4] = { 0x0a, 0x13, 0x11, 0x10 }; 150244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 150344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller pc->allow32 = FALSE; 150444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller ctor_reg(&imm_1248, P_IMMD, -1, ctor_immd_4u32(pc, 1, 2, 4, 8) * 4); 150544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 150644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller /* Subtract bias value of thread i from bias values of each thread, 150744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * store result in r_pred, and set bit i in r_bits if result was 0. 150844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller */ 150944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller assert(arg < 4); 151044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (i = 0; i < 4; ++i, ++imm_1248.hw) { 151144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_quadop(pc, NULL, r_pred, i, t[arg], t[arg], 0x55); 151244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, r_bits, &imm_1248); 151344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred(pc, 2, r_pred, pc->p->exec_tail); 151444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 151544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov_to_pred(pc, r_pred, r_bits); 151644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 151744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller /* The lanes of a quad are now grouped by the bit in r_pred they have 151844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * set. Put the input values for TEX into a new register set for each 151944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * group and execute TEX only for a specific group. 152044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * We cannot use the same register set for each group because we need 152144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller * the derivatives, which are implicitly calculated, to be correct. 152244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller */ 152344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (i = 1; i < 4; ++i) { 152444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller alloc_temp4(pc, t123[i], 0); 152544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 152644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (c = 0; c <= arg; ++c) 152744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, t123[i][c], t[c]); 152844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 152944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller *(e = exec(pc)) = *(tex); 153044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] &= ~0x01fc; 153144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_dst(pc, t123[i][0], e); 153244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred(pc, cc[i], r_pred, e); 153344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 153444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 153544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller /* finally TEX on the original regs (where we kept the input) */ 153644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred(pc, cc[0], r_pred, tex); 153744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, tex); 153844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 153944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller /* put the 3 * n other results into regs for lane 0 */ 154044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller n = popcnt4(((e->inst[0] >> 25) & 0x3) | ((e->inst[1] >> 12) & 0xc)); 154144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (i = 1; i < 4; ++i) { 154244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller for (c = 0; c < n; ++c) { 154344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, t[c], t123[i][c]); 154444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller set_pred(pc, cc[i], r_pred, pc->p->exec_tail); 154544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 154644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller free_temp4(pc, t123[i]); 154744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 154844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 154944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_nop(pc); 155044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller free_temp(pc, r_bits); 155144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller} 155244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 1553d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumillerstatic void 1554d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumilleremit_tex(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 1555d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller struct nv50_reg **src, unsigned unit, unsigned type, 1556d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller boolean proj, int bias_lod) 1557d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller{ 1558d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller struct nv50_reg *t[4]; 1559d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller struct nv50_program_exec *e; 1560d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller unsigned c, dim, arg; 15613accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1562d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller /* t[i] must be within a single 128 bit super-reg */ 15633accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller alloc_temp4(pc, t, 0); 15643accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1565d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller e = exec(pc); 1566d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller e->inst[0] = 0xf0000000; 1567d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller set_long(pc, e); 1568d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller set_dst(pc, t[0], e); 1569d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1570d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller /* TIC and TSC binding indices (TSC is ignored as TSC_LINKED = TRUE): */ 1571d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller e->inst[0] |= (unit << 9) /* | (unit << 17) */; 1572d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1573d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller /* live flag (don't set if TEX results affect input to another TEX): */ 1574d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller /* e->inst[0] |= 0x00000004; */ 1575d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1576d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller get_tex_dim(type, &dim, &arg); 1577d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller 1578618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (type == TGSI_TEXTURE_CUBE) { 1579d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller e->inst[0] |= 0x08000000; 1580d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller load_cube_tex_coords(pc, t, src, arg, proj); 1581618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller } else 1582d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (proj) 1583d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller load_proj_tex_coords(pc, t, src, dim, arg); 1584d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller else { 1585618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller for (c = 0; c < dim; c++) 1586618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mov(pc, t[c], src[c]); 1587d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (arg != dim) /* depth reference value (always src.z here) */ 1588d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_mov(pc, t[dim], src[2]); 15893accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 15903accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 15913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (mask & 0x3) << 25; 15923accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= (mask & 0xc) << 12; 15933accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 159444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (!bias_lod) { 159544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= (arg - 1) << 22; 159644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit(pc, e); 159744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } else 159844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller if (bias_lod < 0) { 159944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= arg << 22; 160044d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x20000000; /* texbias */ 160144d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, t[arg], src[3]); 160244d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_texbias_sequence(pc, t, arg, e); 160344d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } else { 160444d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[0] |= arg << 22; 160544d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller e->inst[1] |= 0x40000000; /* texlod */ 160644d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_mov(pc, t[arg], src[3]); 160744d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller emit_texlod_sequence(pc, t[arg], src[3], e); 160844d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller } 160944d8c9add2f095fc365ede751253d9fb7fc5c6e1Christoph Bumiller 16103accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#if 1 16115f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller c = 0; 16125f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 1) emit_mov(pc, dst[0], t[c++]); 16135f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 2) emit_mov(pc, dst[1], t[c++]); 16145f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 4) emit_mov(pc, dst[2], t[c++]); 16155f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 8) emit_mov(pc, dst[3], t[c]); 16163accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 16173accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp4(pc, t); 16183accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#else 16193accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: if p.e. MUL is used directly after TEX, it would still use 16203accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * the texture coordinates, not the fetched values: latency ? */ 16213accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 16223accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 4; c++) { 16233accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (mask & (1 << c)) 16243accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assimilate_temp(pc, dst[c], t[c]); 16253accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 16263accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp(pc, t[c]); 16273accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 16283accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#endif 16293accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller} 16303accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 16313accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumillerstatic void 16321635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddx(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 16331635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 16341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 16351635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16361635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 16371635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16381635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0140000; 16391635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x89800000; 16401635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 16411635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 16421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 16431635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 16441635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16451635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 16461635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 16471635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16481635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 16491635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddy(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 16501635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 16513f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller struct nv50_reg *r = src; 16521635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 16531635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16541635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 16551635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16563f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller if (!(src->mod & NV50_MOD_NEG)) { /* ! double negation */ 16573f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller r = alloc_temp(pc, NULL); 16583f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller emit_neg(pc, r, src); 16593f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller } 16601635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16611635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0150000; 16621635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x8a400000; 16631635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 16641635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 16653f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller set_src_0(pc, r, e); 16663f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller set_src_2(pc, r, e); 16673f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller 16683f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller if (r != src) 16693f471c7948425a9c8ae23a563e0e816954a7589aChristoph Bumiller free_temp(pc, r); 16701635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16711635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 16721635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 16731635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 16741635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 167544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerconvert_to_long(struct nv50_pc *pc, struct nv50_program_exec *e) 167644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller{ 167744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller unsigned q = 0, m = ~0; 167844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 167944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(!is_long(e)); 168044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 168144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller switch (e->inst[0] >> 28) { 168244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x1: 168344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MOV */ 168444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = 0x0403c000; 168544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = 0xffff7fff; 168644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 168744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x8: 16888b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller /* INTERP (move centroid, perspective and flat bits) */ 16898b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller m = ~0x03000100; 16908b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q = (e->inst[0] & (3 << 24)) >> (24 - 16); 16918b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q |= (e->inst[0] & (1 << 8)) << (18 - 8); 169244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 169344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x9: 169444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* RCP */ 169544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 169644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xB: 169744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* ADD */ 169844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~(127 << 16); 169944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) >> 2); 170044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 170144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xC: 170244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MUL */ 170344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~0x00008000; 170444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) << 12); 170544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 170644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xE: 170744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MAD (if src2 == dst) */ 170844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & 0x1fc) << 12); 170944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 171044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller default: 171144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(0); 171244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 171344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller } 171444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 171544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller set_long(pc, e); 171644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller pc->p->exec_size++; 171744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 171844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[0] &= m; 171944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[1] |= q; 172044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller} 172144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 1722f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller/* Some operations support an optional negation flag. */ 1723c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic boolean 1724c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillernegate_supported(const struct tgsi_full_instruction *insn, int i) 1725c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller{ 1726c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller switch (insn->Instruction.Opcode) { 17271635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 1728c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP3: 1729c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP4: 1730c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MUL: 1731c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_KIL: 1732c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_ADD: 1733c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_SUB: 1734c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MAD: 1735f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller return TRUE; 1736c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_POW: 1737f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (i == 1) 1738f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller return TRUE; 1739f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1740c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller default: 1741c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller return FALSE; 1742c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 1743c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller} 1744c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 17455d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller/* Return a read mask for source registers deduced from opcode & write mask. */ 17465d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillerstatic unsigned 17475d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *insn, int c) 17485d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller{ 17495b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell unsigned x, mask = insn->Dst[0].Register.WriteMask; 17505d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 17515d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (insn->Instruction.Opcode) { 17525d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_COS: 17535d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SIN: 17545d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 17555d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP3: 17565d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x7; 17575d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP4: 17585d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DPH: 17595d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 17605d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xf; 17615d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DST: 17625d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask & (c ? 0xa : 0x6); 17635d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_EX2: 17645d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LG2: 17655d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_POW: 17665d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RCP: 17675d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RSQ: 17685d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SCS: 17695d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x1; 17706a689783b9f61fc12e35f7e613697a3f4b07766bChristoph Bumiller case TGSI_OPCODE_IF: 17716a689783b9f61fc12e35f7e613697a3f4b07766bChristoph Bumiller return 0x1; 17725d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LIT: 17735d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xb; 17745d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TEX: 1775d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXB: 1776d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXL: 17775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TXP: 17785d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller { 177956ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell const struct tgsi_instruction_texture *tex; 17805d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 178156ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell assert(insn->Instruction.Texture); 17827d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell tex = &insn->Texture; 17835d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 17845d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = 0x7; 1785d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller if (insn->Instruction.Opcode != TGSI_OPCODE_TEX && 1786d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller insn->Instruction.Opcode != TGSI_OPCODE_TXD) 1787d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller mask |= 0x8; /* bias, lod or proj */ 17885d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 17895d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (tex->Texture) { 17905d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_1D: 17915d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0x9; 17925d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 1793d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_TEXTURE_SHADOW1D: 1794d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller mask &= 0x5; 1795d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller break; 17965d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_2D: 17975d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0xb; 17985d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 17995d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 18005d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 18015d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 18025d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 18035d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 18045d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_XPD: 18055d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller x = 0; 18065d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 1) x |= 0x6; 18075d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 2) x |= 0x5; 18085d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 4) x |= 0x3; 18095d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return x; 18105d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 18115d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 18125d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 18135d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 18145d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 18155d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller} 18165d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 1817fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1818fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggstgsi_dst(struct nv50_pc *pc, int c, const struct tgsi_full_dst_register *dst) 1819fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 18205b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch (dst->Register.File) { 1821fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 18225b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return &pc->temp[dst->Register.Index * 4 + c]; 1823fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_OUTPUT: 18245b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell return &pc->result[dst->Register.Index * 4 + c]; 1825ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 1826ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller { 18275b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell struct nv50_reg *r = pc->addr[dst->Register.Index * 4 + c]; 1828ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!r) { 1829ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = alloc_addr(pc, NULL); 18305b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell pc->addr[dst->Register.Index * 4 + c] = r; 1831ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1832ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1833ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return r; 1834ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1835fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_NULL: 1836fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1837fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1838fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1839fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1840fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1841fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1842fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1843fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1844fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1845c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillertgsi_src(struct nv50_pc *pc, int chan, const struct tgsi_full_src_register *src, 1846c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller boolean neg) 1847fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1848fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *r = NULL; 1849fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *temp; 1850ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller unsigned sgn, c, swz; 1851ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 185291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (src->Register.File != TGSI_FILE_CONSTANT) 185391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell assert(!src->Register.Indirect); 18549417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 18559417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller sgn = tgsi_util_get_full_src_register_sign_mode(src, chan); 1856fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1857b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell c = tgsi_util_get_full_src_register_swizzle(src, chan); 1858fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (c) { 1859b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 1860b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 1861b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 1862b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 186391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (src->Register.File) { 1864fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_INPUT: 186591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell r = &pc->attr[src->Register.Index * 4 + c]; 1866fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1867fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 186891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell r = &pc->temp[src->Register.Index * 4 + c]; 1869fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1870fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_CONSTANT: 187191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (!src->Register.Indirect) { 187291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell r = &pc->param[src->Register.Index * 4 + c]; 1873ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1874ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1875ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* Indicate indirection by setting r->acc < 0 and 1876ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller * use the index field to select the address reg. 1877ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller */ 1878ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = MALLOC_STRUCT(nv50_reg); 1879ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller swz = tgsi_util_get_src_register_swizzle( 188091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell &src->Indirect, 0); 1881ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller ctor_reg(r, P_CONST, 188291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell src->Indirect.Index * 4 + swz, 188391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell src->Register.Index * 4 + c); 1884ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r->acc = -1; 1885fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1886fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_IMMEDIATE: 188791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell r = &pc->immd[src->Register.Index * 4 + c]; 1888fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1889c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 1890c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 1891ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 189291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell r = pc->addr[src->Register.Index * 4 + c]; 1893ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1894ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1895fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1896fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1897fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1898fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1899fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1900fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1901fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1902fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1903fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1904fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 19059417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller switch (sgn) { 1906fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_KEEP: 1907fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1908fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_CLEAR: 1909fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs temp = temp_temp(pc); 1910fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, temp, r); 1911fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = temp; 1912fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 191331f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_TOGGLE: 1914c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1915317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller r->mod = NV50_MOD_NEG; 1916c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else { 1917c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp = temp_temp(pc); 1918c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, r); 1919c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r = temp; 1920c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 192131f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 192231f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_SET: 192331f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs temp = temp_temp(pc); 1924683722740c85fb6b8c0a930e8a4dce51e1709464Christoph Bumiller emit_cvt(pc, temp, r, -1, CVTOP_ABS, CVT_F32_F32 | CVT_NEG); 192531f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs r = temp; 192631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 1927fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1928fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1929fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1930fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1931fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1932fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return r; 1933fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1934fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 19352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* return TRUE for ops that produce only a single result */ 1936dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic boolean 19372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumilleris_scalar_op(unsigned op) 1938dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 19392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 1940e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_COS: 19412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DP2: 1942dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP3: 1943dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP4: 1944dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DPH: 19452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_EX2: 19462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LG2: 1947dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_POW: 1948dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RCP: 1949dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RSQ: 1950e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_SIN: 19512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* 19522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 19532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 1954dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_SCS: 19552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 19562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return TRUE; 19572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 19582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return FALSE; 19592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 19602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 19612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 19622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components depend 19632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * on source s, component c (reverse of nv50_tgsi_src_mask). 19642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 19652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 19662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_tgsi_dst_revdep(unsigned op, int s, int c) 19672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 19682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (is_scalar_op(op)) 19692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x1; 19702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 19712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 19722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DST: 19732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c) & (s ? 0xa : 0x6); 19742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_XPD: 19752da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (c) { 19762da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 0: return 0x6; 19772da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 1: return 0x5; 19782da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 2: return 0x3; 19792da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 3: return 0x0; 19802da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 19812da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 19822da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 19832da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 19842da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 19852da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_SCS: 1986dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TEX: 1987d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXB: 1988d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXL: 1989dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TXP: 19902da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* these take care of dangerous swizzles themselves */ 19912da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 19922da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_IF: 19932da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 19942da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* don't call this function for these ops */ 19952da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 19962da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0; 1997dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller default: 19982da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* linear vector instruction */ 19992da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c); 2000dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller } 2001dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 2002dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 2003e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic INLINE boolean 2004e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerhas_pred(struct nv50_program_exec *e, unsigned cc) 2005e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 2006e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (!is_long(e) || is_immd(e)) 2007e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 2008e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return ((e->inst[1] & 0x780) == (cc << 7)); 2009e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 2010e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2011e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* on ENDIF see if we can do "@p0.neu single_op" instead of: 2012e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * join_at ENDIF 2013e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * @p0.eq bra ENDIF 2014e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * single_op 2015e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * ENDIF: nop.join 2016e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 2017e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic boolean 2018e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillernv50_kill_branch(struct nv50_pc *pc) 2019e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 2020e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int lvl = pc->if_lvl; 2021e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2022e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->if_insn[lvl]->next != pc->p->exec_tail) 2023e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 2024e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2025e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* if ccode == 'true', the BRA is from an ELSE and the predicate 2026e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * reg may no longer be valid, since we currently always use $p0 2027e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 2028e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (has_pred(pc->if_insn[lvl], 0xf)) 2029e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 2030e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->if_insn[lvl] && pc->br_join[lvl]); 2031e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2032e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* We'll use the exec allocated for JOIN_AT (as we can't easily 2033e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * update prev's next); if exec_tail is BRK, update the pointer. 2034e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 2035e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->loop_lvl && pc->br_loop[pc->loop_lvl - 1] == pc->p->exec_tail) 2036e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->br_join[lvl]; 2037e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2038e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_size -= 4; /* remove JOIN_AT and BRA */ 2039e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2040e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller *pc->br_join[lvl] = *pc->p->exec_tail; 2041e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2042e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->if_insn[lvl]); 2043e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->p->exec_tail); 2044e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2045e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail = pc->br_join[lvl]; 2046e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->next = NULL; 2047e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller set_pred(pc, 0xd, 0, pc->p->exec_tail); 2048e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 2049e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return TRUE; 2050e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 2051e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 20522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic boolean 2053234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_program_tx_insn(struct nv50_pc *pc, 2054234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_instruction *inst) 2055f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 205681de711fc864247419221d700bd045addf22cb52Christoph Bumiller struct nv50_reg *rdst[4], *dst[4], *brdc, *src[3][4], *temp; 2057cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unsigned mask, sat, unit; 2058f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i, c; 2059f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 20605b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell mask = inst->Dst[0].Register.WriteMask; 2061688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs sat = inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE; 2062f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2063234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller memset(src, 0, sizeof(src)); 2064234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2065f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) { 2066234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((mask & (1 << c)) && !pc->r_dst[c]) 20677d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell dst[c] = tgsi_dst(pc, c, &inst->Dst[0]); 2068f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs else 2069234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller dst[c] = pc->r_dst[c]; 2070234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdst[c] = dst[c]; 2071f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2072f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2073f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 20747d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *fs = &inst->Src[i]; 20755d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned src_mask; 20765d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller boolean neg_supp; 20775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 20785d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src_mask = nv50_tgsi_src_mask(inst, i); 20795d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller neg_supp = negate_supported(inst, i); 2080cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 208191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (fs->Register.File == TGSI_FILE_SAMPLER) 208291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell unit = fs->Register.Index; 2083cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 2084f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) 20855d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (src_mask & (1 << c)) 2086f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller src[i][c] = reg_instance(pc, 2087f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller tgsi_src(pc, c, fs, neg_supp)); 2088f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2089f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 209081de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp = pc->r_brdc; 209181de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc && brdc->type != P_TEMP) { 209281de711fc864247419221d700bd045addf22cb52Christoph Bumiller temp = temp_temp(pc); 209381de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 209481de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp; 209581de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 2096688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 2097688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 2098234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << c)) || dst[c]->type == P_TEMP) 2099234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 210099e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller /* rdst[c] = dst[c]; */ /* done above */ 2101688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs dst[c] = temp_temp(pc); 2102688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2103688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2104688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 210581de711fc864247419221d700bd045addf22cb52Christoph Bumiller assert(brdc || !is_scalar_op(inst->Instruction.Opcode)); 210681de711fc864247419221d700bd045addf22cb52Christoph Bumiller 2107f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (inst->Instruction.Opcode) { 210868091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs case TGSI_OPCODE_ABS: 210968091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs for (c = 0; c < 4; c++) { 2110fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs if (!(mask & (1 << c))) 2111fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs continue; 2112fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, dst[c], src[0][c]); 211368091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs } 211468091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs break; 21152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_ADD: 21167df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21187df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 21192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_add(pc, dst[c], src[0][c], src[1][c]); 21207df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 21212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 212299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_AND: 212399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_XOR: 212499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_OR: 212599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller for (c = 0; c < 4; c++) { 212699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (!(mask & (1 << c))) 212799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller continue; 212899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller emit_bitop2(pc, dst[c], src[0][c], src[1][c], 212999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller inst->Instruction.Opcode); 213099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } 213199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller break; 2132ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_OPCODE_ARL: 2133ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src[0][0]); 2134ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller temp = temp_temp(pc); 2135ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_cvt(pc, temp, src[0][0], -1, CVTOP_FLOOR, CVT_S32_F32); 2136ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_arl(pc, dst[0], temp, 4); 2137ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 2138e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 2139e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->loop_pos[pc->loop_lvl++] = pc->p->exec_size; 2140ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 2141e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 2142e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BRK: 2143e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 2144e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->loop_lvl > 0); 2145e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->p->exec_tail; 2146e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 2147849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_CEIL: 2148849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 2149849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 2150849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 2151849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 2152ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_CEIL, CVT_F32_F32 | CVT_RI); 2153849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 2154849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 21552eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller case TGSI_OPCODE_CMP: 21562eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller pc->allow32 = FALSE; 21572eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller for (c = 0; c < 4; c++) { 21582eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!(mask & (1 << c))) 21592eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller continue; 21602eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_cvt(pc, NULL, src[0][c], 1, CVTOP_RN, CVT_F32_F32); 21612eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[1][c]); 21622eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x1, 1, pc->p->exec_tail); /* @SF */ 21632eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[2][c]); 21642eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x6, 1, pc->p->exec_tail); /* @NSF */ 21652eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller } 21662eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller break; 21672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_COS: 2168e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 2169e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 2170e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, dst[3], temp); 2171e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 2172e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 2173e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 2174e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 21757df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 2176e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 2177e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, brdc, temp); 21782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 21791635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDX: 21801635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 21811635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 21821635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 21831635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddx(pc, dst[c], src[0][c]); 21841635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 21851635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 21861635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 21871635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 21881635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 21891635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 21901635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddy(pc, dst[c], src[0][c]); 21911635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 21921635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 21932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP3: 21942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 21952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 219681de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][2], src[1][2], temp); 21972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 21982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP4: 21992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 22002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 22012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 220281de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][3], src[1][3], temp); 22032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 220421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_DPH: 220521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 220621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 220721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 220881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_add(pc, brdc, src[1][3], temp); 220921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 221033e4d30d50344be26398a51365bea1be37487403Ben Skeggs case TGSI_OPCODE_DST: 22119a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) 22129a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, dst[1], src[0][1], src[1][1]); 22139a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) 22149a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[2], src[0][2]); 22159a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 3)) 22169a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[3], src[1][3]); 221781de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & (1 << 0)) 221881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov_immdval(pc, dst[0], 1.0f); 221933e4d30d50344be26398a51365bea1be37487403Ben Skeggs break; 22201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ELSE: 22211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, -1, 0, NULL); 22221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 22231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 2224ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 22251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 22261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ENDIF: 22271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 22281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 2229e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* try to replace branch over 1 insn with a predicated insn */ 2230e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (nv50_kill_branch(pc) == TRUE) 2231e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 2232e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 22331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->br_join[pc->if_lvl]) { 22341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl]->param.index = pc->p->exec_size; 22351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl] = NULL; 22361196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 2237ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 22381196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emit a NOP as join point, we could set it on the next 22391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * one, but would have to make sure it is long and !immd 22401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 22411196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_nop(pc); 22421196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 2; 22431196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 2244e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 2245e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 2246e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->param.index = pc->loop_pos[--pc->loop_lvl]; 2247e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl]->param.index = pc->p->exec_size; 2248ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 2249e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 22502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_EX2: 22517b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_preex2(pc, temp, src[0][0]); 225281de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 6, brdc, temp); 22532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2254b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FLR: 2255b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 2256b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 2257b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 2258b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, dst[c], src[0][c]); 2259b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 2260b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 2261b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FRC: 22629417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 2263b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 2264b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 2265b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 2266b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, temp, src[0][c]); 2267b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_sub(pc, dst[c], src[0][c], temp); 2268b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 2269b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 22701196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_IF: 22711196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emitting a join_at may not be necessary */ 22721196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(pc->if_lvl < MAX_IF_DEPTH); 2273496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller /* set_pred_wr(pc, 1, 0, pc->if_cond); */ 2274496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller emit_cvt(pc, NULL, src[0][0], 0, CVTOP_ABS | CVTOP_RN, 2275496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller CVT_F32_F32); 22761196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, 0, 2, &pc->br_join[pc->if_lvl]); 22771196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 2278ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 22791196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 2280d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs case TGSI_OPCODE_KIL: 2281d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][0]); 2282d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][1]); 2283d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][2]); 2284d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][3]); 2285d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs break; 228601e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs case TGSI_OPCODE_LIT: 22877b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_lit(pc, &dst[0], mask, &src[0][0]); 228801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs break; 22892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_LG2: 229081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 3, brdc, src[0][0]); 22912a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 229221e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs case TGSI_OPCODE_LRP: 2293229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller temp = temp_temp(pc); 229421e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs for (c = 0; c < 4; c++) { 229521e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (!(mask & (1 << c))) 229621e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs continue; 2297229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_sub(pc, temp, src[1][c], src[2][c]); 2298229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_mad(pc, dst[c], temp, src[0][c], src[2][c]); 229921e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs } 230021e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs break; 23012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MAD: 23027df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23037df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23047df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 23052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, dst[c], src[0][c], src[1][c], src[2][c]); 23067df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 23072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 230852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MAX: 23097df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23107df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23117df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 231252a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 4, dst[c], src[0][c], src[1][c]); 23137df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 231452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 231552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MIN: 23167df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23187df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 231952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 5, dst[c], src[0][c], src[1][c]); 23207df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 232152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 2322f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_MOV: 23237df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23247df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23257df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 232655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs emit_mov(pc, dst[c], src[0][c]); 23277df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 232838ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs break; 23292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MUL: 23307df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23317df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23327df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 23332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, dst[c], src[0][c], src[1][c]); 23347df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 23352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2336ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs case TGSI_OPCODE_POW: 233781de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_pow(pc, brdc, src[0][0], src[1][0]); 2338ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs break; 23392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RCP: 234081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 0, brdc, src[0][0]); 23412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 23422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RSQ: 234381de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 2, brdc, src[0][0]); 23442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 23457b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs case TGSI_OPCODE_SCS: 23469417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 234781de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & 3) 234881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_precossin(pc, temp, src[0][0]); 23497b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 0)) 23507b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 5, dst[0], temp); 23517b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 1)) 23527b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 4, dst[1], temp); 23534a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 2)) 23544a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[2], 0.0); 23554a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 23564a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 23577b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs break; 23582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SIN: 2359e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 2360e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 2361e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, dst[3], temp); 2362e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 2363e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 2364e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 2365e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 23667df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 2367e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 2368e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, brdc, temp); 23692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2370bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs case TGSI_OPCODE_SLT: 23712b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: 23722b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: 23732b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: 23742b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: 23752b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: 23762b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller i = map_tgsi_setop_cc(inst->Instruction.Opcode); 2377bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs for (c = 0; c < 4; c++) { 2378bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (!(mask & (1 << c))) 2379bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs continue; 23802b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_set(pc, i, dst[c], -1, src[0][c], src[1][c]); 2381bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs } 2382bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs break; 23832a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SUB: 23847df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 23857df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 23867df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 23872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_sub(pc, dst[c], src[0][c], src[1][c]); 23887df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 23892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2390c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_OPCODE_TEX: 23913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 2392d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller inst->Texture.Texture, FALSE, 0); 2393d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller break; 2394d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXB: 2395d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 2396d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller inst->Texture.Texture, FALSE, -1); 2397d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller break; 2398d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller case TGSI_OPCODE_TXL: 2399d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 2400d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller inst->Texture.Texture, FALSE, 1); 24013accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 24025696267efd6f85d79f5fe511d1a066a17c4d1cccBen Skeggs case TGSI_OPCODE_TXP: 24033accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 2404d80778218d512f51e1b52e2fe652021ecefd724aChristoph Bumiller inst->Texture.Texture, TRUE, 0); 2405c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2406849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_TRUNC: 2407849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 2408849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 2409849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 2410849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 2411ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_TRUNC, CVT_F32_F32 | CVT_RI); 2412849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 2413849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 241421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_XPD: 24159417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 24169a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 0)) { 24179a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][2], src[1][1]); 24189a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[0], src[0][1], src[1][2], temp); 24199a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 24209a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) { 24219a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][2]); 24229a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[1], src[0][2], src[1][0], temp); 24239a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 24249a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) { 24259a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][1], src[1][0]); 24269a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[2], src[0][0], src[1][1], temp); 24279a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 24284a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 24294a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 243021e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 2431f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_END: 2432f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2433f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2434f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("invalid opcode %d\n", inst->Instruction.Opcode); 2435f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 2436f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2437f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 243881de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc) { 243981de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 244081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_sat(pc, brdc, brdc); 244181de711fc864247419221d700bd045addf22cb52Christoph Bumiller for (c = 0; c < 4; c++) 244281de711fc864247419221d700bd045addf22cb52Christoph Bumiller if ((mask & (1 << c)) && dst[c] != brdc) 244381de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov(pc, dst[c], brdc); 244481de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 2445688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 2446688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 2447688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (!(mask & (1 << c))) 2448688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs continue; 244999e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller /* In this case we saturate later, and dst[c] won't 245099e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller * be another temp_temp (and thus lost), since rdst 245199e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller * already is TEMP (see above). */ 245299e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller if (rdst[c]->type == P_TEMP && rdst[c]->index < 0) 2453234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2454234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, rdst[c], dst[c]); 2455688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2456688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2457688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 24589417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 24599417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (c = 0; c < 4; c++) { 24609417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (!src[i][c]) 24619417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller continue; 2462ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src[i][c]->acc < 0 && src[i][c]->type == P_CONST) 2463ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller FREE(src[i][c]); /* indirect constant */ 24649417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 24659417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 24669417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 246752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs kill_temp_temp(pc); 2468f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller pc->reg_instance_nr = 0; 2469f7a97344924461d64bfa5bd1b6a2c1151b70cc7cChristoph Bumiller 2470f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return TRUE; 2471f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2472f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2473bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumillerstatic void 247438849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerprep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn) 2475bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller{ 247638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller struct nv50_reg *reg = NULL; 2477bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_full_src_register *src; 2478bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_dst_register *dst; 247938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned i, c, k, mask; 2480bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 24815b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell dst = &insn->Dst[0].Register; 2482bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller mask = dst->WriteMask; 2483bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 248438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_TEMPORARY) 248538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 248638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 248738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_OUTPUT) 248838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->result; 2489bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 249038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (reg) { 2491bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2492bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2493bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 249438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[dst->Index * 4 + c].acc = pc->insn_nr; 2495bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2496bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2497bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2498bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 24997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell src = &insn->Src[i]; 2500bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 250191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (src->Register.File == TGSI_FILE_TEMPORARY) 250238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 250338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 250491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (src->Register.File == TGSI_FILE_INPUT) 250538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->attr; 250638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 2507bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2508bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 25095d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = nv50_tgsi_src_mask(insn, i); 2510bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2511bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2512bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2513bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2514b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell k = tgsi_util_get_full_src_register_swizzle(src, c); 251538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 251691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell reg[src->Register.Index * 4 + k].acc = pc->insn_nr; 2517bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2518bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2519bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller} 2520bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 25212da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components need to be 25222da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * written to temporaries first to avoid 'corrupting' sources. 25232da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 25242da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * m[i] (out) indicate component to write in the i-th position 25252da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * rdep[c] (in) bitmasks of dst[i] that require dst[c] as source 25262da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 25272da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 25282da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_revdep_reorder(unsigned m[4], unsigned rdep[4]) 25292da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 25302da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsigned i, c, x, unsafe; 25312da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25322da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 4; c++) 25332da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = c; 25342da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* Swap as long as a dst component written earlier is depended on 25362da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * by one written later, but the next one isn't depended on by it. 25372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 25382da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 3; c++) { 25392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c + 1]] & (1 << m[c])) 25402da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; /* if next one is depended on by us */ 25412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = c + 1; i < 4; i++) 25422da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* if we are depended on by a later one */ 25432da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c]] & (1 << m[i])) 25442da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller break; 25452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (i == 4) 25462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; 25472da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* now, swap */ 25482da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller x = m[c]; 25492da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = m[c + 1]; 25502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c + 1] = x; 25512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* restart */ 25532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller c = 0; 25542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 25552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* mark dependencies that could not be resolved by reordering */ 25572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = 0; i < 3; ++i) 25582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = i + 1; c < 4; ++c) 25592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[i]] & (1 << m[c])) 25602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsafe |= (1 << i); 25612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* NOTE: $unsafe is with respect to order, not component */ 25632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return unsafe; 25642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 25652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Select a suitable dst register for broadcasting scalar results, 25672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * or return NULL if we have to allocate an extra TEMP. 25682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 25692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * If e.g. only 1 component is written, we may also emit the final 25702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * result to a write-only register. 25712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 25722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic struct nv50_reg * 25732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillertgsi_broadcast_dst(struct nv50_pc *pc, 25742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller const struct tgsi_full_dst_register *fd, unsigned mask) 25752da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 25765b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (fd->Register.File == TGSI_FILE_TEMPORARY) { 25775b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell int c = ffs(~mask & fd->Register.WriteMask); 25782da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (c) 25792da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c - 1, fd); 25802da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } else { 25815b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell int c = ffs(fd->Register.WriteMask) - 1; 25825b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if ((1 << c) == fd->Register.WriteMask) 25832da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c, fd); 25842da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 25852da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 25862da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return NULL; 25872da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 25882da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 2589234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller/* Scan source swizzles and return a bitmask indicating dst regs that 2590234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller * also occur among the src regs, and fill rdep for nv50_revdep_reoder. 2591234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller */ 2592234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic unsigned 2593234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_scan_swizzle(const struct tgsi_full_instruction *insn, 2594234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned rdep[4]) 2595234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 25967d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *fd = &insn->Dst[0]; 2597234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_src_register *fs; 2598234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs = 0; 2599234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2600234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) 2601234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[i] = 0; 2602234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2603234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2604234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned chn, mask = nv50_tgsi_src_mask(insn, i); 2605234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller boolean neg_supp = negate_supported(insn, i); 2606234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26077d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell fs = &insn->Src[i]; 260891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (fs->Register.File != fd->Register.File || 260991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell fs->Register.Index != fd->Register.Index) 2610234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2611234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2612234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (chn = 0; chn < 4; ++chn) { 2613234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned s, c; 2614234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2615234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << chn))) /* src is not read */ 2616234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2617b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell c = tgsi_util_get_full_src_register_swizzle(fs, chn); 2618234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller s = tgsi_util_get_full_src_register_sign_mode(fs, chn); 2619234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26205b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (!(fd->Register.WriteMask & (1 << c))) 2621234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2622234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2623234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* no danger if src is copied to TEMP first */ 2624234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((s != TGSI_UTIL_SIGN_KEEP) && 2625234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller (s != TGSI_UTIL_SIGN_TOGGLE || !neg_supp)) 2626234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2627234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2628234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[c] |= nv50_tgsi_dst_revdep( 2629234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn->Instruction.Opcode, i, chn); 2630234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs |= (1 << c); 2631234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2632234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2633234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2634234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return deqs; 2635234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2636234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2637234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic boolean 2638234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_insn(struct nv50_pc *pc, const union tgsi_full_token *tok) 2639234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2640234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct tgsi_full_instruction insn = tok->FullInstruction; 2641234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd; 2642234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs, rdep[4], m[4]; 2643234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26447d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell fd = &tok->FullInstruction.Dst[0]; 2645234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_tgsi_scan_swizzle(&insn, rdep); 2646234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2647234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (is_scalar_op(insn.Instruction.Opcode)) { 2648234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = tgsi_broadcast_dst(pc, fd, deqs); 2649234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!pc->r_brdc) 2650234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = temp_temp(pc); 2651234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2652234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2653234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = NULL; 2654234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2655234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!deqs) 2656234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2657234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2658234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_revdep_reorder(m, rdep); 2659234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2660234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) { 2661234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller assert(pc->r_dst[m[i]] == NULL); 2662234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26635b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell insn.Dst[0].Register.WriteMask = 26645b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell fd->Register.WriteMask & (1 << m[i]); 2665234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26665b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (!insn.Dst[0].Register.WriteMask) 2667234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2668234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2669234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (deqs & (1 << i)) 2670234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[m[i]] = alloc_temp(pc, NULL); 2671234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2672234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!nv50_program_tx_insn(pc, &insn)) 2673234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return FALSE; 2674234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2675234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2676234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; i++) { 2677234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *reg = pc->r_dst[i]; 2678234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!reg) 2679234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2680234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[i] = NULL; 2681234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2682234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (insn.Instruction.Saturate == TGSI_SAT_ZERO_ONE) 2683234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, tgsi_dst(pc, i, fd), reg); 2684234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller else 2685234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_mov(pc, tgsi_dst(pc, i, fd), reg); 2686234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller free_temp(pc, reg); 2687234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2688234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2689234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return TRUE; 2690234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2691234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 26926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic void 26936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerload_interpolant(struct nv50_pc *pc, struct nv50_reg *reg) 2694dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller{ 26956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_reg *iv, **ppiv; 26966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned mode = pc->interp_mode[reg->index]; 2697dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 26986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ppiv = (mode & INTERP_CENTROID) ? &pc->iv_c : &pc->iv_p; 26996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv; 2700dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if ((mode & INTERP_PERSPECTIVE) && !iv) { 27026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv = alloc_temp(pc, NULL); 27036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv->rhw = popcnt4(pc->p->cfg.regs[1] >> 24) - 1; 2704dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, iv, NULL, mode & INTERP_CENTROID); 27066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_flop(pc, 0, iv, iv); 2707dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* XXX: when loading interpolants dynamically, move these 27096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * to the program head, or make sure it can't be skipped. 27106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 2711dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2712dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, reg, iv, mode); 2714dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller} 2715dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27165de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller/* The face input is always at v[255] (varying space), with a 27175de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller * value of 0 for back-facing, and 0xffffffff for front-facing. 27185de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller */ 27195de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumillerstatic void 27205de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumillerload_frontfacing(struct nv50_pc *pc, struct nv50_reg *a) 27215de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller{ 27225de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller struct nv50_reg *one = alloc_immd(pc, 1.0f); 27235de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 27245de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller assert(a->rhw == -1); 27255de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller alloc_reg(pc, a); /* do this before rhw is set */ 27265de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller a->rhw = 255; 27275de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller load_interpolant(pc, a); 27285de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller emit_bitop2(pc, a, a, one, TGSI_OPCODE_AND); 27295de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 27305de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller FREE(one); 27315de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller} 27325de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 2733f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 2734f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx_prep(struct nv50_pc *pc) 2735f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 27366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct tgsi_parse_context tp; 27376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *p = pc->p; 2738f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret = FALSE; 27396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned i, c, flat_nr = 0; 2740dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 27416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_init(&tp, pc->p->pipe.tokens); 27426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller while (!tgsi_parse_end_of_tokens(&tp)) { 27436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller const union tgsi_full_token *tok = &tp.FullToken; 2744f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_token(&tp); 2746f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2747f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_IMMEDIATE: 2748f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2749f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_immediate *imm = 27506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller &tp.FullToken.FullImmediate; 2751f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2752fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell ctor_immd(pc, imm->u[0].Float, 2753fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[1].Float, 2754fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[2].Float, 2755fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[3].Float); 2756f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2757f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2758f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_DECLARATION: 2759f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2760f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_declaration *d; 27616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned si, last, first, mode; 2762f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller d = &tp.FullToken.FullDeclaration; 2764fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell first = d->Range.First; 2765fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell last = d->Range.Last; 2766f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2767f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (d->Declaration.File) { 2768f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_TEMPORARY: 2769f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2770f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_OUTPUT: 27716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!d->Declaration.Semantic || 27726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->type == PIPE_SHADER_FRAGMENT) 27736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 27746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 2775763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell si = d->Semantic.Index; 2776763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell switch (d->Semantic.Name) { 27774d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller case TGSI_SEMANTIC_BCOLOR: 27784d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[si].hw = first; 27794d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.io_nr > first) 27804d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.io_nr = first; 27814d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller break; 278206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller case TGSI_SEMANTIC_PSIZE: 278306dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = first; 278406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.io_nr > first) 278506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.io_nr = first; 278606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller break; 27876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* 27886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller case TGSI_SEMANTIC_CLIP_DISTANCE: 27896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = MIN2(p->cfg.clpd, first); 27906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 27916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 27926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller default: 27936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 27946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2795f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2796f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_INPUT: 2797e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller { 27986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type != PIPE_SHADER_FRAGMENT) 2799e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2800e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2801e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller switch (d->Declaration.Interpolate) { 2802e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 2803e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_FLAT; 28046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller flat_nr++; 2805e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2806e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_PERSPECTIVE: 2807e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_PERSPECTIVE; 28086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= 0x08 << 24; 2809e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2810e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller default: 2811e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_LINEAR; 2812e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2813e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 28146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (d->Declaration.Centroid) 2815e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode |= INTERP_CENTROID; 2816e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2817e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller assert(last < 32); 2818e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller for (i = first; i <= last; i++) 2819e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller pc->interp_mode[i] = mode; 2820e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 2821f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2822ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 2823f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_CONSTANT: 2824c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 2825c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2826f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2827f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("bad decl file %d\n", 2828f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs d->Declaration.File); 2829f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2830f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2831f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2832f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2833f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2834bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller pc->insn_nr++; 283538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller prep_inspect_insn(pc, &tok->FullInstruction); 2836f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2837f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2838f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2839f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2840f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2841f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 28426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_VERTEX) { 28436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid = 0; 28448ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 28456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) { 28466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->attr[i].acc) { 28476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i].hw = rid++; 28486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.attr[i / 32] |= 1 << (i % 32); 2849f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 28506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 28516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 28526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0, rid = 0; i < pc->result_nr; ++i) { 28536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].hw = rid; 28547494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller p->cfg.io[i].id = i; 28558ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 28566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 28576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int n = i * 4 + c; 28586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->result[n].acc) 28596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 28606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[n].hw = rid++; 28616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].mask |= 1 << c; 2862dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 28636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 28644d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 28654d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller for (c = 0; c < 2; ++c) 28664d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.two_side[c].hw < 0x40) 28674d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c] = p->cfg.io[ 28684d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c].hw]; 286906dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 287006dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.psiz < 0x40) 287106dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = p->cfg.io[p->cfg.psiz].hw; 28726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 28736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_FRAGMENT) { 28746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid, aid; 28756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned n = 0, m = pc->attr_nr - flat_nr; 28766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 28775de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller pc->allow32 = TRUE; 28785de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 28796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int base = (TGSI_SEMANTIC_POSITION == 28806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->info.input_semantic_name[0]) ? 0 : 1; 28818ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 28826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* non-flat interpolants have to be mapped to 28836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * the lower hardware IDs, so sort them: 28846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 28856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 28867494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller if (pc->interp_mode[i] == INTERP_FLAT) 28877494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller p->cfg.io[m++].id = i; 28887494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller else { 28896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!(pc->interp_mode[i] & INTERP_PERSPECTIVE)) 28906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].linear = TRUE; 28917494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller p->cfg.io[n++].id = i; 2892dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 28936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2894dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 28956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) /* set w-coordinate mask from perspective interp */ 28966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[0].mask |= p->cfg.regs[1] >> 24; 28978ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 28986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid = popcnt4( /* if fcrd isn't contained in cfg.io */ 28996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller base ? (p->cfg.regs[1] >> 24) : p->cfg.io[0].mask); 2900dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 29016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (n = 0; n < pc->attr_nr; ++n) { 29026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].hw = rid = aid; 29037494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller i = p->cfg.io[n].id; 29046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29055de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller if (p->info.input_semantic_name[n] == 29065de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller TGSI_SEMANTIC_FACE) { 29075de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller load_frontfacing(pc, &pc->attr[i * 4]); 29085de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller continue; 29095de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller } 29105de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 29116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 29126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->attr[i * 4 + c].acc) 29136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 29146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i * 4 + c].rhw = rid++; 29156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].mask |= 1 << c; 29166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller load_interpolant(pc, &pc->attr[i * 4 + c]); 2918dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 29196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid += popcnt4(p->cfg.io[n].mask); 2920dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2921f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 29226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) 29236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.io[0].mask << 24; 29246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = popcnt4(p->cfg.regs[1] >> 24); 29266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* set count of non-position inputs and of non-flat 29286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * non-position inputs for FP_INTERPOLANT_CTRL 29296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 29306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= aid - m; 29316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (flat_nr) { 29336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[pc->attr_nr - flat_nr].hw; 29346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= (i - m) << 16; 29356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 29366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.regs[1] << 16; 29376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* mark color semantic for light-twoside */ 29396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = 0x40; 29406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 29416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si, sn; 2942f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 29437494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller sn = p->info.input_semantic_name[p->cfg.io[i].id]; 29447494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller si = p->info.input_semantic_index[p->cfg.io[i].id]; 29456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (sn == TGSI_SEMANTIC_COLOR) { 29476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si] = p->cfg.io[i]; 29486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* increase colour count */ 29506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += popcnt4( 29516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si].mask) << 16; 29526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = MIN2(n, p->cfg.io[i].hw - m); 29546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2955f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 29566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n < 0x40) 29576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += n; 29586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* Initialize FP results: 29606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * FragDepth is always first TGSI and last hw output 29616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 29626516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->info.writes_z ? 4 : 0; 29636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (rid = 0; i < pc->result_nr * 4; i++) 29646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[i].rhw = rid++; 29656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->info.writes_z) 29666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[2].rhw = rid; 29671196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29681196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller p->cfg.high_result = rid; 2969525f529d138168386224136dc45abb858677bac7Christoph Bumiller 2970525f529d138168386224136dc45abb858677bac7Christoph Bumiller /* separate/different colour results for MRTs ? */ 2971525f529d138168386224136dc45abb858677bac7Christoph Bumiller if (pc->result_nr - (p->info.writes_z ? 1 : 0) > 1) 2972525f529d138168386224136dc45abb858677bac7Christoph Bumiller p->cfg.regs[2] |= 1; 2973f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2974f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2975f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (pc->immd_nr) { 297694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller int rid = 0; 2977f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2978e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller pc->immd = MALLOC(pc->immd_nr * 4 * sizeof(struct nv50_reg)); 2979f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->immd) 2980f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2981f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2982f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < pc->immd_nr; i++) { 2983e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller for (c = 0; c < 4; c++, rid++) 2984e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(&pc->immd[rid], P_IMMD, i, rid); 2985f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2986f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2987f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2988f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = TRUE; 2989f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 29906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_p) 29916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_p); 29926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_c) 29936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_c); 29946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 29956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_free(&tp); 2996f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2997f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2998f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 29999417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerstatic void 30009417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerfree_nv50_pc(struct nv50_pc *pc) 30019417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller{ 30029417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->immd) 30039417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->immd); 30049417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->param) 30059417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->param); 30069417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->result) 30079417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->result); 30089417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->attr) 30099417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->attr); 30109417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->temp) 30119417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->temp); 30129417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 30139417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc); 30149417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller} 30159417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 3016f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 301738849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerctor_nv50_pc(struct nv50_pc *pc, struct nv50_program *p) 301838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller{ 301938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int i, c; 302038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned rtype[2] = { P_ATTR, P_RESULT }; 302138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 302238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->p = p; 302338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp_nr = p->info.file_max[TGSI_FILE_TEMPORARY] + 1; 302438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr_nr = p->info.file_max[TGSI_FILE_INPUT] + 1; 302538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result_nr = p->info.file_max[TGSI_FILE_OUTPUT] + 1; 302638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param_nr = p->info.file_max[TGSI_FILE_CONSTANT] + 1; 3027ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr_nr = p->info.file_max[TGSI_FILE_ADDRESS] + 1; 3028ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(pc->addr_nr <= 2); 302938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 303038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller p->cfg.high_temp = 4; 303138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 30326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[0].hw = 0x40; 30336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[1].hw = 0x40; 30346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 303538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller switch (p->type) { 303638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_VERTEX: 303706dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = 0x40; 30386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = 0x40; 30396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->result_nr; 304038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 304138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_FRAGMENT: 304238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller rtype[0] = rtype[1] = P_TEMP; 304338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 30446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] = 0x01000004; 30456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->attr_nr; 30466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 304738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.writes_z) { 30486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00000100; 30496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[3] |= 0x00000011; 305038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 305138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.uses_kill) 30526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00100000; 305338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 305438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 305538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 305638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->temp_nr) { 305738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp = MALLOC(pc->temp_nr * 4 * sizeof(struct nv50_reg)); 305838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->temp) 305938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 306038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 306138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->temp_nr * 4; ++i) 306238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->temp[i], P_TEMP, i / 4, -1); 306338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 306438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 306538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->attr_nr) { 306638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr = MALLOC(pc->attr_nr * 4 * sizeof(struct nv50_reg)); 306738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->attr) 306838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 306938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 307038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) 307138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->attr[i], rtype[0], i / 4, -1); 307238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 307338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 307438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->result_nr) { 307538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned nr = pc->result_nr * 4; 307638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 307738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result = MALLOC(nr * sizeof(struct nv50_reg)); 307838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->result) 307938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 308038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 308138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < nr; ++i) 308238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->result[i], rtype[1], i / 4, -1); 308338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 308438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 308538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->param_nr) { 308638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int rid = 0; 308738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 308838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param = MALLOC(pc->param_nr * 4 * sizeof(struct nv50_reg)); 308938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->param) 309038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 309138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 309238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->param_nr; ++i) 309338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (c = 0; c < 4; ++c, ++rid) 309438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->param[rid], P_CONST, i, rid); 309538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 309638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 3097ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->addr_nr) { 3098ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr = CALLOC(pc->addr_nr * 4, sizeof(struct nv50_reg *)); 3099ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!pc->addr) 3100ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return FALSE; 3101ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 3102ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 3103c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller ctor_reg(&pc->r_addr[i], P_ADDR, -256, i + 1); 3104ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 310538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return TRUE; 310638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller} 310738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 31081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 31091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_fp_move_results(struct nv50_pc *pc) 31101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 31111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_reg reg; 31121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i; 31131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ctor_reg(®, P_TEMP, -1, -1); 31151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < pc->result_nr * 4; ++i) { 31171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw < 0 || pc->result[i].hw < 0) 31181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 31191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw != pc->result[i].hw) { 31201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller reg.hw = pc->result[i].rhw; 31211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_mov(pc, ®, &pc->result[i]); 31221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 31231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 31241196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 31251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 31271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_program_fixup_insns(struct nv50_pc *pc) 31281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 3129cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller struct nv50_program_exec *e, **bra_list; 31301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i, n, pos; 31311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list = CALLOC(pc->p->exec_size, sizeof(struct nv50_program_exec *)); 31331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Collect branch instructions, we need to adjust their offsets 31351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * when converting 32 bit instructions to 64 bit ones 31361196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 31371196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (n = 0, e = pc->p->exec_head; e; e = e->next) 31381196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.index >= 0 && !e->param.mask) 31391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[n++] = e; 31401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 3141cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller /* last instruction must be long so it can have the exit bit set */ 3142cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller if (!is_long(pc->p->exec_tail)) 3143cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller convert_to_long(pc, pc->p->exec_tail); 3144cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller /* set exit bit */ 3145cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller pc->p->exec_tail->inst[1] |= 1; 3146cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller 3147cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller /* !immd on exit insn simultaneously means !join */ 3148cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller assert(!is_immd(pc->p->exec_head)); 3149cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller assert(!is_immd(pc->p->exec_tail)); 3150cad14c2542698de144bb5434cefa02d7a00aaa74Christoph Bumiller 31511196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Make sure we don't have any single 32 bit instructions. */ 31521196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (e = pc->p->exec_head, pos = 0; e; e = e->next) { 31531196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pos += is_long(e) ? 2 : 1; 31541196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31551196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if ((pos & 1) && (!e->next || is_long(e->next))) { 31561196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < n; ++i) 31571196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (bra_list[i]->param.index >= pos) 31581196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[i]->param.index += 1; 31591196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, e); 31601196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ++pos; 31611196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 31621196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 31631196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller FREE(bra_list); 31651196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 31661196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 316738849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerstatic boolean 3168f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx(struct nv50_program *p) 3169f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3170f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct tgsi_parse_context parse; 3171f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_pc *pc; 3172f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret; 3173f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3174f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc = CALLOC_STRUCT(nv50_pc); 3175f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc) 3176f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 317738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 317838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ret = ctor_nv50_pc(pc, p); 317938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (ret == FALSE) 318038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller goto out_cleanup; 3181f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3182f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = nv50_program_tx_prep(pc); 3183f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 3184f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_cleanup; 3185f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3186f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_init(&parse, pc->p->pipe.tokens); 3187f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs while (!tgsi_parse_end_of_tokens(&parse)) { 3188f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const union tgsi_full_token *tok = &parse.FullToken; 3189f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3190d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller /* don't allow half insn/immd on first and last instruction */ 3191d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = TRUE; 3192d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (pc->insn_cur == 0 || pc->insn_cur + 2 == pc->insn_nr) 3193d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = FALSE; 3194d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 3195f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_token(&parse); 3196f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3197f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 3198f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 3199bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller ++pc->insn_cur; 3200234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller ret = nv50_tgsi_insn(pc, tok); 3201f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 3202f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 3203f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 3204f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 3205f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 3206f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3207f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3208f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 32091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->p->type == PIPE_SHADER_FRAGMENT) 32101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_fp_move_results(pc); 321144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 32121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_program_fixup_insns(pc); 321340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3214aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs p->param_nr = pc->param_nr * 4; 3215f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd_nr = pc->immd_nr * 4; 3216f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd = pc->immd_buf; 3217f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3218f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 3219f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_free(&parse); 3220f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3221f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_cleanup: 32229417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller free_nv50_pc(pc); 3223f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 3224f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3225f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3226f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 3227f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_validate(struct nv50_context *nv50, struct nv50_program *p) 3228f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3229e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs if (nv50_program_tx(p) == FALSE) 3230e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs assert(0); 3231f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = TRUE; 3232f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3233f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 323422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 3235ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsnv50_program_upload_data(struct nv50_context *nv50, float *map, 323694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller unsigned start, unsigned count, unsigned cbuf) 3237ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs{ 323880e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 323975f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 324075f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs 3241ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs while (count) { 3242ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs unsigned nr = count > 2047 ? 2047 : count; 3243ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 324493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 324594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller OUT_RING (chan, (cbuf << 0) | (start << 8)); 324693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 324775f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, map, nr); 3248ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3249ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs map += nr; 3250ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs start += nr; 3251ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs count -= nr; 3252ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs } 3253ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs} 3254ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3255ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsstatic void 325622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) 325722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 32586b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs struct pipe_screen *pscreen = nv50->pipe.screen; 325922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 326094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller if (!p->data[0] && p->immd_nr) { 326194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nouveau_resource *heap = nv50->screen->immd_heap[0]; 326294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 32631b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) { 326494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller while (heap->next && heap->size < p->immd_nr) { 326594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nv50_program *evict = heap->next->priv; 32661b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&evict->data[0]); 326794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 326894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 32691b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, 32701b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs &p->data[0])) 327194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller assert(0); 327294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 327394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 327494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller /* immediates only need to be uploaded again when freed */ 327594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller nv50_program_upload_data(nv50, p->immd, p->data[0]->start, 327694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller p->immd_nr, NV50_CB_PMISC); 327794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 3278aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3279ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(p->param_nr <= 512); 3280aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3281aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs if (p->param_nr) { 3282750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned cb; 32836b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type], 32846b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs PIPE_BUFFER_USAGE_CPU_READ); 3285750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 3286750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->type == PIPE_SHADER_VERTEX) 3287750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PVP; 3288750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller else 3289750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PFP; 3290750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 3291750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller nv50_program_upload_data(nv50, map, 0, p->param_nr, cb); 32926b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]); 3293aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 329422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 329522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 329622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 329722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) 329822e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 329980e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 330040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e; 33019831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller uint32_t *up, i; 3302f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs boolean upload = FALSE; 330322e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 3304072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs if (!p->bo) { 3305072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_new(chan->device, NOUVEAU_BO_VRAM, 0x100, 3306072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs p->exec_size * 4, &p->bo); 3307f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs upload = TRUE; 3308f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs } 330940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3310750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0] && p->data[0]->start != p->data_start[0]) 3311750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller upload = TRUE; 3312ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3313750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (!upload) 3314750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller return; 3315ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 33169831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up = MALLOC(p->exec_size * 4); 33179831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller 33189831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller for (i = 0, e = p->exec_head; e; e = e->next) { 3319750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned ei, ci, bs; 33201c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 33219831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (e->param.index >= 0 && e->param.mask) { 33229831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller bs = (e->inst[1] >> 22) & 0x07; 33239831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller assert(bs < 2); 33249831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ei = e->param.shift >> 5; 33259831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ci = e->param.index; 33269831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (bs == 0) 33279831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ci += p->data[bs]->start; 33281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 33299831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller e->inst[ei] &= ~e->param.mask; 33309831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller e->inst[ei] |= (ci << e->param.shift); 33319831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller } else 33329831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (e->param.index >= 0) { 33339831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller /* zero mask means param is a jump/branch offset */ 33341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(e->param.index & 1)); 33351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* seem to be 8 byte steps */ 33361196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ei = (e->param.index >> 1) + 0 /* START_ID */; 33371196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 33381196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] &= 0xf0000fff; 33391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= ei << 12; 33401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 33411196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 33429831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up[i++] = e->inst[0]; 33439831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (is_long(e)) 33449831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up[i++] = e->inst[1]; 3345aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 33469831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller assert(i == p->exec_size); 3347aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3348750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0]) 3349750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller p->data_start[0] = p->data[0]->start; 3350f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs 3351b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#ifdef NV50_PROGRAM_DUMP 33520d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("-------\n"); 3353aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs for (e = p->exec_head; e; e = e->next) { 33540d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[0]); 33550d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs if (is_long(e)) 33560d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[1]); 3357b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs } 3358b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#endif 33599831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller nv50_upload_sifc(nv50, p->bo, 0, NOUVEAU_BO_VRAM, 33609831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller NV50_2D_DST_FORMAT_R8_UNORM, 65536, 1, 262144, 33619831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up, NV50_2D_SIFC_FORMAT_R8_UNORM, 0, 33629831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller 0, 0, p->exec_size * 4, 1, 1); 3363cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3364cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs FREE(up); 336522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 336622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 3367f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3368f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_vertprog_validate(struct nv50_context *nv50) 3369f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3370f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3371f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->vertprog; 3372f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3373f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3374f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3375f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3376f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3377f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3378f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3379f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 338022e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_data(nv50, p); 338122e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_code(nv50, p); 3382f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3383e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(13, 2); 3384f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_VP_ADDRESS_HIGH, 2); 3385072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3386072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3387072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3388072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 338993ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_ATTR_EN_0, 2); 33906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[0]); 33916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[1]); 339293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1); 3393fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs so_data (so, p->cfg.high_result); 339493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 2); 3395bcbe6baac37915563bc120ad558cd930bc1ddec1Ben Skeggs so_data (so, p->cfg.high_result); //8); 33968ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 339793ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_START_ID, 1); 3398f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_data (so, 0); /* program start offset */ 3399bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.vertprog); 3400ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3401f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3402f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3403f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3404f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_fragprog_validate(struct nv50_context *nv50) 3405f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3406f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3407f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->fragprog; 3408f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3409f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3410f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3411f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3412f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3413f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3414f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3415f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 341655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_data(nv50, p); 341755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_code(nv50, p); 3418f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3419585ae74d87f3d04a4b5b7c068b865292afd1a16bBen Skeggs so = so_new(64, 2); 3420f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_FP_ADDRESS_HIGH, 2); 3421072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3422072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3423072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3424072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 34256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_REG_ALLOC_TEMP, 1); 34268ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 342793ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_RESULT_COUNT, 1); 3428dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller so_data (so, p->cfg.high_result); 342993ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK19A8, 1); 34306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[2]); 343193ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK196C, 1); 34326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[3]); 343393ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_START_ID, 1); 34348ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, 0); /* program start offset */ 3435bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.fragprog); 3436ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3437f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3438f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 343901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillerstatic void 344001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillernv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base) 344101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller{ 344201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 344301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 344401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned i, c, m = base; 344501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 34467494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller /* XXX: this might not work correctly in all cases yet - we'll 34477494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller * just assume that an FP generic input that is not written in 34487494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller * the VP is PointCoord. 344901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller */ 345001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller memset(pntc, 0, 8 * sizeof(uint32_t)); 345101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 345201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (i = 0; i < fp->cfg.io_nr; i++) { 345301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t sn, si; 34547494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller uint8_t j, k = fp->cfg.io[i].id; 345501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned n = popcnt4(fp->cfg.io[i].mask); 345601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 345701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (fp->info.input_semantic_name[k] != TGSI_SEMANTIC_GENERIC) { 345801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 345901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 346001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 346101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 34627494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller for (j = 0; j < vp->info.num_outputs; ++j) { 34637494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller sn = vp->info.output_semantic_name[j]; 34647494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller si = vp->info.output_semantic_index[j]; 346501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 34667494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller if (sn == fp->info.input_semantic_name[k] && 34677494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller si == fp->info.input_semantic_index[k]) 34687494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller break; 34697494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller } 34707494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller 34717494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller if (j < vp->info.num_outputs) { 347201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ubyte mode = 347301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50->rasterizer->pipe.sprite_coord_mode[si]; 347401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 347501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (mode == PIPE_SPRITE_COORD_NONE) { 347601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 347701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 347801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 347901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 348001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 348101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* this is either PointCoord or replaced by sprite coords */ 348201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (c = 0; c < 4; c++) { 348301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (!(fp->cfg.io[i].mask & (1 << c))) 348401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 348501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller pntc[m / 8] |= (c + 1) << ((m % 8) * 4); 348601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ++m; 348701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 348801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 348901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller} 349001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 34916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic int 34926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_sreg4_map(uint32_t *p_map, int mid, uint32_t lin[4], 34936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 *fpi, struct nv50_sreg4 *vpo) 34946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 34956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int c; 34966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t mv = vpo->mask, mf = fpi->mask, oid = vpo->hw; 34976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t *map = (uint8_t *)p_map; 34986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 34996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 35006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (mf & 1) { 35016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fpi->linear == TRUE) 35026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller lin[mid / 32] |= 1 << (mid % 32); 35036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[mid++] = (mv & 1) ? oid : ((c == 3) ? 0x41 : 0x40); 35046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 35056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller oid += mv & 1; 35076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mf >>= 1; 35086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mv >>= 1; 35096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 35106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return mid; 35126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 35136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillervoid 35156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_linkage_validate(struct nv50_context *nv50) 35166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 35176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_grobj *tesla = nv50->screen->tesla; 35186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 35196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 35206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_stateobj *so; 35216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 dummy, *vpo; 35226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int i, n, c, m = 0; 352301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint32_t map[16], lin[4], reg[5], pcrd[8]; 35246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(map, 0, sizeof(map)); 35266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(lin, 0, sizeof(lin)); 35276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = 0x00000004; /* low and high clip distance map ids */ 35296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[2] = 0x00000000; /* layer index map id (disabled, GP only) */ 35306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[3] = 0x00000000; /* point size map id & enable */ 35316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] = fp->cfg.regs[0]; /* colour semantic reg */ 35326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] = fp->cfg.regs[1]; /* interpolant info */ 35336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.linear = FALSE; 35356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0xf; /* map all components of HPOS */ 35366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &dummy, &vp->cfg.io[0]); 35376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0x0; 35396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (vp->cfg.clpd < 0x40) { 35416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < vp->cfg.clpd_nr; ++c) 35426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[m++] = vp->cfg.clpd + c; 35436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = (m << 8); 35446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 35456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] |= m << 8; /* adjust BFC0 id */ 35474d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 35484d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller /* if light_twoside is active, it seems FFC0_ID == BFC0_ID is bad */ 35494d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (nv50->rasterizer->pipe.light_twoside) { 35504d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller vpo = &vp->cfg.two_side[0]; 35514d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 35524d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[0], &vpo[0]); 35534d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[1], &vpo[1]); 35544d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller } 35554d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 35566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] += m - 4; /* adjust FFC0 id */ 35576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] |= m << 8; /* set mid where 'normal' FP inputs start */ 35586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35597494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller for (i = 0; i < fp->cfg.io_nr; i++) { 35607494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller ubyte sn = fp->info.input_semantic_name[fp->cfg.io[i].id]; 35617494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller ubyte si = fp->info.input_semantic_index[fp->cfg.io[i].id]; 35627494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller 35637494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller /* position must be mapped first */ 35647494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller assert(i == 0 || sn != TGSI_SEMANTIC_POSITION); 35657494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller 35667494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller /* maybe even remove these from cfg.io */ 35677494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller if (sn == TGSI_SEMANTIC_POSITION || sn == TGSI_SEMANTIC_FACE) 35687494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller continue; 35697494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller 35707494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller /* VP outputs and vp->cfg.io are in the same order */ 35717494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller for (n = 0; n < vp->info.num_outputs; ++n) { 35727494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller if (vp->info.output_semantic_name[n] == sn && 35737494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller vp->info.output_semantic_index[n] == si) 35747494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller break; 35757494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller } 35767494b829052a87d7a8c56c68300a110b40e401e8Christoph Bumiller vpo = (n < vp->info.num_outputs) ? &vp->cfg.io[n] : &dummy; 35776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.io[i], vpo); 35796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 35806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 358106dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (nv50->rasterizer->pipe.point_size_per_vertex) { 358206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller map[m / 4] |= vp->cfg.psiz << ((m % 4) * 8); 358306dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller reg[3] = (m++ << 4) | 1; 358406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller } 358506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 35866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* now fill the stateobj */ 35876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so = so_new(64, 0); 35886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = (m + 3) / 4; 35906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 1); 35916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, m); 35926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP(0), n); 35936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, map, n); 35946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_MAP_SEMANTIC_0, 4); 35966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, reg, 4); 35976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 35986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_INTERPOLANT_CTRL, 1); 35996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, reg[4]); 36006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 36016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, 0x1540, 4); 36026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, lin, 4); 36036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 360401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (nv50->rasterizer->pipe.point_sprite) { 360501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50_pntc_replace(nv50, pcrd, (reg[4] >> 8) & 0xff); 360601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 360701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_method(so, tesla, NV50TCL_POINT_COORD_REPLACE_MAP(0), 8); 360801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_datap (so, pcrd, 8); 360901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 361001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 36116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(so, &nv50->state.programs); 36126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(NULL, &so); 36136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 36146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 3615f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3616f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 3617f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 361840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs while (p->exec_head) { 361940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = p->exec_head; 362040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 362140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e->next; 362240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs FREE(e); 3623f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 362440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = NULL; 362540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size = 0; 3626f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3627072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_ref(NULL, &p->bo); 3628f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 36291b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&p->data[0]); 36307c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 3631f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = 0; 3632f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3633