nv50_program.c revision fe2b31e4a896167a33d267822b36eb2de0ceecba
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 134e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller unsigned interp_mode[32]; 135dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller /* perspective interpolation registers */ 136dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_p; 137dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_c; 138e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 1391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_cond; 1401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_insn[MAX_IF_DEPTH]; 1411196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *br_join[MAX_IF_DEPTH]; 142e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller struct nv50_program_exec *br_loop[MAX_LOOP_DEPTH]; /* for BRK branch */ 143e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int if_lvl, loop_lvl; 144e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller unsigned loop_pos[MAX_LOOP_DEPTH]; 1451196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 146bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller /* current instruction and total number of insns */ 147bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_cur; 148bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_nr; 149d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 150d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller boolean allow32; 151f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 152f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 153e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerstatic INLINE void 154e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerctor_reg(struct nv50_reg *reg, unsigned type, int index, int hw) 155e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller{ 156e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->type = type; 157e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->index = index; 158e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->hw = hw; 159317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller reg->mod = 0; 160e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->rhw = -1; 161e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->acc = 0; 162e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller} 163e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller 1646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 1656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerpopcnt4(uint32_t val) 1666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 1676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller static const unsigned cnt[16] 1686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 1696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return cnt[val & 0xf]; 1706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 1716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 172f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 173ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerterminate_mbb(struct nv50_pc *pc) 174ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 175ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 176ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 177ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* remove records of temporary address register values */ 178ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 179ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index < 0) 180ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 181ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 182ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 183ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 184f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_reg(struct nv50_pc *pc, struct nv50_reg *reg) 185f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 186f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller int i = 0; 187f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 188fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (reg->type == P_RESULT) { 189fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (pc->p->cfg.high_result < (reg->hw + 1)) 190fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs pc->p->cfg.high_result = reg->hw + 1; 191fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs } 192fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs 1938ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->type != P_TEMP) 194f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 195f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1968ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->hw >= 0) { 1978ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs /*XXX: do this here too to catch FP temp-as-attr usage.. 1988ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs * not clean, but works */ 1998ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (reg->hw + 1)) 2008ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = reg->hw + 1; 2018ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs return; 2028ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs } 2038ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 204f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (reg->rhw != -1) { 205f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* try to allocate temporary with index rhw first */ 206f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (!(pc->r_temp[reg->rhw])) { 207f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->r_temp[reg->rhw] = reg; 208f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller reg->hw = reg->rhw; 209f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (pc->p->cfg.high_temp < (reg->rhw + 1)) 210f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->p->cfg.high_temp = reg->rhw + 1; 211f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller return; 212f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 213f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* make sure we don't get things like $r0 needs to go 214f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller * in $r1 and $r1 in $r0 215f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller */ 216f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller i = pc->result_nr * 4; 217f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 218f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller 219f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller for (; i < NV50_SU_MAX_TEMP; i++) { 220f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!(pc->r_temp[i])) { 221f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = reg; 222f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs reg->hw = i; 2238ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (i + 1)) 2248ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = i + 1; 225f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 226f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 227f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 228f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 229f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 230f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 231f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 232e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* XXX: For shaders that aren't executed linearly (e.g. shaders that 233e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * contain loops), we need to assign all hw regs to TGSI TEMPs early, 234e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * lest we risk temp_temps overwriting regs alloc'd "later". 235e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 236f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 237f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_temp(struct nv50_pc *pc, struct nv50_reg *dst) 238f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 239f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r; 240f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i; 241f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 242f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (dst && dst->type == P_TEMP && dst->hw == -1) 243f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return dst; 244f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 245f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < NV50_SU_MAX_TEMP; i++) { 246f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->r_temp[i]) { 247e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller r = MALLOC_STRUCT(nv50_reg); 248e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_TEMP, -1, i); 249f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = r; 250f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return r; 251f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 252f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 253f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 254f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 255f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return NULL; 256f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 257f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 258dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller/* Assign the hw of the discarded temporary register src 259dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller * to the tgsi register dst and free src. 260dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller */ 261dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic void 262dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerassimilate_temp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 263dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 264dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assert(src->index == -1 && src->hw != -1); 265dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 266dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (dst->hw != -1) 267dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[dst->hw] = NULL; 268dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[src->hw] = dst; 269dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller dst->hw = src->hw; 270dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 271dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller FREE(src); 272dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 273dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 2747ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller/* release the hardware resource held by r */ 2757ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 2767ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerrelease_hw(struct nv50_pc *pc, struct nv50_reg *r) 2777ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 2787ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(r->type == P_TEMP); 2797ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->hw == -1) 2807ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller return; 2817ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2827ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(pc->r_temp[r->hw] == r); 2837ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller pc->r_temp[r->hw] = NULL; 2847ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2857ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller r->acc = 0; 2867ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->index == -1) 2877ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller FREE(r); 2887ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 2897ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 290f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 291f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsfree_temp(struct nv50_pc *pc, struct nv50_reg *r) 292f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 293f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (r->index == -1) { 294619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs unsigned hw = r->hw; 295619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs 296619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs FREE(pc->r_temp[hw]); 297619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs pc->r_temp[hw] = NULL; 298f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 299f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 300f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3013f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic int 3023f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsalloc_temp4(struct nv50_pc *pc, struct nv50_reg *dst[4], int idx) 3033f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3043f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3053f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3063f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if ((idx + 4) >= NV50_SU_MAX_TEMP) 3073f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 1; 3083f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3093f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if (pc->r_temp[idx] || pc->r_temp[idx + 1] || 3103f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + 2] || pc->r_temp[idx + 3]) 311a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller return alloc_temp4(pc, dst, idx + 4); 3123f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3133f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) { 314e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller dst[i] = MALLOC_STRUCT(nv50_reg); 315e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(dst[i], P_TEMP, -1, idx + i); 3163f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + i] = dst[i]; 3173f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs } 3183f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3193f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 0; 3203f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3213f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3223f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic void 3233f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsfree_temp4(struct nv50_pc *pc, struct nv50_reg *reg[4]) 3243f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3253f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3263f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3273f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) 3283f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs free_temp(pc, reg[i]); 3293f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3303f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 331f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 3322a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggstemp_temp(struct nv50_pc *pc) 3332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 33421e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (pc->temp_temp_nr >= 16) 3352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs assert(0); 3362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp[pc->temp_temp_nr] = alloc_temp(pc, NULL); 3382a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return pc->temp_temp[pc->temp_temp_nr++]; 3392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 3422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggskill_temp_temp(struct nv50_pc *pc) 3432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 3442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs int i; 3452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs for (i = 0; i < pc->temp_temp_nr; i++) 3472a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs free_temp(pc, pc->temp_temp[i]); 3482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp_nr = 0; 3492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 35133e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic int 35233e4d30d50344be26398a51365bea1be37487403Ben Skeggsctor_immd(struct nv50_pc *pc, float x, float y, float z, float w) 35333e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 354f1aa2a43b7588aaca3ef175c8cc5366414cac2f8Christoph Bumiller pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * 4 * sizeof(float)), 355861629d1fd4a1d256c913470c33d9522e83d615dBen Skeggs (pc->immd_nr + 1) * 4 * sizeof(float)); 35633e4d30d50344be26398a51365bea1be37487403Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 0] = x; 357686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 1] = y; 358686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 2] = z; 359686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 3] = w; 36033e4d30d50344be26398a51365bea1be37487403Ben Skeggs 36133e4d30d50344be26398a51365bea1be37487403Ben Skeggs return pc->immd_nr++; 36233e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 36333e4d30d50344be26398a51365bea1be37487403Ben Skeggs 36433e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic struct nv50_reg * 36533e4d30d50344be26398a51365bea1be37487403Ben Skeggsalloc_immd(struct nv50_pc *pc, float f) 36633e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 367e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller struct nv50_reg *r = MALLOC_STRUCT(nv50_reg); 36833e4d30d50344be26398a51365bea1be37487403Ben Skeggs unsigned hw; 36933e4d30d50344be26398a51365bea1be37487403Ben Skeggs 3707e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller for (hw = 0; hw < pc->immd_nr * 4; hw++) 3717e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (pc->immd_buf[hw] == f) 3727e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller break; 3737e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 3747e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (hw == pc->immd_nr * 4) 3757e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller hw = ctor_immd(pc, f, -f, 0.5 * f, 0) * 4; 3767e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 377e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_IMMD, -1, hw); 37833e4d30d50344be26398a51365bea1be37487403Ben Skeggs return r; 37933e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 38033e4d30d50344be26398a51365bea1be37487403Ben Skeggs 38140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic struct nv50_program_exec * 38240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsexec(struct nv50_pc *pc) 38340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs{ 38440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = CALLOC_STRUCT(nv50_program_exec); 38540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3861c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = -1; 38740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs return e; 38840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs} 38940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 39055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 39140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsemit(struct nv50_pc *pc, struct nv50_program_exec *e) 39255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 39355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs struct nv50_program *p = pc->p; 39455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 39540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (p->exec_tail) 39640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail->next = e; 39740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (!p->exec_head) 39840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e; 39940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = e; 40040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size += (e->inst[0] & 1) ? 2 : 1; 40155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 40255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 40340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic INLINE void set_long(struct nv50_pc *, struct nv50_program_exec *); 40455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 40555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 40640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_long(struct nv50_program_exec *e) 40755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 40840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 1) 40955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 41055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 41155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 41255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 41355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 41440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_immd(struct nv50_program_exec *e) 41555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 41640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && (e->inst[1] & 3) == 3) 41755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 41855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 41955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 42055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 42240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred(struct nv50_pc *pc, unsigned pred, unsigned idx, 42340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 42455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 42540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 42640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x1f << 7) | (0x3 << 12)); 42740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (pred << 7) | (idx << 12); 42855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 42955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 43140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred_wr(struct nv50_pc *pc, unsigned on, unsigned idx, 43240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 43355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 43440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 43540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x3 << 4) | (1 << 6)); 43640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (idx << 4) | (on << 6); 43755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 43855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 44040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_long(struct nv50_pc *pc, struct nv50_program_exec *e) 44155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 44240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e)) 44355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return; 44455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 44540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 1; 44640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0xf, 0, e); 44740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 44855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 44955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 45140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_dst(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_program_exec *e) 45255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 45355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (dst->type == P_RESULT) { 45440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 45540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000008; 45655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 45755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, dst); 459ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (dst->hw > 63) 460ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 46140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (dst->hw << 2); 46255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 46355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 46455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 46540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct nv50_program_exec *e) 46655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 467317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller unsigned val; 468c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller float f = pc->immd_buf[imm->hw]; 469317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller 470317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (imm->mod & NV50_MOD_ABS) 471317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller f = fabsf(f); 472317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller val = fui((imm->mod & NV50_MOD_NEG) ? -f : f); 47355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 47440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 47555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: can't be predicated - bits overlap.. catch cases where both 47655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * are required and avoid them. */ 47740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0, 0, e); 47840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 47955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 48040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000002 | 0x00000001; 48140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (val & 0x3f) << 16; 48240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (val >> 6) << 2; 48355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 48455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 485c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumillerstatic INLINE void 486c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumillerset_addr(struct nv50_program_exec *e, struct nv50_reg *a) 487c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller{ 488c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller assert(!(e->inst[0] & 0x0c000000)); 489c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller assert(!(e->inst[1] & 0x00000004)); 490c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 491c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] |= (a->hw & 3) << 26; 492c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[1] |= (a->hw >> 2) << 2; 493c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller} 494c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 495ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 496c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumilleremit_add_addr_imm(struct nv50_pc *pc, struct nv50_reg *dst, 497c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller struct nv50_reg *src0, uint16_t src1_val) 498ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 499ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 500ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 501c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] = 0xd0000000 | (src1_val << 9); 502ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] = 0x20000000; 503ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 504c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->inst[0] |= dst->hw << 2; 505c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (src0) /* otherwise will add to $a0, which is always 0 */ 506c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller set_addr(e, src0); 507ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 508ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 509ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 510ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 511ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic struct nv50_reg * 512ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleralloc_addr(struct nv50_pc *pc, struct nv50_reg *ref) 513ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 514ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 515c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller struct nv50_reg *a_tgsi = NULL, *a = NULL; 516ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 517ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!ref) { 518c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller /* allocate for TGSI address reg */ 519ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) { 520ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) 521ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 522ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw >= 0 && 523ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc == pc->insn_cur) 524ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 525ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 526ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 527ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].index = i; 528ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 529ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 530ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(0); 531ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return NULL; 532ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 533ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 534c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller /* Allocate and set an address reg so we can access 'ref'. 535c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * 536c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * If and r_addr has index < 0, it is not reserved for TGSI, 537c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * and index will be the negative of the TGSI addr index the 538c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * value in rhw is relative to, or -256 if rhw is an offset 539c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller * from 0. If rhw < 0, the reg has not been initialized. 540c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller */ 541ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = NV50_SU_MAX_ADDR - 1; i >= 0; --i) { 542ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) /* occupied for TGSI */ 543ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 544ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw < 0) { /* unused */ 545ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 546ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 547ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 548ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!a && pc->r_addr[i].acc != pc->insn_cur) 549ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 550ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 551c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (ref->hw - pc->r_addr[i].rhw >= 128) 552c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller continue; 553c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 554c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if ((ref->acc >= 0 && pc->r_addr[i].index == -256) || 555c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller (ref->acc < 0 && -pc->r_addr[i].index == ref->index)) { 556ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc = pc->insn_cur; 557ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 558ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 559ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 560ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(a); 561ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 562c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller if (ref->acc < 0) 563c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a_tgsi = pc->addr[ref->index]; 564c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 565c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller emit_add_addr_imm(pc, a, a_tgsi, (ref->hw & ~0x7f) * 4); 566c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller 567c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a->rhw = ref->hw & ~0x7f; 568ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a->acc = pc->insn_cur; 569c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller a->index = a_tgsi ? -ref->index : -256; 570ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return a; 571ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 572e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 573e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_LINEAR 0 574ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller#define INTERP_FLAT 1 575e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_PERSPECTIVE 2 576e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_CENTROID 4 577e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 578dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller/* interpolant index has been stored in dst->rhw */ 57955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 580dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumilleremit_interp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *iv, 581dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller unsigned mode) 5828ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs{ 583dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller assert(dst->rhw != -1); 58440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 5858ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 58640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x80000000; 58740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 588dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (dst->rhw << 16); 589dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 590dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_FLAT) { 591dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 8); 592dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } else { 593dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_PERSPECTIVE) { 594dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 25); 595dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller alloc_reg(pc, iv); 596dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (iv->hw << 9); 597dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 598dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 599dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_CENTROID) 600dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 24); 6015a3ea9ee59ac586955f7784eb25e7fd70d0c8882Ben Skeggs } 6028ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 60340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 6048ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs} 6058ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 6068ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggsstatic void 6071c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggsset_data(struct nv50_pc *pc, struct nv50_reg *src, unsigned m, unsigned s, 6081c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs struct nv50_program_exec *e) 6092a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 61040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6111c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 612c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller e->param.index = src->hw & 127; 6131c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.shift = s; 6141c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.mask = m << (s % 32); 61594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 616ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->hw > 127) 617ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, alloc_addr(pc, src)); 618ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller else 619ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->acc < 0) { 620ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src->type == P_CONST); 621ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, pc->addr[src->index]); 622ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 623ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 62494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller e->inst[1] |= (((src->type == P_IMMD) ? 0 : 1) << 22); 6252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 62855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsemit_mov(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 62955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 63040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 63155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6322eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller e->inst[0] = 0x10000000; 6332eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!pc->allow32) 6342eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_long(pc, e); 63555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 63640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 63755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6382eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!is_long(e) && src->type == P_IMMD) { 63940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_immd(pc, src, e); 64055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: 32-bit, but steals part of "half" reg space - need to 64155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * catch and handle this case if/when we do half-regs 64255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs */ 64355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else 64455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_IMMD || src->type == P_CONST) { 64540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6461c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 9, e); 64740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x20000000; /* src0 const? */ 64855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else { 64955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_ATTR) { 65040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 65140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 65255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 65355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 65455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, src); 655ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 656ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 65740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 65855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 65955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 66040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && !is_immd(e)) { 66140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x04000000; /* 32-bit */ 662d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x0000c000; /* "subsubop" 0x3 */ 663d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (!(e->inst[1] & 0x20000000)) 664d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x00030000; /* "subsubop" 0xf */ 665d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller } else 666d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[0] |= 0x00008000; 66755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 66840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 66955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 67055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6714a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumillerstatic INLINE void 6724a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumilleremit_mov_immdval(struct nv50_pc *pc, struct nv50_reg *dst, float f) 6734a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller{ 6744a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller struct nv50_reg *imm = alloc_immd(pc, f); 6754a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov(pc, dst, imm); 6764a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller FREE(imm); 6774a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller} 6784a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller 679f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 6802a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggscheck_swap_src_0_1(struct nv50_pc *pc, 6812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg **s0, struct nv50_reg **s1) 6822a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 6832a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src0 = *s0, *src1 = *s1; 6842a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6852a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type == P_CONST) { 6862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type != P_CONST) { 6872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 6882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 6892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 6902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6912a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6922a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type == P_ATTR) { 6932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type != P_ATTR) { 6942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 6952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 6962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 6972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return FALSE; 7012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 704001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerset_src_0_restricted(struct nv50_pc *pc, struct nv50_reg *src, 705001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_program_exec *e) 706001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller{ 707001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_reg *temp; 708001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 709001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (src->type != P_TEMP) { 710001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller temp = temp_temp(pc); 711001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller emit_mov(pc, temp, src); 712001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller src = temp; 713001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller } 714001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 715001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller alloc_reg(pc, src); 716ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 717ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 718001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller e->inst[0] |= (src->hw << 9); 719001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller} 720001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 721001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerstatic void 72240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_0(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7232a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 72540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 72640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 7272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 7292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7322a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7342a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 736ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 737ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 73840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 7392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 74240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_1(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 7452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7472a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 75140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x00800000)); 75240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x01000000) { 75334a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 75434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 75534a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 75634a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 75734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 7581c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 16, e); 75940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x00800000; 76034a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 7612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 764ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller if (src->hw > 63) 765ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller set_long(pc, e); 766ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= ((src->hw & 127) << 16); 7672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 77040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_2(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7712a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 77240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 7732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 7752a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7772a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7792a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7802a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 78140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x01000000)); 78240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x00800000) { 78334a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 78434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 78534a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 78634a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 78734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 7881c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 32+14, e); 78940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x01000000; 79034a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 7912a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7922a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 794ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= ((src->hw & 127) << 14); 7952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 7982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mul(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 7992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 8002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 80140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 80340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xc0000000; 8042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 805708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (!pc->allow32) 806708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 807708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 8082a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 80940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 81040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 811c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_IMMD && !is_long(e)) { 812317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src0->mod & NV50_MOD_NEG) 813c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 814708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 815c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } else { 816708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_src_1(pc, src1, e); 817317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if ((src0->mod ^ src1->mod) & NV50_MOD_NEG) { 818c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (is_long(e)) 819c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 820c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 821c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 822c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 823c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 8242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 82540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 82952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_add(struct nv50_pc *pc, struct nv50_reg *dst, 83052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 8312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 83240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 834ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller e->inst[0] = 0xb0000000; 8352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 836ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller alloc_reg(pc, src1); 837c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 838c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 839317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (!pc->allow32 || (src0->mod | src1->mod) || src1->hw > 63) { 840708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 841317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= ((src0->mod & NV50_MOD_NEG) << 26) | 842317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller ((src1->mod & NV50_MOD_NEG) << 27); 843c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 844708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 84540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 84640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 847c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_CONST || src1->type == P_ATTR || is_long(e)) 84840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src1, e); 84952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs else 850708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (src1->type == P_IMMD) 851708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 852708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller else 85340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 85452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 85540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 85652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs} 85752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 85852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsstatic void 859ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleremit_arl(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 860ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller uint8_t s) 861ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 862ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 863ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 864ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 865ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= 0xc0000000; 866ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 867ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= dst->hw << 2; 868ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= s << 16; /* shift left */ 869ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_src_0_restricted(pc, src, e); 870ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 871ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 872ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 873ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 874ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 87552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_minmax(struct nv50_pc *pc, unsigned sub, struct nv50_reg *dst, 87652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 87752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs{ 87840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 87952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 88040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 88140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 88240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 88352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 88452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 88540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 88640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 88740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 8882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 889317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src0->mod & NV50_MOD_ABS) 890317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= 0x00100000; 891317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src1->mod & NV50_MOD_ABS) 892317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller e->inst[1] |= 0x00080000; 893317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller 89440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 897c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 8982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_sub(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 8992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 9002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 901ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller assert(src0 != src1); 902317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src1->mod ^= NV50_MOD_NEG; 903c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_add(pc, dst, src0, src1); 904317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src1->mod ^= NV50_MOD_NEG; 9052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9062a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 9072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 90899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumilleremit_bitop2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 90999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller struct nv50_reg *src1, unsigned op) 91099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller{ 91199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller struct nv50_program_exec *e = exec(pc); 91299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 91399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] = 0xd0000000; 91499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_long(pc, e); 91599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 91699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 91799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_dst(pc, dst, e); 91899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_src_0(pc, src0, e); 91999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 92099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op != TGSI_OPCODE_AND && op != TGSI_OPCODE_OR && 92199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller op != TGSI_OPCODE_XOR) 92299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller assert(!"invalid bit op"); 92399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 92499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (src1->type == P_IMMD && src0->type == P_TEMP && pc->allow32) { 92599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_immd(pc, src1, e); 92699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_OR) 92799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] |= 0x0100; 92899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller else 92999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_XOR) 93099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[0] |= 0x8000; 93199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } else { 93299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller set_src_1(pc, src1, e); 93399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x04000000; /* 32 bit */ 93499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_OR) 93599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x4000; 93699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller else 93799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (op == TGSI_OPCODE_XOR) 93899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller e->inst[1] |= 0x8000; 93999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } 94099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 94199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller emit(pc, e); 94299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller} 94399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller 94499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumillerstatic void 9452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mad(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 9462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 9472a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 94840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 9492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 95040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xe0000000; 9512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 9522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 95340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 95440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 95540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 95640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src2, e); 9572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 958317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if ((src0->mod ^ src1->mod) & NV50_MOD_NEG) 959c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x04000000; 960317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src2->mod & NV50_MOD_NEG) 961c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 962c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 96340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 966c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 96721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsemit_msb(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 96821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 96921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs{ 970ad67326f12c0d6298cffc0fc4e421ddc02b3cb07Christoph Bumiller assert(src2 != src0 && src2 != src1); 971317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src2->mod ^= NV50_MOD_NEG; 972c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_mad(pc, dst, src0, src1, src2); 973317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src2->mod ^= NV50_MOD_NEG; 97421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs} 97521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs 97621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsstatic void 9772a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_flop(struct nv50_pc *pc, unsigned sub, 9782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *dst, struct nv50_reg *src) 9792a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 98040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 9812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 98240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x90000000; 98352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs if (sub) { 98440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 98540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 98652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs } 9872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 98840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 989001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 990001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (sub == 0 || sub == 2) 991001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0_restricted(pc, src, e); 992001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller else 993001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0(pc, src, e); 9942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 99540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 998d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsstatic void 999d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsemit_preex2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1000d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs{ 100140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 1002d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 100340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 1004d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 100540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 100640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 100740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 100840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29) | 0x00004000; 1009d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 101040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 1011d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs} 1012faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1013bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggsstatic void 10147b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_precossin(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 10157b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs{ 101640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 10177b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 101840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 10197b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 102040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 102140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 102240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 102340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29); 10247b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 102540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 10267b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs} 10277b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 102887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_RN 0x01 102987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_FLOOR 0x03 103087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_CEIL 0x05 103187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_TRUNC 0x07 103287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_SAT 0x08 103387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_ABS 0x10 103487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 10351635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller/* 0x04 == 32 bit dst */ 10362b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x40 == dst is float */ 10372b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x80 == src is float */ 103887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_F32 0xc4 103987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_S32 0x44 104087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_F32 0x8c 104187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_S32 0x0c 1042ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_NEG 0x20 1043ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_RI 0x08 104487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 104587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic void 104687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumilleremit_cvt(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 10472b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller int wp, unsigned cvn, unsigned fmt) 104887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller{ 104987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller struct nv50_program_exec *e; 105087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 105187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e = exec(pc); 105287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_long(pc, e); 105387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 105487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0xa0000000; 10551635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] |= 0x00004000; /* 32 bit src */ 10562b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= (cvn << 16); 105787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= (fmt << 24); 105887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_src_0(pc, src, e); 105987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 106087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (wp >= 0) 106187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_pred_wr(pc, 1, wp, e); 106287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 106387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (dst) 106487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_dst(pc, dst, e); 106587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller else { 106687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0x000001fc; 106787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= 0x00000008; 106887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller } 106987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 107087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit(pc, e); 107187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller} 107287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 10732b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* nv50 Condition codes: 10742b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x1 = LT 10752b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x2 = EQ 10762b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x3 = LE 10772b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x4 = GT 10782b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x5 = NE 10792b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x6 = GE 10802b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x7 = set condition code ? (used before bra.lt/le/gt/ge) 10812b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x8 = unordered bit (allows NaN) 10822b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller */ 10837b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsstatic void 10842b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumilleremit_set(struct nv50_pc *pc, unsigned ccode, struct nv50_reg *dst, int wp, 1085bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 1086bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs{ 1087d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller static const unsigned cc_swapped[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 1088d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller 108940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 1090bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *rdst; 1091bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 10922b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(ccode < 16); 1093bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (check_swap_src_0_1(pc, &src0, &src1)) 1094d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller ccode = cc_swapped[ccode & 7] | (ccode & 8); 1095bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1096bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs rdst = dst; 10972b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst && dst->type != P_TEMP) 1098bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs dst = alloc_temp(pc, NULL); 1099bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1100bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs /* set.u32 */ 110140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 110240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 11032b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x60000000 | (ccode << 14); 11042b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 11052b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* XXX: decuda will disasm as .u16 and use .lo/.hi regs, but 11062b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * that doesn't seem to match what the hw actually does 11072b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x04000000; << breaks things, u32 by default ? 1108bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs */ 11092b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 11102b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (wp >= 0) 11112b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_pred_wr(pc, 1, wp, e); 11122b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst) 11132b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_dst(pc, dst, e); 11142b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller else { 11152b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[0] |= 0x000001fc; 11162b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x00000008; 11172b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 11182b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 111940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 112040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 1121bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 112240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 11231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_cond = pc->p->exec_tail; /* record for OPCODE_IF */ 1124bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 11252b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* cvt.f32.u32/s32 (?) if we didn't only write the predicate */ 11262b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst) 11272b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_cvt(pc, rdst, dst, -1, CVTOP_ABS | CVTOP_RN, CVT_F32_S32); 11282b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst && rdst != dst) 1129bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs free_temp(pc, dst); 1130bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs} 1131d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 11322b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillerstatic INLINE unsigned 11332b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillermap_tgsi_setop_cc(unsigned op) 11342b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller{ 11352b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller switch (op) { 11362b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLT: return 0x1; 11372b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: return 0x6; 11382b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: return 0x2; 11392b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: return 0x4; 11402b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: return 0x3; 11412b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: return 0xd; 11422b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller default: 11432b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(0); 11442b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller return 0; 11452b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 11462b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller} 11472b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 114887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1149b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggsemit_flr(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1150b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs{ 1151ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_FLOOR, CVT_F32_F32 | CVT_RI); 1152b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs} 1153b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs 1154faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsstatic void 1155faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsemit_pow(struct nv50_pc *pc, struct nv50_reg *dst, 1156faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *v, struct nv50_reg *e) 1157faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs{ 1158faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *temp = alloc_temp(pc, NULL); 1159faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1160faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 3, temp, v); 1161faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_mul(pc, temp, temp, e); 1162faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_preex2(pc, temp, temp); 1163faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 6, dst, temp); 1164faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1165faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs free_temp(pc, temp); 1166faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs} 1167faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 116887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1169fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsemit_abs(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1170fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 117187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_ABS, CVT_F32_F32); 1172fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1173fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1174234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic INLINE void 1175234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumilleremit_sat(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1176234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 1177234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_SAT, CVT_F32_F32); 1178234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 1179234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 118001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggsstatic void 11817b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_lit(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 11827b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs struct nv50_reg **src) 118301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs{ 118401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *one = alloc_immd(pc, 1.0); 118501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *zero = alloc_immd(pc, 0.0); 118601e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *neg128 = alloc_immd(pc, -127.999999); 118701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *pos128 = alloc_immd(pc, 127.999999); 118801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *tmp[4]; 1189708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller boolean allow32 = pc->allow32; 1190708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1191708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = FALSE; 119201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11937b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (3 << 1)) { 1194dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller tmp[0] = alloc_temp(pc, NULL); 11957b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[0], src[0], zero); 11967b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 119701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11987b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 2)) { 119940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 1, 0, pc->p->exec_tail); 120001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12017b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[1] = temp_temp(pc); 12027b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[1], src[1], zero); 120301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12047b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[3] = temp_temp(pc); 12057b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[3], src[3], neg128); 12067b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 5, tmp[3], tmp[3], pos128); 120701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12087b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_pow(pc, dst[2], tmp[1], tmp[3]); 12097b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_mov(pc, dst[2], zero); 121040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 3, 0, pc->p->exec_tail); 12117b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 12129417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 1213dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 1)) 1214dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assimilate_temp(pc, dst[1], tmp[0]); 1215dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller else 1216dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 2)) 1217dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller free_temp(pc, tmp[0]); 1218dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1219708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = allow32; 1220708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1221dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller /* do this last, in case src[i,j] == dst[0,3] */ 1222dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 0)) 1223dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[0], one); 1224dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1225dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 3)) 1226dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[3], one); 1227dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 12289417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pos128); 12299417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(neg128); 12309417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(zero); 12319417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(one); 123201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs} 123301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 12341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic INLINE void 123531f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggsemit_neg(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 123631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs{ 12371635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_RN, CVT_F32_F32 | CVT_NEG); 123831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs} 123931f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs 1240d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsstatic void 1241d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsemit_kil(struct nv50_pc *pc, struct nv50_reg *src) 1242d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs{ 1243d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs struct nv50_program_exec *e; 1244d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs const int r_pred = 1; 1245eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller unsigned cvn = CVT_F32_F32; 1246d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1247317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (src->mod & NV50_MOD_NEG) 1248eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller cvn |= CVT_NEG; 1249eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* write predicate reg */ 1250eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller emit_cvt(pc, NULL, src, r_pred, CVTOP_RN, cvn); 1251d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1252eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* conditional discard */ 1253d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs e = exec(pc); 1254eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller e->inst[0] = 0x00000002; 1255d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs set_long(pc, e); 1256eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller set_pred(pc, 0x1 /* LT */, r_pred, e); 1257d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit(pc, e); 1258d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs} 1259d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 126044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerstatic void 1261618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumillerload_cube_tex_coords(struct nv50_pc *pc, struct nv50_reg *t[4], 1262618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller struct nv50_reg **src, boolean proj) 1263618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller{ 1264618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller int mod[3] = { src[0]->mod, src[1]->mod, src[2]->mod }; 1265618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1266618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[0]->mod |= NV50_MOD_ABS; 1267618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[1]->mod |= NV50_MOD_ABS; 1268618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[2]->mod |= NV50_MOD_ABS; 1269618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1270618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_minmax(pc, 4, t[2], src[0], src[1]); 1271618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_minmax(pc, 4, t[2], src[2], t[2]); 1272618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1273618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[0]->mod = mod[0]; 1274618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[1]->mod = mod[1]; 1275618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller src[2]->mod = mod[2]; 1276618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1277618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (proj && 0 /* looks more correct without this */) 1278618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[2], t[2], src[3]); 1279618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_flop(pc, 0, t[2], t[2]); 1280618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1281618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[0], src[0], t[2]); 1282618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[1], src[1], t[2]); 1283618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mul(pc, t[2], src[2], t[2]); 1284618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller} 1285618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller 1286618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumillerstatic void 12873accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumilleremit_tex(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 12883accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_reg **src, unsigned unit, unsigned type, boolean proj) 12893accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller{ 1290618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller struct nv50_reg *t[4]; 12913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_program_exec *e; 12923accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12933accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller unsigned c, mode, dim; 12943accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12953accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller switch (type) { 12963accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_1D: 12973accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 1; 12983accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 12993accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_UNKNOWN: 13003accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_2D: 13013accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW1D: /* XXX: x, z */ 13023accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_RECT: 13033accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 2; 13043accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 13053accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_3D: 13063accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_CUBE: 13073accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW2D: 13083accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOWRECT: /* XXX */ 13093accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 3; 13103accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 13113accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller default: 13123accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assert(0); 13133accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 13143accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 13153accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1316a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller /* some cards need t[0]'s hw index to be a multiple of 4 */ 13173accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller alloc_temp4(pc, t, 0); 13183accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1319618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (type == TGSI_TEXTURE_CUBE) { 1320618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller load_cube_tex_coords(pc, t, src, proj); 1321618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller } else 13223accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (proj) { 13233accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (src[0]->type == P_TEMP && src[0]->rhw != -1) { 13243accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller mode = pc->interp_mode[src[0]->index]; 13253accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13263accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[3]->rhw = src[3]->rhw; 13273accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[3], NULL, (mode & INTERP_CENTROID)); 13283accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], t[3]); 13293accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13303accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) { 13313accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[c]->rhw = src[c]->rhw; 13323accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[c], t[3], 13333accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller (mode | INTERP_PERSPECTIVE)); 13343accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 13353accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 13363accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], src[3]); 13373accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) 13383accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mul(pc, t[c], src[c], t[3]); 13393accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13403accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: for some reason the blob sometimes uses MAD: 13413accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * emit_mad(pc, t[c], src[0][c], t[3], t[3]) 13423accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * pc->p->exec_tail->inst[1] |= 0x080fc000; 13433accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller */ 13443accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 13453accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 1346618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller for (c = 0; c < dim; c++) 1347618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller emit_mov(pc, t[c], src[c]); 13483accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 13493accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13503accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e = exec(pc); 13513accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_long(pc, e); 13523accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0xf0000000; 13533accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= 0x00000004; 13543accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_dst(pc, t[0], e); 13553accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (unit << 9); 13563accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13573accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (dim == 2) 13583accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00400000; 13593accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 1360618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (dim == 3) { 13613accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00800000; 1362618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller if (type == TGSI_TEXTURE_CUBE) 1363618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller e->inst[0] |= 0x08000000; 1364618e3b89f6ecdf422132ecea19315b326dd348ecChristoph Bumiller } 13653accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13663accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (mask & 0x3) << 25; 13673accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= (mask & 0xc) << 12; 13683accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13693accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit(pc, e); 13703accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#if 1 13715f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller c = 0; 13725f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 1) emit_mov(pc, dst[0], t[c++]); 13735f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 2) emit_mov(pc, dst[1], t[c++]); 13745f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 4) emit_mov(pc, dst[2], t[c++]); 13755f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 8) emit_mov(pc, dst[3], t[c]); 13763accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13773accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp4(pc, t); 13783accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#else 13793accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: if p.e. MUL is used directly after TEX, it would still use 13803accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * the texture coordinates, not the fetched values: latency ? */ 13813accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13823accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 4; c++) { 13833accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (mask & (1 << c)) 13843accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assimilate_temp(pc, dst[c], t[c]); 13853accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 13863accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp(pc, t[c]); 13873accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 13883accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#endif 13893accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller} 13903accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 13913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumillerstatic void 13921196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_branch(struct nv50_pc *pc, int pred, unsigned cc, 13931196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec **join) 13941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 13951196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 13961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 13971196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (join) { 13981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 13991196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0xa0000002; 14001196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 14011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller *join = e; 14021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e = exec(pc); 14031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 14041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 14051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 14061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0x10000002; 14071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pred >= 0) 14081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_pred(pc, cc, pred, e); 14091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 14101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 14111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 14121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 14131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_nop(struct nv50_pc *pc) 14141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 14151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 14161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 14171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] = 0xf0000000; 14181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 14191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[1] = 0xe0000000; 14201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 14211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 14221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 14231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 14241635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddx(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 14251635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 14261635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 14271635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14281635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 14291635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14301635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0140000; 14311635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x89800000; 14321635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 14331635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 14341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 14351635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 14361635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14371635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 14381635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 14391635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14401635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 14411635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddy(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 14421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 14431635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 14441635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14451635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 14461635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 1447317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller if (!(src->mod & NV50_MOD_NEG)) /* ! double negation */ 14481635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_neg(pc, src, src); 14491635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14501635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0150000; 14511635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x8a400000; 14521635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 14531635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 14541635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 14551635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 14561635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14571635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 14581635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 14591635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 14601635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 146144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerconvert_to_long(struct nv50_pc *pc, struct nv50_program_exec *e) 146244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller{ 146344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller unsigned q = 0, m = ~0; 146444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 146544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(!is_long(e)); 146644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 146744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller switch (e->inst[0] >> 28) { 146844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x1: 146944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MOV */ 147044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = 0x0403c000; 147144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = 0xffff7fff; 147244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 147344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x8: 14748b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller /* INTERP (move centroid, perspective and flat bits) */ 14758b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller m = ~0x03000100; 14768b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q = (e->inst[0] & (3 << 24)) >> (24 - 16); 14778b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q |= (e->inst[0] & (1 << 8)) << (18 - 8); 147844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 147944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x9: 148044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* RCP */ 148144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 148244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xB: 148344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* ADD */ 148444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~(127 << 16); 148544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) >> 2); 148644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 148744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xC: 148844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MUL */ 148944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~0x00008000; 149044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) << 12); 149144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 149244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xE: 149344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MAD (if src2 == dst) */ 149444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & 0x1fc) << 12); 149544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 149644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller default: 149744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(0); 149844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 149944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller } 150044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 150144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller set_long(pc, e); 150244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller pc->p->exec_size++; 150344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 150444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[0] &= m; 150544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[1] |= q; 150644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller} 150744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 1508f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller/* Some operations support an optional negation flag. */ 1509c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic boolean 1510c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillernegate_supported(const struct tgsi_full_instruction *insn, int i) 1511c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller{ 1512f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller int s; 1513f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1514c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller switch (insn->Instruction.Opcode) { 15151635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 1516c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP3: 1517c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP4: 1518c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MUL: 1519c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_KIL: 1520c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_ADD: 1521c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_SUB: 1522c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MAD: 1523f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1524c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_POW: 1525f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (i == 1) 1526f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1527f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1528c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller default: 1529c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller return FALSE; 1530c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 1531f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1532f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller /* Watch out for possible multiple uses of an nv50_reg, we 1533f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller * can't use nv50_reg::neg in these cases. 1534f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller */ 1535f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller for (s = 0; s < insn->Instruction.NumSrcRegs; ++s) { 1536f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (s == i) 1537f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller continue; 15387d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell if ((insn->Src[s].SrcRegister.Index == 15397d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell insn->Src[i].SrcRegister.Index) && 15407d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell (insn->Src[s].SrcRegister.File == 15417d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell insn->Src[i].SrcRegister.File)) 1542f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1543f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller } 1544f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1545f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return TRUE; 1546c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller} 1547c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 15485d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller/* Return a read mask for source registers deduced from opcode & write mask. */ 15495d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillerstatic unsigned 15505d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *insn, int c) 15515d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller{ 15527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell unsigned x, mask = insn->Dst[0].DstRegister.WriteMask; 15535d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 15545d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (insn->Instruction.Opcode) { 15555d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_COS: 15565d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SIN: 15575d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 15585d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP3: 15595d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x7; 15605d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP4: 15615d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DPH: 15625d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 15635d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xf; 15645d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DST: 15655d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask & (c ? 0xa : 0x6); 15665d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_EX2: 15675d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LG2: 15685d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_POW: 15695d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RCP: 15705d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RSQ: 15715d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SCS: 15725d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x1; 15735d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LIT: 15745d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xb; 15755d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TEX: 15765d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TXP: 15775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller { 157856ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell const struct tgsi_instruction_texture *tex; 15795d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 158056ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell assert(insn->Instruction.Texture); 15817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell tex = &insn->Texture; 15825d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 15835d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = 0x7; 15845d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (insn->Instruction.Opcode == TGSI_OPCODE_TXP) 15855d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask |= 0x8; 15865d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 15875d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (tex->Texture) { 15885d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_1D: 15895d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0x9; 15905d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 15915d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_2D: 15925d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0xb; 15935d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 15945d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 15955d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 15965d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 15975d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 15985d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 15995d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_XPD: 16005d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller x = 0; 16015d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 1) x |= 0x6; 16025d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 2) x |= 0x5; 16035d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 4) x |= 0x3; 16045d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return x; 16055d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 16065d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 16075d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 16085d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 16095d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 16105d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller} 16115d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 1612fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1613fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggstgsi_dst(struct nv50_pc *pc, int c, const struct tgsi_full_dst_register *dst) 1614fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1615fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (dst->DstRegister.File) { 1616fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1617fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->temp[dst->DstRegister.Index * 4 + c]; 1618fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_OUTPUT: 1619fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->result[dst->DstRegister.Index * 4 + c]; 1620ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 1621ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller { 1622ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg *r = pc->addr[dst->DstRegister.Index * 4 + c]; 1623ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!r) { 1624ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = alloc_addr(pc, NULL); 1625ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr[dst->DstRegister.Index * 4 + c] = r; 1626ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1627ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1628ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return r; 1629ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1630fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_NULL: 1631fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1632fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1633fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1634fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1635fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1636fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1637fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1638fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1639fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1640c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillertgsi_src(struct nv50_pc *pc, int chan, const struct tgsi_full_src_register *src, 1641c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller boolean neg) 1642fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1643fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *r = NULL; 1644fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *temp; 1645ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller unsigned sgn, c, swz; 1646ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 1647ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->SrcRegister.File != TGSI_FILE_CONSTANT) 1648ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(!src->SrcRegister.Indirect); 16499417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 16509417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller sgn = tgsi_util_get_full_src_register_sign_mode(src, chan); 1651fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1652b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell c = tgsi_util_get_full_src_register_swizzle(src, chan); 1653fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (c) { 1654b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 1655b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 1656b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 1657b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 1658fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (src->SrcRegister.File) { 1659fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_INPUT: 1660fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->attr[src->SrcRegister.Index * 4 + c]; 1661fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1662fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1663fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->temp[src->SrcRegister.Index * 4 + c]; 1664fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1665fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_CONSTANT: 1666ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!src->SrcRegister.Indirect) { 1667ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = &pc->param[src->SrcRegister.Index * 4 + c]; 1668ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1669ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1670ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* Indicate indirection by setting r->acc < 0 and 1671ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller * use the index field to select the address reg. 1672ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller */ 1673ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = MALLOC_STRUCT(nv50_reg); 1674ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller swz = tgsi_util_get_src_register_swizzle( 1675ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller &src->SrcRegisterInd, 0); 1676ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller ctor_reg(r, P_CONST, 1677c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller src->SrcRegisterInd.Index * 4 + swz, 1678c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller src->SrcRegister.Index * 4 + c); 1679ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r->acc = -1; 1680fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1681fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_IMMEDIATE: 1682fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->immd[src->SrcRegister.Index * 4 + c]; 1683fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1684c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 1685c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 1686ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 1687ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = pc->addr[src->SrcRegister.Index * 4 + c]; 1688ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1689ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1690fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1691fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1692fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1693fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1694fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1695fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1696fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1697fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1698fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1699fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 17009417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller switch (sgn) { 1701fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_KEEP: 1702fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1703fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_CLEAR: 1704fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs temp = temp_temp(pc); 1705fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, temp, r); 1706fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = temp; 1707fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 170831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_TOGGLE: 1709c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1710317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller r->mod = NV50_MOD_NEG; 1711c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else { 1712c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp = temp_temp(pc); 1713c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, r); 1714c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r = temp; 1715c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 171631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 171731f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_SET: 171831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs temp = temp_temp(pc); 1719683722740c85fb6b8c0a930e8a4dce51e1709464Christoph Bumiller emit_cvt(pc, temp, r, -1, CVTOP_ABS, CVT_F32_F32 | CVT_NEG); 172031f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs r = temp; 172131f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 1722fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1723fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1724fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1725fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1726fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1727fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return r; 1728fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1729fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 17302da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* return TRUE for ops that produce only a single result */ 1731dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic boolean 17322da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumilleris_scalar_op(unsigned op) 1733dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 17342da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 1735e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_COS: 17362da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DP2: 1737dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP3: 1738dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP4: 1739dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DPH: 17402da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_EX2: 17412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LG2: 1742dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_POW: 1743dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RCP: 1744dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RSQ: 1745e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_SIN: 17462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* 17472da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 17482da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 1749dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_SCS: 17502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 17512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return TRUE; 17522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 17532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return FALSE; 17542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 17552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 17562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 17572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components depend 17582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * on source s, component c (reverse of nv50_tgsi_src_mask). 17592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 17602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 17612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_tgsi_dst_revdep(unsigned op, int s, int c) 17622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 17632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (is_scalar_op(op)) 17642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x1; 17652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 17662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 17672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DST: 17682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c) & (s ? 0xa : 0x6); 17692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_XPD: 17702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (c) { 17712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 0: return 0x6; 17722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 1: return 0x5; 17732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 2: return 0x3; 17742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 3: return 0x0; 17752da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 17762da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 17772da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 17782da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 17792da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 17802da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_SCS: 1781dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TEX: 1782dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TXP: 17832da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* these take care of dangerous swizzles themselves */ 17842da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 17852da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_IF: 17862da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 17872da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* don't call this function for these ops */ 17882da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 17892da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0; 1790dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller default: 17912da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* linear vector instruction */ 17922da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c); 1793dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller } 1794dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 1795dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1796e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic INLINE boolean 1797e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerhas_pred(struct nv50_program_exec *e, unsigned cc) 1798e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1799e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (!is_long(e) || is_immd(e)) 1800e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1801e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return ((e->inst[1] & 0x780) == (cc << 7)); 1802e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1803e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1804e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* on ENDIF see if we can do "@p0.neu single_op" instead of: 1805e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * join_at ENDIF 1806e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * @p0.eq bra ENDIF 1807e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * single_op 1808e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * ENDIF: nop.join 1809e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1810e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic boolean 1811e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillernv50_kill_branch(struct nv50_pc *pc) 1812e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1813e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int lvl = pc->if_lvl; 1814e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1815e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->if_insn[lvl]->next != pc->p->exec_tail) 1816e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1817e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1818e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* if ccode == 'true', the BRA is from an ELSE and the predicate 1819e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * reg may no longer be valid, since we currently always use $p0 1820e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1821e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (has_pred(pc->if_insn[lvl], 0xf)) 1822e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1823e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->if_insn[lvl] && pc->br_join[lvl]); 1824e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1825e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* We'll use the exec allocated for JOIN_AT (as we can't easily 1826e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * update prev's next); if exec_tail is BRK, update the pointer. 1827e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1828e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->loop_lvl && pc->br_loop[pc->loop_lvl - 1] == pc->p->exec_tail) 1829e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->br_join[lvl]; 1830e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1831e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_size -= 4; /* remove JOIN_AT and BRA */ 1832e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1833e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller *pc->br_join[lvl] = *pc->p->exec_tail; 1834e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1835e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->if_insn[lvl]); 1836e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->p->exec_tail); 1837e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1838e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail = pc->br_join[lvl]; 1839e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->next = NULL; 1840e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller set_pred(pc, 0xd, 0, pc->p->exec_tail); 1841e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1842e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return TRUE; 1843e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1844e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 18452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic boolean 1846234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_program_tx_insn(struct nv50_pc *pc, 1847234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_instruction *inst) 1848f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 184981de711fc864247419221d700bd045addf22cb52Christoph Bumiller struct nv50_reg *rdst[4], *dst[4], *brdc, *src[3][4], *temp; 1850cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unsigned mask, sat, unit; 1851f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i, c; 1852f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 18537d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell mask = inst->Dst[0].DstRegister.WriteMask; 1854688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs sat = inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE; 1855f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1856234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller memset(src, 0, sizeof(src)); 1857234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 1858f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) { 1859234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((mask & (1 << c)) && !pc->r_dst[c]) 18607d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell dst[c] = tgsi_dst(pc, c, &inst->Dst[0]); 1861f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs else 1862234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller dst[c] = pc->r_dst[c]; 1863234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdst[c] = dst[c]; 1864f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1865f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1866f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 18677d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *fs = &inst->Src[i]; 18685d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned src_mask; 18695d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller boolean neg_supp; 18705d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 18715d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src_mask = nv50_tgsi_src_mask(inst, i); 18725d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller neg_supp = negate_supported(inst, i); 1873cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1874cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs if (fs->SrcRegister.File == TGSI_FILE_SAMPLER) 1875cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unit = fs->SrcRegister.Index; 1876cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1877f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) 18785d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (src_mask & (1 << c)) 18795d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src[i][c] = tgsi_src(pc, c, fs, neg_supp); 1880f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1881f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 188281de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp = pc->r_brdc; 188381de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc && brdc->type != P_TEMP) { 188481de711fc864247419221d700bd045addf22cb52Christoph Bumiller temp = temp_temp(pc); 188581de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 188681de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp; 188781de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 1888688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 1889688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 1890234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << c)) || dst[c]->type == P_TEMP) 1891234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 189299e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller /* rdst[c] = dst[c]; */ /* done above */ 1893688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs dst[c] = temp_temp(pc); 1894688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1895688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1896688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 189781de711fc864247419221d700bd045addf22cb52Christoph Bumiller assert(brdc || !is_scalar_op(inst->Instruction.Opcode)); 189881de711fc864247419221d700bd045addf22cb52Christoph Bumiller 1899f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (inst->Instruction.Opcode) { 190068091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs case TGSI_OPCODE_ABS: 190168091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs for (c = 0; c < 4; c++) { 1902fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs if (!(mask & (1 << c))) 1903fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs continue; 1904fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, dst[c], src[0][c]); 190568091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs } 190668091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs break; 19072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_ADD: 19087df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 19097df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 19107df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 19112a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_add(pc, dst[c], src[0][c], src[1][c]); 19127df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 19132a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 191499e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_AND: 191599e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_XOR: 191699e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller case TGSI_OPCODE_OR: 191799e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller for (c = 0; c < 4; c++) { 191899e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller if (!(mask & (1 << c))) 191999e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller continue; 192099e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller emit_bitop2(pc, dst[c], src[0][c], src[1][c], 192199e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller inst->Instruction.Opcode); 192299e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller } 192399e308a0e0479971fe3a8a0aba586e19456e4b88Christoph Bumiller break; 1924ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_OPCODE_ARL: 1925ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src[0][0]); 1926ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller temp = temp_temp(pc); 1927ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_cvt(pc, temp, src[0][0], -1, CVTOP_FLOOR, CVT_S32_F32); 1928ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_arl(pc, dst[0], temp, 4); 1929ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1930e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 1931e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->loop_pos[pc->loop_lvl++] = pc->p->exec_size; 1932ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 1933e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1934e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BRK: 1935e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 1936e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->loop_lvl > 0); 1937e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->p->exec_tail; 1938e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1939849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_CEIL: 1940849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 1941849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 1942849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 1943849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 1944ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_CEIL, CVT_F32_F32 | CVT_RI); 1945849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 1946849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 19472eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller case TGSI_OPCODE_CMP: 19482eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller pc->allow32 = FALSE; 19492eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller for (c = 0; c < 4; c++) { 19502eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!(mask & (1 << c))) 19512eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller continue; 19522eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_cvt(pc, NULL, src[0][c], 1, CVTOP_RN, CVT_F32_F32); 19532eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[1][c]); 19542eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x1, 1, pc->p->exec_tail); /* @SF */ 19552eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[2][c]); 19562eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x6, 1, pc->p->exec_tail); /* @NSF */ 19572eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller } 19582eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller break; 19592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_COS: 1960e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 1961e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 1962e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, dst[3], temp); 1963e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 1964e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 1965e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 1966e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 19677df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 1968e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 1969e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, brdc, temp); 19702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 19711635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDX: 19721635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 19731635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 19741635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 19751635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddx(pc, dst[c], src[0][c]); 19761635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 19771635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 19781635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 19791635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 19801635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 19811635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 19821635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddy(pc, dst[c], src[0][c]); 19831635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 19841635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 19852a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP3: 19862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 19872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 198881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][2], src[1][2], temp); 19892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 19902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP4: 19912a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 19922a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 19932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 199481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][3], src[1][3], temp); 19952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 199621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_DPH: 199721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 199821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 199921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 200081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_add(pc, brdc, src[1][3], temp); 200121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 200233e4d30d50344be26398a51365bea1be37487403Ben Skeggs case TGSI_OPCODE_DST: 20039a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) 20049a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, dst[1], src[0][1], src[1][1]); 20059a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) 20069a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[2], src[0][2]); 20079a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 3)) 20089a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[3], src[1][3]); 200981de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & (1 << 0)) 201081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov_immdval(pc, dst[0], 1.0f); 201133e4d30d50344be26398a51365bea1be37487403Ben Skeggs break; 20121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ELSE: 20131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, -1, 0, NULL); 20141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 20151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 2016ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 20171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 20181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ENDIF: 20191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 20201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 2021e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* try to replace branch over 1 insn with a predicated insn */ 2022e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (nv50_kill_branch(pc) == TRUE) 2023e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 2024e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 20251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->br_join[pc->if_lvl]) { 20261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl]->param.index = pc->p->exec_size; 20271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl] = NULL; 20281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 2029ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 20301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emit a NOP as join point, we could set it on the next 20311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * one, but would have to make sure it is long and !immd 20321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 20331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_nop(pc); 20341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 2; 20351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 2036e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 2037e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 2038e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->param.index = pc->loop_pos[--pc->loop_lvl]; 2039e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl]->param.index = pc->p->exec_size; 2040ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 2041e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 20422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_EX2: 20437b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_preex2(pc, temp, src[0][0]); 204481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 6, brdc, temp); 20452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2046b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FLR: 2047b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 2048b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 2049b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 2050b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, dst[c], src[0][c]); 2051b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 2052b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 2053b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FRC: 20549417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 2055b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 2056b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 2057b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 2058b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, temp, src[0][c]); 2059b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_sub(pc, dst[c], src[0][c], temp); 2060b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 2061b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 20621196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_IF: 20631196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emitting a join_at may not be necessary */ 20641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(pc->if_lvl < MAX_IF_DEPTH); 2065496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller /* set_pred_wr(pc, 1, 0, pc->if_cond); */ 2066496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller emit_cvt(pc, NULL, src[0][0], 0, CVTOP_ABS | CVTOP_RN, 2067496c9eaacfabc4df4e6fb5ba230e60dc660554c8Christoph Bumiller CVT_F32_F32); 20681196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, 0, 2, &pc->br_join[pc->if_lvl]); 20691196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 2070ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 20711196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 2072d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs case TGSI_OPCODE_KIL: 2073d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][0]); 2074d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][1]); 2075d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][2]); 2076d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][3]); 2077d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs break; 207801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs case TGSI_OPCODE_LIT: 20797b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_lit(pc, &dst[0], mask, &src[0][0]); 208001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs break; 20812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_LG2: 208281de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 3, brdc, src[0][0]); 20832a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 208421e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs case TGSI_OPCODE_LRP: 2085229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller temp = temp_temp(pc); 208621e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs for (c = 0; c < 4; c++) { 208721e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (!(mask & (1 << c))) 208821e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs continue; 2089229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_sub(pc, temp, src[1][c], src[2][c]); 2090229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_mad(pc, dst[c], temp, src[0][c], src[2][c]); 209121e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs } 209221e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs break; 20932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MAD: 20947df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 20957df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 20967df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 20972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, dst[c], src[0][c], src[1][c], src[2][c]); 20987df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 20992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 210052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MAX: 21017df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21027df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21037df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 210452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 4, dst[c], src[0][c], src[1][c]); 21057df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 210652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 210752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MIN: 21087df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21097df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21107df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 211152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 5, dst[c], src[0][c], src[1][c]); 21127df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 211352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 2114f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_MOV: 21157df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21167df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 211855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs emit_mov(pc, dst[c], src[0][c]); 21197df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 212038ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs break; 21212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MUL: 21227df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21237df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21247df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 21252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, dst[c], src[0][c], src[1][c]); 21267df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 21272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2128ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs case TGSI_OPCODE_POW: 212981de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_pow(pc, brdc, src[0][0], src[1][0]); 2130ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs break; 21312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RCP: 213281de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 0, brdc, src[0][0]); 21332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 21342a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RSQ: 213581de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 2, brdc, src[0][0]); 21362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 21377b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs case TGSI_OPCODE_SCS: 21389417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 213981de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & 3) 214081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_precossin(pc, temp, src[0][0]); 21417b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 0)) 21427b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 5, dst[0], temp); 21437b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 1)) 21447b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 4, dst[1], temp); 21454a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 2)) 21464a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[2], 0.0); 21474a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 21484a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 21497b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs break; 21502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SIN: 2151e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 2152e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 2153e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, dst[3], temp); 2154e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 2155e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 2156e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 2157e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 21587df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 2159e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 2160e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, brdc, temp); 21612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2162bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs case TGSI_OPCODE_SLT: 21632b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: 21642b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: 21652b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: 21662b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: 21672b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: 21682b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller i = map_tgsi_setop_cc(inst->Instruction.Opcode); 2169bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs for (c = 0; c < 4; c++) { 2170bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (!(mask & (1 << c))) 2171bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs continue; 21722b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_set(pc, i, dst[c], -1, src[0][c], src[1][c]); 2173bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs } 2174bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs break; 21752a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SUB: 21767df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 21777df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 21787df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 21792a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_sub(pc, dst[c], src[0][c], src[1][c]); 21807df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 21812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2182c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_OPCODE_TEX: 21833accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 21847d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst->Texture.Texture, FALSE); 21853accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 21865696267efd6f85d79f5fe511d1a066a17c4d1cccBen Skeggs case TGSI_OPCODE_TXP: 21873accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 21887d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell inst->Texture.Texture, TRUE); 2189c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2190849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_TRUNC: 2191849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 2192849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 2193849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 2194849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 2195ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_TRUNC, CVT_F32_F32 | CVT_RI); 2196849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 2197849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 219821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_XPD: 21999417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 22009a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 0)) { 22019a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][2], src[1][1]); 22029a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[0], src[0][1], src[1][2], temp); 22039a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 22049a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) { 22059a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][2]); 22069a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[1], src[0][2], src[1][0], temp); 22079a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 22089a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) { 22099a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][1], src[1][0]); 22109a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[2], src[0][0], src[1][1], temp); 22119a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 22124a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 22134a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 221421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 2215f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_END: 2216f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2217f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2218f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("invalid opcode %d\n", inst->Instruction.Opcode); 2219f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 2220f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2221f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 222281de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc) { 222381de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 222481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_sat(pc, brdc, brdc); 222581de711fc864247419221d700bd045addf22cb52Christoph Bumiller for (c = 0; c < 4; c++) 222681de711fc864247419221d700bd045addf22cb52Christoph Bumiller if ((mask & (1 << c)) && dst[c] != brdc) 222781de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov(pc, dst[c], brdc); 222881de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 2229688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 2230688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 2231688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (!(mask & (1 << c))) 2232688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs continue; 223399e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller /* In this case we saturate later, and dst[c] won't 223499e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller * be another temp_temp (and thus lost), since rdst 223599e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller * already is TEMP (see above). */ 223699e728a13ea8518efc7e27242093b43470f102d6Christoph Bumiller if (rdst[c]->type == P_TEMP && rdst[c]->index < 0) 2237234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2238234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, rdst[c], dst[c]); 2239688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2240688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2241688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 22429417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 22439417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (c = 0; c < 4; c++) { 22449417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (!src[i][c]) 22459417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller continue; 2246317ccfe0dfbfda13f58a26f661324d883b25a316Christoph Bumiller src[i][c]->mod = 0; 22479417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (src[i][c]->index == -1 && src[i][c]->type == P_IMMD) 22489417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(src[i][c]); 2249ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller else 2250ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src[i][c]->acc < 0 && src[i][c]->type == P_CONST) 2251ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller FREE(src[i][c]); /* indirect constant */ 22529417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 22539417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 22549417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 225552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs kill_temp_temp(pc); 2256f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return TRUE; 2257f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2258f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2259bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumillerstatic void 226038849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerprep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn) 2261bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller{ 226238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller struct nv50_reg *reg = NULL; 2263bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_full_src_register *src; 2264bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_dst_register *dst; 226538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned i, c, k, mask; 2266bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 22677d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell dst = &insn->Dst[0].DstRegister; 2268bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller mask = dst->WriteMask; 2269bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 227038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_TEMPORARY) 227138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 227238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 227338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_OUTPUT) 227438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->result; 2275bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 227638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (reg) { 2277bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2278bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2279bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 228038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[dst->Index * 4 + c].acc = pc->insn_nr; 2281bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2282bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2283bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2284bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 22857d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell src = &insn->Src[i]; 2286bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 228738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) 228838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 228938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 229038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_INPUT) 229138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->attr; 229238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 2293bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2294bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 22955d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = nv50_tgsi_src_mask(insn, i); 2296bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2297bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2298bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2299bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2300b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell k = tgsi_util_get_full_src_register_swizzle(src, c); 230138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 230238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[src->SrcRegister.Index * 4 + k].acc = pc->insn_nr; 2303bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2304bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2305bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller} 2306bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 23072da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components need to be 23082da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * written to temporaries first to avoid 'corrupting' sources. 23092da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 23102da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * m[i] (out) indicate component to write in the i-th position 23112da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * rdep[c] (in) bitmasks of dst[i] that require dst[c] as source 23122da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 23132da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 23142da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_revdep_reorder(unsigned m[4], unsigned rdep[4]) 23152da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 23162da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsigned i, c, x, unsafe; 23172da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23182da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 4; c++) 23192da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = c; 23202da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23212da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* Swap as long as a dst component written earlier is depended on 23222da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * by one written later, but the next one isn't depended on by it. 23232da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 23242da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 3; c++) { 23252da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c + 1]] & (1 << m[c])) 23262da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; /* if next one is depended on by us */ 23272da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = c + 1; i < 4; i++) 23282da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* if we are depended on by a later one */ 23292da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c]] & (1 << m[i])) 23302da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller break; 23312da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (i == 4) 23322da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; 23332da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* now, swap */ 23342da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller x = m[c]; 23352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = m[c + 1]; 23362da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c + 1] = x; 23372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23382da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* restart */ 23392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller c = 0; 23402da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 23412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23422da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* mark dependencies that could not be resolved by reordering */ 23432da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = 0; i < 3; ++i) 23442da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = i + 1; c < 4; ++c) 23452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[i]] & (1 << m[c])) 23462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsafe |= (1 << i); 23472da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23482da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* NOTE: $unsafe is with respect to order, not component */ 23492da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return unsafe; 23502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 23512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Select a suitable dst register for broadcasting scalar results, 23532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * or return NULL if we have to allocate an extra TEMP. 23542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 23552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * If e.g. only 1 component is written, we may also emit the final 23562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * result to a write-only register. 23572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 23582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic struct nv50_reg * 23592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillertgsi_broadcast_dst(struct nv50_pc *pc, 23602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller const struct tgsi_full_dst_register *fd, unsigned mask) 23612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 23622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (fd->DstRegister.File == TGSI_FILE_TEMPORARY) { 23632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(~mask & fd->DstRegister.WriteMask); 23642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (c) 23652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c - 1, fd); 23662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } else { 23672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(fd->DstRegister.WriteMask) - 1; 23682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if ((1 << c) == fd->DstRegister.WriteMask) 23692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c, fd); 23702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 23712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 23722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return NULL; 23732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 23742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 2375234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller/* Scan source swizzles and return a bitmask indicating dst regs that 2376234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller * also occur among the src regs, and fill rdep for nv50_revdep_reoder. 2377234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller */ 2378234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic unsigned 2379234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_scan_swizzle(const struct tgsi_full_instruction *insn, 2380234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned rdep[4]) 2381234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 23827d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *fd = &insn->Dst[0]; 2383234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_src_register *fs; 2384234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs = 0; 2385234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2386234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) 2387234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[i] = 0; 2388234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2389234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2390234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned chn, mask = nv50_tgsi_src_mask(insn, i); 2391234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller boolean neg_supp = negate_supported(insn, i); 2392234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 23937d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell fs = &insn->Src[i]; 2394234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (fs->SrcRegister.File != fd->DstRegister.File || 2395234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fs->SrcRegister.Index != fd->DstRegister.Index) 2396234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2397234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2398234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (chn = 0; chn < 4; ++chn) { 2399234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned s, c; 2400234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2401234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << chn))) /* src is not read */ 2402234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2403b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell c = tgsi_util_get_full_src_register_swizzle(fs, chn); 2404234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller s = tgsi_util_get_full_src_register_sign_mode(fs, chn); 2405234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2406b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell if (!(fd->DstRegister.WriteMask & (1 << c))) 2407234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2408234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2409234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* no danger if src is copied to TEMP first */ 2410234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((s != TGSI_UTIL_SIGN_KEEP) && 2411234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller (s != TGSI_UTIL_SIGN_TOGGLE || !neg_supp)) 2412234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2413234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2414234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[c] |= nv50_tgsi_dst_revdep( 2415234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn->Instruction.Opcode, i, chn); 2416234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs |= (1 << c); 2417234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2418234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2419234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2420234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return deqs; 2421234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2422234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2423234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic boolean 2424234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_insn(struct nv50_pc *pc, const union tgsi_full_token *tok) 2425234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2426234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct tgsi_full_instruction insn = tok->FullInstruction; 2427234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd; 2428234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs, rdep[4], m[4]; 2429234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 24307d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell fd = &tok->FullInstruction.Dst[0]; 2431234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_tgsi_scan_swizzle(&insn, rdep); 2432234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2433234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (is_scalar_op(insn.Instruction.Opcode)) { 2434234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = tgsi_broadcast_dst(pc, fd, deqs); 2435234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!pc->r_brdc) 2436234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = temp_temp(pc); 2437234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2438234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2439234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = NULL; 2440234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2441234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!deqs) 2442234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2443234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2444234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_revdep_reorder(m, rdep); 2445234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2446234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) { 2447234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller assert(pc->r_dst[m[i]] == NULL); 2448234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 24497d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell insn.Dst[0].DstRegister.WriteMask = 2450234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fd->DstRegister.WriteMask & (1 << m[i]); 2451234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 24527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell if (!insn.Dst[0].DstRegister.WriteMask) 2453234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2454234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2455234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (deqs & (1 << i)) 2456234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[m[i]] = alloc_temp(pc, NULL); 2457234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2458234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!nv50_program_tx_insn(pc, &insn)) 2459234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return FALSE; 2460234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2461234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2462234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; i++) { 2463234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *reg = pc->r_dst[i]; 2464234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!reg) 2465234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2466234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[i] = NULL; 2467234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2468234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (insn.Instruction.Saturate == TGSI_SAT_ZERO_ONE) 2469234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, tgsi_dst(pc, i, fd), reg); 2470234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller else 2471234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_mov(pc, tgsi_dst(pc, i, fd), reg); 2472234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller free_temp(pc, reg); 2473234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2474234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2475234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return TRUE; 2476234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2477234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 24786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic void 24796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerload_interpolant(struct nv50_pc *pc, struct nv50_reg *reg) 2480dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller{ 24816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_reg *iv, **ppiv; 24826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned mode = pc->interp_mode[reg->index]; 2483dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ppiv = (mode & INTERP_CENTROID) ? &pc->iv_c : &pc->iv_p; 24856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv; 2486dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if ((mode & INTERP_PERSPECTIVE) && !iv) { 24886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv = alloc_temp(pc, NULL); 24896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv->rhw = popcnt4(pc->p->cfg.regs[1] >> 24) - 1; 2490dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, iv, NULL, mode & INTERP_CENTROID); 24926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_flop(pc, 0, iv, iv); 2493dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* XXX: when loading interpolants dynamically, move these 24956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * to the program head, or make sure it can't be skipped. 24966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 2497dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2498dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, reg, iv, mode); 2500dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller} 2501dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 25025de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller/* The face input is always at v[255] (varying space), with a 25035de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller * value of 0 for back-facing, and 0xffffffff for front-facing. 25045de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller */ 25055de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumillerstatic void 25065de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumillerload_frontfacing(struct nv50_pc *pc, struct nv50_reg *a) 25075de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller{ 25085de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller struct nv50_reg *one = alloc_immd(pc, 1.0f); 25095de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 25105de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller assert(a->rhw == -1); 25115de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller alloc_reg(pc, a); /* do this before rhw is set */ 25125de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller a->rhw = 255; 25135de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller load_interpolant(pc, a); 25145de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller emit_bitop2(pc, a, a, one, TGSI_OPCODE_AND); 25155de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 25165de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller FREE(one); 25175de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller} 25185de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 2519f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 2520f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx_prep(struct nv50_pc *pc) 2521f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 25226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct tgsi_parse_context tp; 25236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *p = pc->p; 2524f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret = FALSE; 25256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned i, c, flat_nr = 0; 2526dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 25276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_init(&tp, pc->p->pipe.tokens); 25286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller while (!tgsi_parse_end_of_tokens(&tp)) { 25296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller const union tgsi_full_token *tok = &tp.FullToken; 2530f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 25316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_token(&tp); 2532f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2533f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_IMMEDIATE: 2534f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2535f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_immediate *imm = 25366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller &tp.FullToken.FullImmediate; 2537f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2538fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell ctor_immd(pc, imm->u[0].Float, 2539fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[1].Float, 2540fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[2].Float, 2541fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[3].Float); 2542f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2543f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2544f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_DECLARATION: 2545f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2546f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_declaration *d; 25476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned si, last, first, mode; 2548f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 25496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller d = &tp.FullToken.FullDeclaration; 2550fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell first = d->Range.First; 2551fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell last = d->Range.Last; 2552f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2553f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (d->Declaration.File) { 2554f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_TEMPORARY: 2555f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2556f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_OUTPUT: 25576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!d->Declaration.Semantic || 25586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->type == PIPE_SHADER_FRAGMENT) 25596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 25606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 2561763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell si = d->Semantic.Index; 2562763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell switch (d->Semantic.Name) { 25634d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller case TGSI_SEMANTIC_BCOLOR: 25644d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[si].hw = first; 25654d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.io_nr > first) 25664d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.io_nr = first; 25674d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller break; 256806dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller case TGSI_SEMANTIC_PSIZE: 256906dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = first; 257006dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.io_nr > first) 257106dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.io_nr = first; 257206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller break; 25736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* 25746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller case TGSI_SEMANTIC_CLIP_DISTANCE: 25756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = MIN2(p->cfg.clpd, first); 25766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 25776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 25786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller default: 25796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 25806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2581f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2582f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_INPUT: 2583e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller { 25846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type != PIPE_SHADER_FRAGMENT) 2585e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2586e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2587e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller switch (d->Declaration.Interpolate) { 2588e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 2589e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_FLAT; 25906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller flat_nr++; 2591e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2592e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_PERSPECTIVE: 2593e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_PERSPECTIVE; 25946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= 0x08 << 24; 2595e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2596e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller default: 2597e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_LINEAR; 2598e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2599e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 26006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (d->Declaration.Centroid) 2601e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode |= INTERP_CENTROID; 2602e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2603e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller assert(last < 32); 2604e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller for (i = first; i <= last; i++) 2605e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller pc->interp_mode[i] = mode; 2606e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 2607f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2608ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 2609f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_CONSTANT: 2610c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 2611c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2612f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2613f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("bad decl file %d\n", 2614f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs d->Declaration.File); 2615f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2616f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2617f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2618f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2619f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2620bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller pc->insn_nr++; 262138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller prep_inspect_insn(pc, &tok->FullInstruction); 2622f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2623f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2624f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2625f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2626f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2627f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 26286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_VERTEX) { 26296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid = 0; 26308ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 26316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) { 26326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->attr[i].acc) { 26336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i].hw = rid++; 26346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.attr[i / 32] |= 1 << (i % 32); 2635f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 26366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 26376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0, rid = 0; i < pc->result_nr; ++i) { 26396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].hw = rid; 26406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].id_vp = i; 26418ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 26426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 26436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int n = i * 4 + c; 26446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->result[n].acc) 26456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 26466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[n].hw = rid++; 26476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].mask |= 1 << c; 2648dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 26496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 26504d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 26514d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller for (c = 0; c < 2; ++c) 26524d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.two_side[c].hw < 0x40) 26534d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c] = p->cfg.io[ 26544d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c].hw]; 265506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 265606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.psiz < 0x40) 265706dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = p->cfg.io[p->cfg.psiz].hw; 26586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 26596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_FRAGMENT) { 26606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid, aid; 26616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned n = 0, m = pc->attr_nr - flat_nr; 26626516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26635de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller pc->allow32 = TRUE; 26645de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 26656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int base = (TGSI_SEMANTIC_POSITION == 26666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->info.input_semantic_name[0]) ? 0 : 1; 26678ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 26686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* non-flat interpolants have to be mapped to 26696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * the lower hardware IDs, so sort them: 26706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 26716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 26726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->interp_mode[i] == INTERP_FLAT) { 26736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m].id_vp = i + base; 26746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m++].id_fp = i; 26756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else { 26766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!(pc->interp_mode[i] & INTERP_PERSPECTIVE)) 26776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].linear = TRUE; 26786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].id_vp = i + base; 26796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n++].id_fp = i; 2680dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 26816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2682dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 26836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) /* set w-coordinate mask from perspective interp */ 26846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[0].mask |= p->cfg.regs[1] >> 24; 26858ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 26866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid = popcnt4( /* if fcrd isn't contained in cfg.io */ 26876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller base ? (p->cfg.regs[1] >> 24) : p->cfg.io[0].mask); 2688dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 26896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (n = 0; n < pc->attr_nr; ++n) { 26906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].hw = rid = aid; 26916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[n].id_fp; 26926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26935de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller if (p->info.input_semantic_name[n] == 26945de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller TGSI_SEMANTIC_FACE) { 26955de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller load_frontfacing(pc, &pc->attr[i * 4]); 26965de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller continue; 26975de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller } 26985de8f9744015d3645a12dac244ad47daf8481dd2Christoph Bumiller 26996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 27006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->attr[i * 4 + c].acc) 27016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 27026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i * 4 + c].rhw = rid++; 27036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].mask |= 1 << c; 27046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller load_interpolant(pc, &pc->attr[i * 4 + c]); 2706dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 27076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid += popcnt4(p->cfg.io[n].mask); 2708dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2709f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) 27116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.io[0].mask << 24; 27126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = popcnt4(p->cfg.regs[1] >> 24); 27146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* set count of non-position inputs and of non-flat 27166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * non-position inputs for FP_INTERPOLANT_CTRL 27176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 27186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= aid - m; 27196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (flat_nr) { 27216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[pc->attr_nr - flat_nr].hw; 27226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= (i - m) << 16; 27236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 27246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.regs[1] << 16; 27256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* mark color semantic for light-twoside */ 27276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = 0x40; 27286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 27296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si, sn; 2730f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller sn = p->info.input_semantic_name[p->cfg.io[i].id_fp]; 27326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller si = p->info.input_semantic_index[p->cfg.io[i].id_fp]; 27336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (sn == TGSI_SEMANTIC_COLOR) { 27356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si] = p->cfg.io[i]; 27366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* increase colour count */ 27386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += popcnt4( 27396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si].mask) << 16; 27406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = MIN2(n, p->cfg.io[i].hw - m); 27426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2743f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 27446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n < 0x40) 27456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += n; 27466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* Initialize FP results: 27486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * FragDepth is always first TGSI and last hw output 27496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 27506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->info.writes_z ? 4 : 0; 27516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (rid = 0; i < pc->result_nr * 4; i++) 27526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[i].rhw = rid++; 27536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->info.writes_z) 27546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[2].rhw = rid; 27551196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27561196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller p->cfg.high_result = rid; 2757525f529d138168386224136dc45abb858677bac7Christoph Bumiller 2758525f529d138168386224136dc45abb858677bac7Christoph Bumiller /* separate/different colour results for MRTs ? */ 2759525f529d138168386224136dc45abb858677bac7Christoph Bumiller if (pc->result_nr - (p->info.writes_z ? 1 : 0) > 1) 2760525f529d138168386224136dc45abb858677bac7Christoph Bumiller p->cfg.regs[2] |= 1; 2761f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2762f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2763f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (pc->immd_nr) { 276494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller int rid = 0; 2765f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2766e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller pc->immd = MALLOC(pc->immd_nr * 4 * sizeof(struct nv50_reg)); 2767f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->immd) 2768f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2769f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2770f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < pc->immd_nr; i++) { 2771e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller for (c = 0; c < 4; c++, rid++) 2772e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(&pc->immd[rid], P_IMMD, i, rid); 2773f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2774f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2775f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2776f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = TRUE; 2777f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 27786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_p) 27796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_p); 27806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_c) 27816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_c); 27826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 27836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_free(&tp); 2784f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2785f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2786f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27879417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerstatic void 27889417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerfree_nv50_pc(struct nv50_pc *pc) 27899417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller{ 27909417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->immd) 27919417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->immd); 27929417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->param) 27939417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->param); 27949417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->result) 27959417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->result); 27969417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->attr) 27979417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->attr); 27989417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->temp) 27999417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->temp); 28009417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 28019417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc); 28029417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller} 28039417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 2804f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 280538849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerctor_nv50_pc(struct nv50_pc *pc, struct nv50_program *p) 280638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller{ 280738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int i, c; 280838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned rtype[2] = { P_ATTR, P_RESULT }; 280938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 281038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->p = p; 281138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp_nr = p->info.file_max[TGSI_FILE_TEMPORARY] + 1; 281238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr_nr = p->info.file_max[TGSI_FILE_INPUT] + 1; 281338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result_nr = p->info.file_max[TGSI_FILE_OUTPUT] + 1; 281438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param_nr = p->info.file_max[TGSI_FILE_CONSTANT] + 1; 2815ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr_nr = p->info.file_max[TGSI_FILE_ADDRESS] + 1; 2816ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(pc->addr_nr <= 2); 281738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 281838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller p->cfg.high_temp = 4; 281938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 28206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[0].hw = 0x40; 28216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[1].hw = 0x40; 28226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 282338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller switch (p->type) { 282438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_VERTEX: 282506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = 0x40; 28266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = 0x40; 28276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->result_nr; 282838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 282938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_FRAGMENT: 283038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller rtype[0] = rtype[1] = P_TEMP; 283138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 28326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] = 0x01000004; 28336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->attr_nr; 28346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 283538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.writes_z) { 28366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00000100; 28376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[3] |= 0x00000011; 283838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 283938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.uses_kill) 28406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00100000; 284138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 284238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 284338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 284438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->temp_nr) { 284538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp = MALLOC(pc->temp_nr * 4 * sizeof(struct nv50_reg)); 284638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->temp) 284738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 284838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 284938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->temp_nr * 4; ++i) 285038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->temp[i], P_TEMP, i / 4, -1); 285138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 285238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 285338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->attr_nr) { 285438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr = MALLOC(pc->attr_nr * 4 * sizeof(struct nv50_reg)); 285538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->attr) 285638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 285738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 285838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) 285938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->attr[i], rtype[0], i / 4, -1); 286038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 286138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 286238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->result_nr) { 286338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned nr = pc->result_nr * 4; 286438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 286538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result = MALLOC(nr * sizeof(struct nv50_reg)); 286638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->result) 286738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 286838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 286938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < nr; ++i) 287038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->result[i], rtype[1], i / 4, -1); 287138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 287238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 287338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->param_nr) { 287438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int rid = 0; 287538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 287638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param = MALLOC(pc->param_nr * 4 * sizeof(struct nv50_reg)); 287738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->param) 287838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 287938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 288038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->param_nr; ++i) 288138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (c = 0; c < 4; ++c, ++rid) 288238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->param[rid], P_CONST, i, rid); 288338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 288438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 2885ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->addr_nr) { 2886ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr = CALLOC(pc->addr_nr * 4, sizeof(struct nv50_reg *)); 2887ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!pc->addr) 2888ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return FALSE; 2889ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 2890ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 2891c738c9ab67859f3d4412417333d0f023dd18dc19Christoph Bumiller ctor_reg(&pc->r_addr[i], P_ADDR, -256, i + 1); 2892ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 289338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return TRUE; 289438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller} 289538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 28961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 28971196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_fp_move_results(struct nv50_pc *pc) 28981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 28991196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_reg reg; 29001196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i; 29011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ctor_reg(®, P_TEMP, -1, -1); 29031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < pc->result_nr * 4; ++i) { 29051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw < 0 || pc->result[i].hw < 0) 29061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 29071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw != pc->result[i].hw) { 29081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller reg.hw = pc->result[i].rhw; 29091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_mov(pc, ®, &pc->result[i]); 29101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 29131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 29151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_program_fixup_insns(struct nv50_pc *pc) 29161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 29171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e, *prev = NULL, **bra_list; 29181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i, n, pos; 29191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list = CALLOC(pc->p->exec_size, sizeof(struct nv50_program_exec *)); 29211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Collect branch instructions, we need to adjust their offsets 29231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * when converting 32 bit instructions to 64 bit ones 29241196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 29251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (n = 0, e = pc->p->exec_head; e; e = e->next) 29261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.index >= 0 && !e->param.mask) 29271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[n++] = e; 29281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Make sure we don't have any single 32 bit instructions. */ 29301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (e = pc->p->exec_head, pos = 0; e; e = e->next) { 29311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pos += is_long(e) ? 2 : 1; 29321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if ((pos & 1) && (!e->next || is_long(e->next))) { 29341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < n; ++i) 29351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (bra_list[i]->param.index >= pos) 29361196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[i]->param.index += 1; 29371196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, e); 29381196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ++pos; 29391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->next) 29411196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller prev = e; 29421196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29431196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29441196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_head)); 29451196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_tail)); 29461196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29471196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* last instruction must be long so it can have the end bit set */ 29481196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (!is_long(pc->p->exec_tail)) { 29491196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, pc->p->exec_tail); 29501196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (prev) 29511196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, prev); 29521196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29531196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(pc->p->exec_tail->inst[1] & 2)); 29541196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* set the end-bit */ 29551196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 1; 29561196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29571196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller FREE(bra_list); 29581196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 29591196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 296038849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerstatic boolean 2961f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx(struct nv50_program *p) 2962f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2963f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct tgsi_parse_context parse; 2964f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_pc *pc; 2965f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret; 2966f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2967f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc = CALLOC_STRUCT(nv50_pc); 2968f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc) 2969f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 297038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 297138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ret = ctor_nv50_pc(pc, p); 297238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (ret == FALSE) 297338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller goto out_cleanup; 2974f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2975f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = nv50_program_tx_prep(pc); 2976f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2977f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_cleanup; 2978f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2979f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_init(&parse, pc->p->pipe.tokens); 2980f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs while (!tgsi_parse_end_of_tokens(&parse)) { 2981f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const union tgsi_full_token *tok = &parse.FullToken; 2982f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2983d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller /* don't allow half insn/immd on first and last instruction */ 2984d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = TRUE; 2985d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (pc->insn_cur == 0 || pc->insn_cur + 2 == pc->insn_nr) 2986d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = FALSE; 2987d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 2988f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_token(&parse); 2989f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2990f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2991f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2992bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller ++pc->insn_cur; 2993234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller ret = nv50_tgsi_insn(pc, tok); 2994f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2995f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2996f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2997f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2998f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2999f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3000f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3001f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 30021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->p->type == PIPE_SHADER_FRAGMENT) 30031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_fp_move_results(pc); 300444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 30051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_program_fixup_insns(pc); 300640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3007aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs p->param_nr = pc->param_nr * 4; 3008f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd_nr = pc->immd_nr * 4; 3009f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd = pc->immd_buf; 3010f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3011f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 3012f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_free(&parse); 3013f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3014f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_cleanup: 30159417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller free_nv50_pc(pc); 3016f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 3017f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3018f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3019f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 3020f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_validate(struct nv50_context *nv50, struct nv50_program *p) 3021f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3022e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs if (nv50_program_tx(p) == FALSE) 3023e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs assert(0); 3024f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = TRUE; 3025f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3026f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 302722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 3028ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsnv50_program_upload_data(struct nv50_context *nv50, float *map, 302994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller unsigned start, unsigned count, unsigned cbuf) 3030ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs{ 303180e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 303275f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 303375f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs 3034ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs while (count) { 3035ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs unsigned nr = count > 2047 ? 2047 : count; 3036ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 303793ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 303894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller OUT_RING (chan, (cbuf << 0) | (start << 8)); 303993ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 304075f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, map, nr); 3041ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3042ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs map += nr; 3043ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs start += nr; 3044ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs count -= nr; 3045ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs } 3046ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs} 3047ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3048ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsstatic void 304922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) 305022e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 30516b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs struct pipe_screen *pscreen = nv50->pipe.screen; 305222e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 305394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller if (!p->data[0] && p->immd_nr) { 305494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nouveau_resource *heap = nv50->screen->immd_heap[0]; 305594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 30561b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) { 305794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller while (heap->next && heap->size < p->immd_nr) { 305894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nv50_program *evict = heap->next->priv; 30591b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&evict->data[0]); 306094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 306194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 30621b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, 30631b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs &p->data[0])) 306494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller assert(0); 306594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 306694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 306794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller /* immediates only need to be uploaded again when freed */ 306894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller nv50_program_upload_data(nv50, p->immd, p->data[0]->start, 306994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller p->immd_nr, NV50_CB_PMISC); 307094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 3071aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3072ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(p->param_nr <= 512); 3073aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3074aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs if (p->param_nr) { 3075750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned cb; 30766b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type], 30776b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs PIPE_BUFFER_USAGE_CPU_READ); 3078750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 3079750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->type == PIPE_SHADER_VERTEX) 3080750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PVP; 3081750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller else 3082750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PFP; 3083750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 3084750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller nv50_program_upload_data(nv50, map, 0, p->param_nr, cb); 30856b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]); 3086aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 308722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 308822e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 308922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 309022e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) 309122e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 309280e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 309340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e; 30949831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller uint32_t *up, i; 3095f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs boolean upload = FALSE; 309622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 3097072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs if (!p->bo) { 3098072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_new(chan->device, NOUVEAU_BO_VRAM, 0x100, 3099072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs p->exec_size * 4, &p->bo); 3100f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs upload = TRUE; 3101f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs } 310240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3103750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0] && p->data[0]->start != p->data_start[0]) 3104750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller upload = TRUE; 3105ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 3106750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (!upload) 3107750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller return; 3108ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 31099831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up = MALLOC(p->exec_size * 4); 31109831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller 31119831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller for (i = 0, e = p->exec_head; e; e = e->next) { 3112750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned ei, ci, bs; 31131c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 31149831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (e->param.index >= 0 && e->param.mask) { 31159831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller bs = (e->inst[1] >> 22) & 0x07; 31169831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller assert(bs < 2); 31179831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ei = e->param.shift >> 5; 31189831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ci = e->param.index; 31199831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (bs == 0) 31209831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller ci += p->data[bs]->start; 31211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31229831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller e->inst[ei] &= ~e->param.mask; 31239831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller e->inst[ei] |= (ci << e->param.shift); 31249831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller } else 31259831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (e->param.index >= 0) { 31269831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller /* zero mask means param is a jump/branch offset */ 31271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(e->param.index & 1)); 31281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* seem to be 8 byte steps */ 31291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ei = (e->param.index >> 1) + 0 /* START_ID */; 31301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] &= 0xf0000fff; 31321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= ei << 12; 31331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 31341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 31359831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up[i++] = e->inst[0]; 31369831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller if (is_long(e)) 31379831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up[i++] = e->inst[1]; 3138aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 31399831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller assert(i == p->exec_size); 3140aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3141750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0]) 3142750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller p->data_start[0] = p->data[0]->start; 3143f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs 3144b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#ifdef NV50_PROGRAM_DUMP 31450d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("-------\n"); 3146aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs for (e = p->exec_head; e; e = e->next) { 31470d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[0]); 31480d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs if (is_long(e)) 31490d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[1]); 3150b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs } 3151b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#endif 31529831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller nv50_upload_sifc(nv50, p->bo, 0, NOUVEAU_BO_VRAM, 31539831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller NV50_2D_DST_FORMAT_R8_UNORM, 65536, 1, 262144, 31549831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller up, NV50_2D_SIFC_FORMAT_R8_UNORM, 0, 31559831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller 0, 0, p->exec_size * 4, 1, 1); 3156cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3157cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs FREE(up); 315822e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 315922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 3160f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3161f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_vertprog_validate(struct nv50_context *nv50) 3162f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3163f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3164f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->vertprog; 3165f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3166f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3167f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3168f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3169f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3170f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3171f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3172f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 317322e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_data(nv50, p); 317422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_code(nv50, p); 3175f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3176e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(13, 2); 3177f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_VP_ADDRESS_HIGH, 2); 3178072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3179072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3180072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3181072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 318293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_ATTR_EN_0, 2); 31836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[0]); 31846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[1]); 318593ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1); 3186fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs so_data (so, p->cfg.high_result); 318793ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 2); 3188bcbe6baac37915563bc120ad558cd930bc1ddec1Ben Skeggs so_data (so, p->cfg.high_result); //8); 31898ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 319093ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_START_ID, 1); 3191f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_data (so, 0); /* program start offset */ 3192bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.vertprog); 3193ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3194f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3195f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3196f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3197f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_fragprog_validate(struct nv50_context *nv50) 3198f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3199f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3200f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->fragprog; 3201f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3202f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3203f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3204f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3205f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3206f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3207f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3208f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 320955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_data(nv50, p); 321055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_code(nv50, p); 3211f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3212585ae74d87f3d04a4b5b7c068b865292afd1a16bBen Skeggs so = so_new(64, 2); 3213f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_FP_ADDRESS_HIGH, 2); 3214072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3215072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3216072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3217072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 32186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_REG_ALLOC_TEMP, 1); 32198ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 322093ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_RESULT_COUNT, 1); 3221dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller so_data (so, p->cfg.high_result); 322293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK19A8, 1); 32236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[2]); 322493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK196C, 1); 32256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[3]); 322693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_START_ID, 1); 32278ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, 0); /* program start offset */ 3228bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.fragprog); 3229ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3230f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3231f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 323201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillerstatic void 323301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillernv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base) 323401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller{ 323501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 323601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 323701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned i, c, m = base; 323801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 323901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* XXX: This can't work correctly in all cases yet, we either 324001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * have to create TGSI_SEMANTIC_PNTC or sprite_coord_mode has 324101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * to be per FP input instead of per VP output 324201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller */ 324301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller memset(pntc, 0, 8 * sizeof(uint32_t)); 324401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 324501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (i = 0; i < fp->cfg.io_nr; i++) { 324601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t sn, si; 324701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t j = fp->cfg.io[i].id_vp, k = fp->cfg.io[i].id_fp; 324801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned n = popcnt4(fp->cfg.io[i].mask); 324901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 325001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (fp->info.input_semantic_name[k] != TGSI_SEMANTIC_GENERIC) { 325101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 325201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 325301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 325401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 325501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller sn = vp->info.input_semantic_name[j]; 325601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller si = vp->info.input_semantic_index[j]; 325701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 325801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (j < fp->cfg.io_nr && sn == TGSI_SEMANTIC_GENERIC) { 325901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ubyte mode = 326001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50->rasterizer->pipe.sprite_coord_mode[si]; 326101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 326201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (mode == PIPE_SPRITE_COORD_NONE) { 326301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 326401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 326501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 326601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 326701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 326801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* this is either PointCoord or replaced by sprite coords */ 326901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (c = 0; c < 4; c++) { 327001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (!(fp->cfg.io[i].mask & (1 << c))) 327101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 327201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller pntc[m / 8] |= (c + 1) << ((m % 8) * 4); 327301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ++m; 327401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 327501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 327601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller} 327701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 32786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic int 32796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_sreg4_map(uint32_t *p_map, int mid, uint32_t lin[4], 32806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 *fpi, struct nv50_sreg4 *vpo) 32816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 32826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int c; 32836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t mv = vpo->mask, mf = fpi->mask, oid = vpo->hw; 32846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t *map = (uint8_t *)p_map; 32856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 32876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (mf & 1) { 32886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fpi->linear == TRUE) 32896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller lin[mid / 32] |= 1 << (mid % 32); 32906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[mid++] = (mv & 1) ? oid : ((c == 3) ? 0x41 : 0x40); 32916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 32926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller oid += mv & 1; 32946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mf >>= 1; 32956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mv >>= 1; 32966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 32976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return mid; 32996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 33006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillervoid 33026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_linkage_validate(struct nv50_context *nv50) 33036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 33046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_grobj *tesla = nv50->screen->tesla; 33056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 33066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 33076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_stateobj *so; 33086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 dummy, *vpo; 33096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int i, n, c, m = 0; 331001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint32_t map[16], lin[4], reg[5], pcrd[8]; 33116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(map, 0, sizeof(map)); 33136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(lin, 0, sizeof(lin)); 33146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = 0x00000004; /* low and high clip distance map ids */ 33166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[2] = 0x00000000; /* layer index map id (disabled, GP only) */ 33176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[3] = 0x00000000; /* point size map id & enable */ 33186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] = fp->cfg.regs[0]; /* colour semantic reg */ 33196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] = fp->cfg.regs[1]; /* interpolant info */ 33206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.linear = FALSE; 33226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0xf; /* map all components of HPOS */ 33236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &dummy, &vp->cfg.io[0]); 33246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0x0; 33266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (vp->cfg.clpd < 0x40) { 33286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < vp->cfg.clpd_nr; ++c) 33296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[m++] = vp->cfg.clpd + c; 33306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = (m << 8); 33316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 33326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] |= m << 8; /* adjust BFC0 id */ 33344d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 33354d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller /* if light_twoside is active, it seems FFC0_ID == BFC0_ID is bad */ 33364d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (nv50->rasterizer->pipe.light_twoside) { 33374d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller vpo = &vp->cfg.two_side[0]; 33384d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 33394d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[0], &vpo[0]); 33404d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[1], &vpo[1]); 33414d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller } 33424d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 33436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] += m - 4; /* adjust FFC0 id */ 33446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] |= m << 8; /* set mid where 'normal' FP inputs start */ 33456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 0; 33476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fp->info.input_semantic_name[0] == TGSI_SEMANTIC_POSITION) 33486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 1; 33496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (; i < fp->cfg.io_nr; i++) { 33506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte sn = fp->info.input_semantic_name[fp->cfg.io[i].id_fp]; 33516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si = fp->info.input_semantic_index[fp->cfg.io[i].id_fp]; 33526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = fp->cfg.io[i].id_vp; 33546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n >= vp->cfg.io_nr || 33556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_name[n] != sn || 33566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_index[n] != si) 33576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &dummy; 33586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller else 33596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &vp->cfg.io[n]; 33606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.io[i], vpo); 33626516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 33636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 336406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (nv50->rasterizer->pipe.point_size_per_vertex) { 336506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller map[m / 4] |= vp->cfg.psiz << ((m % 4) * 8); 336606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller reg[3] = (m++ << 4) | 1; 336706dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller } 336806dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 33696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* now fill the stateobj */ 33706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so = so_new(64, 0); 33716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = (m + 3) / 4; 33736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 1); 33746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, m); 33756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP(0), n); 33766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, map, n); 33776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_MAP_SEMANTIC_0, 4); 33796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, reg, 4); 33806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_INTERPOLANT_CTRL, 1); 33826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, reg[4]); 33836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 33846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, 0x1540, 4); 33856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, lin, 4); 33866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 338701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (nv50->rasterizer->pipe.point_sprite) { 338801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50_pntc_replace(nv50, pcrd, (reg[4] >> 8) & 0xff); 338901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 339001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_method(so, tesla, NV50TCL_POINT_COORD_REPLACE_MAP(0), 8); 339101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_datap (so, pcrd, 8); 339201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 339301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 33946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(so, &nv50->state.programs); 33956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(NULL, &so); 33966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 33976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 3398f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3399f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 3400f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 340140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs while (p->exec_head) { 340240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = p->exec_head; 340340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 340440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e->next; 340540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs FREE(e); 3406f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 340740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = NULL; 340840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size = 0; 3409f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3410072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_ref(NULL, &p->bo); 3411f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 34121b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&p->data[0]); 34137c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 3414f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = 0; 3415f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3416