nv50_program.c revision ec5c23551cdb4c369d8f8f392208f4d4bf29911b
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 34f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs#define NV50_SU_MAX_TEMP 64 35ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller#define NV50_SU_MAX_ADDR 7 36b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs//#define NV50_PROGRAM_DUMP 37f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 389a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs/* ARL - gallium craps itself on progs/vp/arl.txt 3921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 4021e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * MSB - Like MAD, but MUL+SUB 4121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * - Fuck it off, introduce a way to negate args for ops that 4221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * support it. 4321e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 44ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Look into inlining IMMD for ops other than MOV (make it general?) 4533e4d30d50344be26398a51365bea1be37487403Ben Skeggs * - Maybe even relax restrictions a bit, can't do P_RESULT + P_IMMD, 4633e4d30d50344be26398a51365bea1be37487403Ben Skeggs * but can emit to P_TEMP first - then MOV later. NVIDIA does this 47ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * 482fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * In ops such as ADD it's possible to construct a bad opcode in the !is_long() 492fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * case, if the emit_src() causes the inst to suddenly become long. 502fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * 51ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Verify half-insns work where expected - and force disable them where they 52ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * don't work - MUL has it forcibly disabled atm as it fixes POW.. 53afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * 54afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * FUCK! watch dst==src vectors, can overwrite components that are needed. 55afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * ie. SUB R0, R0.yzxw, R0 56776e9581d16fc0fd28058fbcd879756fd5d40b96Ben Skeggs * 57b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * Things to check with renouveau: 58b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * FP attr/result assignment - how? 596d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * attrib 606d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16bc maps vp output onto fp hpos 616d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16c0 maps vp output onto fp col0 626d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * result 636d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - colr always 0-3 646d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - depr always 4 656d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16bc->0x16e8 --> some binding between vp/fp regs 666d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16b8 --> VP output count 676d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 686d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1298 --> "MOV rcol.x, fcol.y" "MOV depr, fcol.y" = 0x00000005 696d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * "MOV rcol.x, fcol.y" = 0x00000004 706d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x19a8 --> as above but 0x00000100 and 0x00000000 716d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x00100000 used when KIL used 726d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x196c --> as above but 0x00000011 and 0x00000000 736d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 746d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1988 --> 0xXXNNNNNN 756d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - XX == FP high something 7621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs */ 77f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_reg { 78f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs enum { 79f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_TEMP, 80f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_ATTR, 81f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_RESULT, 82f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_CONST, 83ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller P_IMMD, 84ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller P_ADDR 85f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } type; 86f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int index; 87f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 88f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int hw; 8938ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs int neg; 90bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 91dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller int rhw; /* result hw for FP outputs, or interpolant index */ 92bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller int acc; /* instruction where this reg is last read (first insn == 1) */ 93f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 94f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 95e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* arbitrary limits */ 961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller#define MAX_IF_DEPTH 4 97e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller#define MAX_LOOP_DEPTH 4 981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 99f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_pc { 100f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p; 101f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 102f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* hw resources */ 103f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r_temp[NV50_SU_MAX_TEMP]; 104ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg r_addr[NV50_SU_MAX_ADDR]; 105f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 106f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* tgsi resources */ 107f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *temp; 108f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int temp_nr; 109f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *attr; 110f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int attr_nr; 111f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *result; 112f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int result_nr; 113f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *param; 114f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int param_nr; 115f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *immd; 116f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs float *immd_buf; 117f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int immd_nr; 118ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg **addr; 119ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int addr_nr; 1202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 12121e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs struct nv50_reg *temp_temp[16]; 1222a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs unsigned temp_temp_nr; 123bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 124234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* broadcast and destination replacement regs */ 125234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_brdc; 126234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_dst[4]; 127234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 128e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller unsigned interp_mode[32]; 129dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller /* perspective interpolation registers */ 130dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_p; 131dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_c; 132e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 1331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_cond; 1341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_insn[MAX_IF_DEPTH]; 1351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *br_join[MAX_IF_DEPTH]; 136e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller struct nv50_program_exec *br_loop[MAX_LOOP_DEPTH]; /* for BRK branch */ 137e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int if_lvl, loop_lvl; 138e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller unsigned loop_pos[MAX_LOOP_DEPTH]; 1391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 140bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller /* current instruction and total number of insns */ 141bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_cur; 142bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_nr; 143d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 144d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller boolean allow32; 145f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 146f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 147e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerstatic INLINE void 148e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerctor_reg(struct nv50_reg *reg, unsigned type, int index, int hw) 149e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller{ 150e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->type = type; 151e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->index = index; 152e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->hw = hw; 153e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->neg = 0; 154e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->rhw = -1; 155e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->acc = 0; 156e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller} 157e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller 1586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 1596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerpopcnt4(uint32_t val) 1606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 1616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller static const unsigned cnt[16] 1626516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 1636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return cnt[val & 0xf]; 1646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 1656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 166f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 167ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerterminate_mbb(struct nv50_pc *pc) 168ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 169ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 170ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 171ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* remove records of temporary address register values */ 172ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 173ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index < 0) 174ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 175ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 176ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 177ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 178f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_reg(struct nv50_pc *pc, struct nv50_reg *reg) 179f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 180f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller int i = 0; 181f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 182fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (reg->type == P_RESULT) { 183fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (pc->p->cfg.high_result < (reg->hw + 1)) 184fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs pc->p->cfg.high_result = reg->hw + 1; 185fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs } 186fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs 1878ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->type != P_TEMP) 188f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 189f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1908ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->hw >= 0) { 1918ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs /*XXX: do this here too to catch FP temp-as-attr usage.. 1928ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs * not clean, but works */ 1938ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (reg->hw + 1)) 1948ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = reg->hw + 1; 1958ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs return; 1968ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs } 1978ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 198f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (reg->rhw != -1) { 199f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* try to allocate temporary with index rhw first */ 200f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (!(pc->r_temp[reg->rhw])) { 201f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->r_temp[reg->rhw] = reg; 202f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller reg->hw = reg->rhw; 203f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (pc->p->cfg.high_temp < (reg->rhw + 1)) 204f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->p->cfg.high_temp = reg->rhw + 1; 205f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller return; 206f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 207f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* make sure we don't get things like $r0 needs to go 208f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller * in $r1 and $r1 in $r0 209f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller */ 210f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller i = pc->result_nr * 4; 211f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 212f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller 213f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller for (; i < NV50_SU_MAX_TEMP; i++) { 214f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!(pc->r_temp[i])) { 215f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = reg; 216f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs reg->hw = i; 2178ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (i + 1)) 2188ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = i + 1; 219f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 220f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 221f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 222f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 223f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 224f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 225f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 226e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* XXX: For shaders that aren't executed linearly (e.g. shaders that 227e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * contain loops), we need to assign all hw regs to TGSI TEMPs early, 228e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * lest we risk temp_temps overwriting regs alloc'd "later". 229e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 230f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 231f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_temp(struct nv50_pc *pc, struct nv50_reg *dst) 232f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 233f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r; 234f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i; 235f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 236f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (dst && dst->type == P_TEMP && dst->hw == -1) 237f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return dst; 238f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 239f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < NV50_SU_MAX_TEMP; i++) { 240f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->r_temp[i]) { 241e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller r = MALLOC_STRUCT(nv50_reg); 242e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_TEMP, -1, i); 243f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = r; 244f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return r; 245f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 246f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 247f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 248f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 249f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return NULL; 250f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 251f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 252dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller/* Assign the hw of the discarded temporary register src 253dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller * to the tgsi register dst and free src. 254dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller */ 255dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic void 256dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerassimilate_temp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 257dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 258dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assert(src->index == -1 && src->hw != -1); 259dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 260dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (dst->hw != -1) 261dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[dst->hw] = NULL; 262dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[src->hw] = dst; 263dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller dst->hw = src->hw; 264dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 265dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller FREE(src); 266dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 267dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 2687ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller/* release the hardware resource held by r */ 2697ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 2707ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerrelease_hw(struct nv50_pc *pc, struct nv50_reg *r) 2717ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 2727ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(r->type == P_TEMP); 2737ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->hw == -1) 2747ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller return; 2757ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2767ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(pc->r_temp[r->hw] == r); 2777ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller pc->r_temp[r->hw] = NULL; 2787ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2797ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller r->acc = 0; 2807ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->index == -1) 2817ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller FREE(r); 2827ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 2837ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 284f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 285f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsfree_temp(struct nv50_pc *pc, struct nv50_reg *r) 286f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 287f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (r->index == -1) { 288619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs unsigned hw = r->hw; 289619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs 290619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs FREE(pc->r_temp[hw]); 291619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs pc->r_temp[hw] = NULL; 292f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 293f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 294f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2953f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic int 2963f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsalloc_temp4(struct nv50_pc *pc, struct nv50_reg *dst[4], int idx) 2973f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 2983f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 2993f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3003f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if ((idx + 4) >= NV50_SU_MAX_TEMP) 3013f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 1; 3023f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3033f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if (pc->r_temp[idx] || pc->r_temp[idx + 1] || 3043f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + 2] || pc->r_temp[idx + 3]) 305a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller return alloc_temp4(pc, dst, idx + 4); 3063f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3073f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) { 308e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller dst[i] = MALLOC_STRUCT(nv50_reg); 309e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(dst[i], P_TEMP, -1, idx + i); 3103f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + i] = dst[i]; 3113f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs } 3123f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3133f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 0; 3143f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3153f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3163f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic void 3173f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsfree_temp4(struct nv50_pc *pc, struct nv50_reg *reg[4]) 3183f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3193f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3203f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3213f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) 3223f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs free_temp(pc, reg[i]); 3233f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3243f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 325f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 3262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggstemp_temp(struct nv50_pc *pc) 3272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 32821e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (pc->temp_temp_nr >= 16) 3292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs assert(0); 3302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp[pc->temp_temp_nr] = alloc_temp(pc, NULL); 3322a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return pc->temp_temp[pc->temp_temp_nr++]; 3332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3342a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 3362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggskill_temp_temp(struct nv50_pc *pc) 3372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 3382a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs int i; 3392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs for (i = 0; i < pc->temp_temp_nr; i++) 3412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs free_temp(pc, pc->temp_temp[i]); 3422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp_nr = 0; 3432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 34533e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic int 34633e4d30d50344be26398a51365bea1be37487403Ben Skeggsctor_immd(struct nv50_pc *pc, float x, float y, float z, float w) 34733e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 348f1aa2a43b7588aaca3ef175c8cc5366414cac2f8Christoph Bumiller pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * 4 * sizeof(float)), 349861629d1fd4a1d256c913470c33d9522e83d615dBen Skeggs (pc->immd_nr + 1) * 4 * sizeof(float)); 35033e4d30d50344be26398a51365bea1be37487403Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 0] = x; 351686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 1] = y; 352686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 2] = z; 353686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 3] = w; 35433e4d30d50344be26398a51365bea1be37487403Ben Skeggs 35533e4d30d50344be26398a51365bea1be37487403Ben Skeggs return pc->immd_nr++; 35633e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 35733e4d30d50344be26398a51365bea1be37487403Ben Skeggs 35833e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic struct nv50_reg * 35933e4d30d50344be26398a51365bea1be37487403Ben Skeggsalloc_immd(struct nv50_pc *pc, float f) 36033e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 361e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller struct nv50_reg *r = MALLOC_STRUCT(nv50_reg); 36233e4d30d50344be26398a51365bea1be37487403Ben Skeggs unsigned hw; 36333e4d30d50344be26398a51365bea1be37487403Ben Skeggs 3647e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller for (hw = 0; hw < pc->immd_nr * 4; hw++) 3657e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (pc->immd_buf[hw] == f) 3667e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller break; 3677e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 3687e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (hw == pc->immd_nr * 4) 3697e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller hw = ctor_immd(pc, f, -f, 0.5 * f, 0) * 4; 3707e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 371e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_IMMD, -1, hw); 37233e4d30d50344be26398a51365bea1be37487403Ben Skeggs return r; 37333e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 37433e4d30d50344be26398a51365bea1be37487403Ben Skeggs 37540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic struct nv50_program_exec * 37640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsexec(struct nv50_pc *pc) 37740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs{ 37840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = CALLOC_STRUCT(nv50_program_exec); 37940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3801c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = -1; 38140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs return e; 38240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs} 38340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 38455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 38540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsemit(struct nv50_pc *pc, struct nv50_program_exec *e) 38655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 38755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs struct nv50_program *p = pc->p; 38855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 38940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (p->exec_tail) 39040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail->next = e; 39140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (!p->exec_head) 39240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e; 39340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = e; 39440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size += (e->inst[0] & 1) ? 2 : 1; 39555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 39655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 39740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic INLINE void set_long(struct nv50_pc *, struct nv50_program_exec *); 39855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 39955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 40040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_long(struct nv50_program_exec *e) 40155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 40240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 1) 40355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 40455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 40555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 40655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 40755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 40840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_immd(struct nv50_program_exec *e) 40955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 41040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && (e->inst[1] & 3) == 3) 41155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 41255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 41355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 41455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 41555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 41640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred(struct nv50_pc *pc, unsigned pred, unsigned idx, 41740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 41855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 41940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 42040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x1f << 7) | (0x3 << 12)); 42140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (pred << 7) | (idx << 12); 42255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 42355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 42540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred_wr(struct nv50_pc *pc, unsigned on, unsigned idx, 42640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 42755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 42840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 42940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x3 << 4) | (1 << 6)); 43040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (idx << 4) | (on << 6); 43155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 43255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 43440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_long(struct nv50_pc *pc, struct nv50_program_exec *e) 43555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 43640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e)) 43755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return; 43855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 1; 44040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0xf, 0, e); 44140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 44255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 44355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 44455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 44540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_dst(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_program_exec *e) 44655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 44755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (dst->type == P_RESULT) { 44840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 44940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000008; 45055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 45155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, dst); 45340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (dst->hw << 2); 45455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 45555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 45740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct nv50_program_exec *e) 45855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 459c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller float f = pc->immd_buf[imm->hw]; 460c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller unsigned val = fui(imm->neg ? -f : f); 46155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 46240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 46355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: can't be predicated - bits overlap.. catch cases where both 46455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * are required and avoid them. */ 46540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0, 0, e); 46640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 46755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 46840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000002 | 0x00000001; 46940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (val & 0x3f) << 16; 47040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (val >> 6) << 2; 47155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 47255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 473ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 474ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleremit_set_addr(struct nv50_pc *pc, struct nv50_reg *dst, unsigned val) 475ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 476ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 477ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 478ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(val <= 0xffff); 479ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] = 0xd0000000 | ((val & 0xffff) << 9); 480ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] = 0x20000000; 481ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= dst->hw << 2; 482ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 483ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 484ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 485ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 486ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 487ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic struct nv50_reg * 488ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleralloc_addr(struct nv50_pc *pc, struct nv50_reg *ref) 489ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 490ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller int i; 491ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg *a = NULL; 492ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 493ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!ref) { 494ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) { 495ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) 496ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 497ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw >= 0 && 498ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc == pc->insn_cur) 499ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 500ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 501ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].rhw = -1; 502ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].index = i; 503ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 504ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 505ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(0); 506ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return NULL; 507ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 508ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 509ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = NV50_SU_MAX_ADDR - 1; i >= 0; --i) { 510ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].index >= 0) /* occupied for TGSI */ 511ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 512ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->r_addr[i].rhw < 0) { /* unused */ 513ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 514ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller continue; 515ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 516ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!a && pc->r_addr[i].acc != pc->insn_cur) 517ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a = &pc->r_addr[i]; 518ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 519ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (ref->hw - pc->r_addr[i].rhw < 128) { 520ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* alloc'd & suitable */ 521ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->r_addr[i].acc = pc->insn_cur; 522ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return &pc->r_addr[i]; 523ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 524ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 525ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(a); 526ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_set_addr(pc, a, ref->hw * 4); 527ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 528ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a->rhw = ref->hw % 128; 529ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller a->acc = pc->insn_cur; 530ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return a; 531ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 532e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 533e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_LINEAR 0 534ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller#define INTERP_FLAT 1 535e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_PERSPECTIVE 2 536e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_CENTROID 4 537e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 538dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller/* interpolant index has been stored in dst->rhw */ 53955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 540dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumilleremit_interp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *iv, 541dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller unsigned mode) 5428ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs{ 543dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller assert(dst->rhw != -1); 54440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 5458ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 54640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x80000000; 54740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 548dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (dst->rhw << 16); 549dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 550dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_FLAT) { 551dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 8); 552dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } else { 553dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_PERSPECTIVE) { 554dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 25); 555dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller alloc_reg(pc, iv); 556dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (iv->hw << 9); 557dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 558dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 559dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_CENTROID) 560dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 24); 5615a3ea9ee59ac586955f7784eb25e7fd70d0c8882Ben Skeggs } 5628ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 56340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 5648ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs} 5658ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 566ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic INLINE void 567ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerset_addr(struct nv50_program_exec *e, struct nv50_reg *a) 568ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 569ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(!(e->inst[0] & 0x0c000000)); 570ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(!(e->inst[1] & 0x00000004)); 571ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 572ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= (a->hw & 3) << 26; 573ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= (a->hw >> 2) << 2; 574ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 575ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 5768ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggsstatic void 5771c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggsset_data(struct nv50_pc *pc, struct nv50_reg *src, unsigned m, unsigned s, 5781c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs struct nv50_program_exec *e) 5792a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 58040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 5811c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 5821c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = src->hw; 5831c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.shift = s; 5841c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.mask = m << (s % 32); 58594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 586ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->hw > 127) 587ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, alloc_addr(pc, src)); 588ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller else 589ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->acc < 0) { 590ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src->type == P_CONST); 591ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_addr(e, pc->addr[src->index]); 592ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 593ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 59494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller e->inst[1] |= (((src->type == P_IMMD) ? 0 : 1) << 22); 5952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 5962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 5972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 59855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsemit_mov(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 59955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 60040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 60155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6022eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller e->inst[0] = 0x10000000; 6032eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!pc->allow32) 6042eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_long(pc, e); 60555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 60640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 60755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6082eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!is_long(e) && src->type == P_IMMD) { 60940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_immd(pc, src, e); 61055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: 32-bit, but steals part of "half" reg space - need to 61155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * catch and handle this case if/when we do half-regs 61255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs */ 61355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else 61455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_IMMD || src->type == P_CONST) { 61540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6161c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 9, e); 61740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x20000000; /* src0 const? */ 61855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else { 61955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_ATTR) { 62040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 62140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 62255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 62355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 62455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, src); 62540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 62655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 62755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 62840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && !is_immd(e)) { 62940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x04000000; /* 32-bit */ 630d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x0000c000; /* "subsubop" 0x3 */ 631d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (!(e->inst[1] & 0x20000000)) 632d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x00030000; /* "subsubop" 0xf */ 633d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller } else 634d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[0] |= 0x00008000; 63555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 63640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 63755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 63855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 6394a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumillerstatic INLINE void 6404a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumilleremit_mov_immdval(struct nv50_pc *pc, struct nv50_reg *dst, float f) 6414a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller{ 6424a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller struct nv50_reg *imm = alloc_immd(pc, f); 6434a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov(pc, dst, imm); 6444a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller FREE(imm); 6454a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller} 6464a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller 647f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 6482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggscheck_swap_src_0_1(struct nv50_pc *pc, 6492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg **s0, struct nv50_reg **s1) 6502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 6512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src0 = *s0, *src1 = *s1; 6522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type == P_CONST) { 6542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type != P_CONST) { 6552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 6562a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 6572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 6582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type == P_ATTR) { 6612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type != P_ATTR) { 6622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 6632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 6642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 6652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return FALSE; 6692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6712a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 672001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerset_src_0_restricted(struct nv50_pc *pc, struct nv50_reg *src, 673001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_program_exec *e) 674001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller{ 675001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_reg *temp; 676001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 677001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (src->type != P_TEMP) { 678001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller temp = temp_temp(pc); 679001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller emit_mov(pc, temp, src); 680001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller src = temp; 681001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller } 682001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 683001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller alloc_reg(pc, src); 684001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller e->inst[0] |= (src->hw << 9); 685001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller} 686001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 687001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerstatic void 68840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_0(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 6892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 6902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 69140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 69240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 6932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 6952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 6962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 6982a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 6992a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 70240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 7032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 70640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_1(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 7082a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 7092a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7112a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7132a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7142a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 71540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x00800000)); 71640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x01000000) { 71734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 71834a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 71934a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 72034a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 72134a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 7221c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 16, e); 72340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x00800000; 72434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 7252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 728ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= ((src->hw & 127) << 16); 7292a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7312a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 73240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_2(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 7332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 73440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 7352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 7372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 7382a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 7402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 7412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 7422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 74340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x01000000)); 74440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x00800000) { 74534a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 74634a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 74734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 74834a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 74934a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 7501c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 32+14, e); 75140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x01000000; 75234a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 7532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 7542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 756ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= ((src->hw & 127) << 14); 7572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 7602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mul(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 7612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 7622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 76340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 7642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 76540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xc0000000; 7662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 767708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (!pc->allow32) 768708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 769708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 7702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 77140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 77240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 773c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_IMMD && !is_long(e)) { 774c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg) 775c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 776708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 777c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } else { 778708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_src_1(pc, src1, e); 779c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg ^ src1->neg) { 780c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (is_long(e)) 781c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 782c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 783c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 784c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 785c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 7862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 78740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 7882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 79152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_add(struct nv50_pc *pc, struct nv50_reg *dst, 79252a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 7932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 79440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 7952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 79640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 7972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 798c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 799c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 800c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (!pc->allow32 || src0->neg || src1->neg) { 801708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 802c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= (src0->neg << 26) | (src1->neg << 27); 803c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 804708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 80540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 80640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 807c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_CONST || src1->type == P_ATTR || is_long(e)) 80840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src1, e); 80952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs else 810708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (src1->type == P_IMMD) 811708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 812708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller else 81340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 81452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 81540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 81652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs} 81752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 81852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsstatic void 819ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumilleremit_arl(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 820ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller uint8_t s) 821ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller{ 822ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_program_exec *e = exec(pc); 823ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 824ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_long(pc, e); 825ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[1] |= 0xc0000000; 826ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 827ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= dst->hw << 2; 828ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller e->inst[0] |= s << 16; /* shift left */ 829ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller set_src_0_restricted(pc, src, e); 830ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 831ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit(pc, e); 832ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller} 833ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 834ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumillerstatic void 83552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_minmax(struct nv50_pc *pc, unsigned sub, struct nv50_reg *dst, 83652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 83752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs{ 83840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 83952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 84040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 84140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 84240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 84352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 84452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 84540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 84640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 84740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 8482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 84940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 852c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 8532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_sub(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 8542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 8552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 856c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src1->neg ^= 1; 857c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_add(pc, dst, src0, src1); 858c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src1->neg ^= 1; 8592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 8622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mad(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 8632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 8642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 86540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 86740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xe0000000; 8682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 8692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 87040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 87140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 87240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 87340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src2, e); 8742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 875c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg ^ src1->neg) 876c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x04000000; 877c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src2->neg) 878c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 879c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 88040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8822a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 883c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 88421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsemit_msb(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 88521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 88621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs{ 887c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src2->neg ^= 1; 888c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_mad(pc, dst, src0, src1, src2); 889c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src2->neg ^= 1; 89021e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs} 89121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs 89221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsstatic void 8932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_flop(struct nv50_pc *pc, unsigned sub, 8942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *dst, struct nv50_reg *src) 8952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 89640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 89840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x90000000; 89952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs if (sub) { 90040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 90140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 90252a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs } 9032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 90440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 905001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 906001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (sub == 0 || sub == 2) 907001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0_restricted(pc, src, e); 908001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller else 909001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0(pc, src, e); 9102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 91140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 9132a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 914d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsstatic void 915d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsemit_preex2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 916d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs{ 91740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 918d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 91940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 920d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 92140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 92240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 92340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 92440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29) | 0x00004000; 925d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 92640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 927d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs} 928faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 929bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggsstatic void 9307b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_precossin(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 9317b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs{ 93240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 9337b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 93440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 9357b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 93640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 93740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 93840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 93940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29); 9407b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 94140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9427b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs} 9437b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 94487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_RN 0x01 94587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_FLOOR 0x03 94687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_CEIL 0x05 94787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_TRUNC 0x07 94887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_SAT 0x08 94987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_ABS 0x10 95087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 9511635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller/* 0x04 == 32 bit dst */ 9522b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x40 == dst is float */ 9532b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x80 == src is float */ 95487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_F32 0xc4 95587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_S32 0x44 95687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_U32 0x64 95787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_F32 0x8c 95887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_S32 0x0c 959ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_NEG 0x20 960ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_RI 0x08 96187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 96287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic void 96387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumilleremit_cvt(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 9642b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller int wp, unsigned cvn, unsigned fmt) 96587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller{ 96687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller struct nv50_program_exec *e; 96787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 96887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e = exec(pc); 96987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_long(pc, e); 97087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 97187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0xa0000000; 9721635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] |= 0x00004000; /* 32 bit src */ 9732b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= (cvn << 16); 97487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= (fmt << 24); 97587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_src_0(pc, src, e); 97687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 97787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (wp >= 0) 97887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_pred_wr(pc, 1, wp, e); 97987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 98087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (dst) 98187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_dst(pc, dst, e); 98287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller else { 98387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0x000001fc; 98487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= 0x00000008; 98587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller } 98687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 98787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit(pc, e); 98887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller} 98987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 9902b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* nv50 Condition codes: 9912b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x1 = LT 9922b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x2 = EQ 9932b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x3 = LE 9942b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x4 = GT 9952b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x5 = NE 9962b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x6 = GE 9972b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x7 = set condition code ? (used before bra.lt/le/gt/ge) 9982b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x8 = unordered bit (allows NaN) 9992b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller */ 10007b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsstatic void 10012b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumilleremit_set(struct nv50_pc *pc, unsigned ccode, struct nv50_reg *dst, int wp, 1002bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 1003bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs{ 1004d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller static const unsigned cc_swapped[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 1005d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller 100640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 1007bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *rdst; 1008bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 10092b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(ccode < 16); 1010bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (check_swap_src_0_1(pc, &src0, &src1)) 1011d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller ccode = cc_swapped[ccode & 7] | (ccode & 8); 1012bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1013bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs rdst = dst; 10142b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst && dst->type != P_TEMP) 1015bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs dst = alloc_temp(pc, NULL); 1016bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 1017bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs /* set.u32 */ 101840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 101940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 10202b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x60000000 | (ccode << 14); 10212b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 10222b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* XXX: decuda will disasm as .u16 and use .lo/.hi regs, but 10232b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * that doesn't seem to match what the hw actually does 10242b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x04000000; << breaks things, u32 by default ? 1025bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs */ 10262b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 10272b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (wp >= 0) 10282b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_pred_wr(pc, 1, wp, e); 10292b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst) 10302b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_dst(pc, dst, e); 10312b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller else { 10322b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[0] |= 0x000001fc; 10332b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x00000008; 10342b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 10352b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 103640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 103740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 1038bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 103940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 10401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_cond = pc->p->exec_tail; /* record for OPCODE_IF */ 1041bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 10422b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* cvt.f32.u32/s32 (?) if we didn't only write the predicate */ 10432b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst) 10442b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_cvt(pc, rdst, dst, -1, CVTOP_ABS | CVTOP_RN, CVT_F32_S32); 10452b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst && rdst != dst) 1046bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs free_temp(pc, dst); 1047bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs} 1048d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 10492b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillerstatic INLINE unsigned 10502b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillermap_tgsi_setop_cc(unsigned op) 10512b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller{ 10522b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller switch (op) { 10532b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLT: return 0x1; 10542b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: return 0x6; 10552b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: return 0x2; 10562b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: return 0x4; 10572b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: return 0x3; 10582b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: return 0xd; 10592b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller default: 10602b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(0); 10612b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller return 0; 10622b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 10632b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller} 10642b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 106587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1066b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggsemit_flr(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1067b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs{ 1068ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_FLOOR, CVT_F32_F32 | CVT_RI); 1069b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs} 1070b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs 1071faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsstatic void 1072faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsemit_pow(struct nv50_pc *pc, struct nv50_reg *dst, 1073faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *v, struct nv50_reg *e) 1074faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs{ 1075faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *temp = alloc_temp(pc, NULL); 1076faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1077faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 3, temp, v); 1078faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_mul(pc, temp, temp, e); 1079faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_preex2(pc, temp, temp); 1080faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 6, dst, temp); 1081faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 1082faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs free_temp(pc, temp); 1083faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs} 1084faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 108587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 1086fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsemit_abs(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1087fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 108887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_ABS, CVT_F32_F32); 1089fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1090fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1091234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic INLINE void 1092234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumilleremit_sat(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 1093234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 1094234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_SAT, CVT_F32_F32); 1095234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 1096234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 109701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggsstatic void 10987b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_lit(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 10997b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs struct nv50_reg **src) 110001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs{ 110101e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *one = alloc_immd(pc, 1.0); 110201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *zero = alloc_immd(pc, 0.0); 110301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *neg128 = alloc_immd(pc, -127.999999); 110401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *pos128 = alloc_immd(pc, 127.999999); 110501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *tmp[4]; 1106708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller boolean allow32 = pc->allow32; 1107708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1108708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = FALSE; 110901e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11107b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (3 << 1)) { 1111dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller tmp[0] = alloc_temp(pc, NULL); 11127b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[0], src[0], zero); 11137b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 111401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11157b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 2)) { 111640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 1, 0, pc->p->exec_tail); 111701e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11187b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[1] = temp_temp(pc); 11197b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[1], src[1], zero); 112001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11217b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[3] = temp_temp(pc); 11227b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[3], src[3], neg128); 11237b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 5, tmp[3], tmp[3], pos128); 112401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11257b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_pow(pc, dst[2], tmp[1], tmp[3]); 11267b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_mov(pc, dst[2], zero); 112740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 3, 0, pc->p->exec_tail); 11287b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 11299417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 1130dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 1)) 1131dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assimilate_temp(pc, dst[1], tmp[0]); 1132dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller else 1133dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 2)) 1134dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller free_temp(pc, tmp[0]); 1135dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1136708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = allow32; 1137708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1138dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller /* do this last, in case src[i,j] == dst[0,3] */ 1139dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 0)) 1140dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[0], one); 1141dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1142dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 3)) 1143dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[3], one); 1144dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 11459417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pos128); 11469417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(neg128); 11479417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(zero); 11489417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(one); 114901e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs} 115001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 11511635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic INLINE void 115231f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggsemit_neg(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 115331f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs{ 11541635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_RN, CVT_F32_F32 | CVT_NEG); 115531f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs} 115631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs 1157d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsstatic void 1158d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsemit_kil(struct nv50_pc *pc, struct nv50_reg *src) 1159d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs{ 1160d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs struct nv50_program_exec *e; 1161d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs const int r_pred = 1; 1162eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller unsigned cvn = CVT_F32_F32; 1163d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1164c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src->neg) 1165eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller cvn |= CVT_NEG; 1166eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* write predicate reg */ 1167eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller emit_cvt(pc, NULL, src, r_pred, CVTOP_RN, cvn); 1168d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1169eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* conditional discard */ 1170d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs e = exec(pc); 1171eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller e->inst[0] = 0x00000002; 1172d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs set_long(pc, e); 1173eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller set_pred(pc, 0x1 /* LT */, r_pred, e); 1174d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit(pc, e); 1175d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs} 1176d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 117744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerstatic void 11783accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumilleremit_tex(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 11793accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_reg **src, unsigned unit, unsigned type, boolean proj) 11803accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller{ 11813accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_reg *temp, *t[4]; 11823accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_program_exec *e; 11833accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11843accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller unsigned c, mode, dim; 11853accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11863accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller switch (type) { 11873accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_1D: 11883accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 1; 11893accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 11903accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_UNKNOWN: 11913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_2D: 11923accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW1D: /* XXX: x, z */ 11933accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_RECT: 11943accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 2; 11953accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 11963accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_3D: 11973accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_CUBE: 11983accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW2D: 11993accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOWRECT: /* XXX */ 12003accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 3; 12013accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 12023accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller default: 12033accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assert(0); 12043accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 12053accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12063accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1207a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller /* some cards need t[0]'s hw index to be a multiple of 4 */ 12083accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller alloc_temp4(pc, t, 0); 12093accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12103accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (proj) { 12113accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (src[0]->type == P_TEMP && src[0]->rhw != -1) { 12123accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller mode = pc->interp_mode[src[0]->index]; 12133accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12143accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[3]->rhw = src[3]->rhw; 12153accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[3], NULL, (mode & INTERP_CENTROID)); 12163accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], t[3]); 12173accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12183accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) { 12193accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[c]->rhw = src[c]->rhw; 12203accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[c], t[3], 12213accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller (mode | INTERP_PERSPECTIVE)); 12223accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12233accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 12243accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], src[3]); 12253accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) 12263accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mul(pc, t[c], src[c], t[3]); 12273accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12283accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: for some reason the blob sometimes uses MAD: 12293accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * emit_mad(pc, t[c], src[0][c], t[3], t[3]) 12303accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * pc->p->exec_tail->inst[1] |= 0x080fc000; 12313accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller */ 12323accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12333accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 12343accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (type == TGSI_TEXTURE_CUBE) { 12353accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller temp = temp_temp(pc); 12363accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_minmax(pc, 4, temp, src[0], src[1]); 12373accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_minmax(pc, 4, temp, temp, src[2]); 12383accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, temp, temp); 12393accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 3; c++) 12403accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mul(pc, t[c], src[c], temp); 12413accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 12423accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) 12433accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mov(pc, t[c], src[c]); 12443accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12453accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12463accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12473accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e = exec(pc); 12483accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_long(pc, e); 12493accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0xf0000000; 12503accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= 0x00000004; 12513accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_dst(pc, t[0], e); 12523accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (unit << 9); 12533accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12543accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (dim == 2) 12553accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00400000; 12563accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 12573accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (dim == 3) 12583accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00800000; 12593accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12603accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (mask & 0x3) << 25; 12613accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= (mask & 0xc) << 12; 12623accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12633accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit(pc, e); 12643accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12653accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#if 1 12665f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller c = 0; 12675f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 1) emit_mov(pc, dst[0], t[c++]); 12685f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 2) emit_mov(pc, dst[1], t[c++]); 12695f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 4) emit_mov(pc, dst[2], t[c++]); 12705f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 8) emit_mov(pc, dst[3], t[c]); 12713accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12723accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp4(pc, t); 12733accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#else 12743accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: if p.e. MUL is used directly after TEX, it would still use 12753accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * the texture coordinates, not the fetched values: latency ? */ 12763accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12773accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 4; c++) { 12783accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (mask & (1 << c)) 12793accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assimilate_temp(pc, dst[c], t[c]); 12803accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 12813accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp(pc, t[c]); 12823accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 12833accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#endif 12843accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller} 12853accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 12863accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumillerstatic void 12871196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_branch(struct nv50_pc *pc, int pred, unsigned cc, 12881196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec **join) 12891196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 12901196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 12911196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 12921196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (join) { 12931196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 12941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0xa0000002; 12951196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 12961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller *join = e; 12971196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e = exec(pc); 12981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 12991196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 13001196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 13011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0x10000002; 13021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pred >= 0) 13031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_pred(pc, cc, pred, e); 13041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 13051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 13061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 13071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 13081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_nop(struct nv50_pc *pc) 13091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 13101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 13111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 13121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] = 0xf0000000; 13131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 13141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[1] = 0xe0000000; 13151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 13161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 13171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 13181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 13191635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddx(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 13201635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 13211635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 13221635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13231635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 13241635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13251635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0140000; 13261635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x89800000; 13271635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 13281635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 13291635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 13301635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 13311635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13321635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 13331635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 13341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13351635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 13361635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddy(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 13371635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 13381635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 13391635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13401635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 13411635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!src->neg) /* ! double negation */ 13431635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_neg(pc, src, src); 13441635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13451635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0150000; 13461635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x8a400000; 13471635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 13481635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 13491635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 13501635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 13511635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13521635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 13531635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 13541635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 13551635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 135644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerconvert_to_long(struct nv50_pc *pc, struct nv50_program_exec *e) 135744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller{ 135844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller unsigned q = 0, m = ~0; 135944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 136044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(!is_long(e)); 136144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 136244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller switch (e->inst[0] >> 28) { 136344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x1: 136444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MOV */ 136544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = 0x0403c000; 136644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = 0xffff7fff; 136744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 136844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x8: 13698b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller /* INTERP (move centroid, perspective and flat bits) */ 13708b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller m = ~0x03000100; 13718b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q = (e->inst[0] & (3 << 24)) >> (24 - 16); 13728b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q |= (e->inst[0] & (1 << 8)) << (18 - 8); 137344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 137444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x9: 137544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* RCP */ 137644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 137744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xB: 137844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* ADD */ 137944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~(127 << 16); 138044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) >> 2); 138144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 138244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xC: 138344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MUL */ 138444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~0x00008000; 138544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) << 12); 138644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 138744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xE: 138844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MAD (if src2 == dst) */ 138944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & 0x1fc) << 12); 139044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 139144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller default: 139244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(0); 139344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 139444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller } 139544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 139644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller set_long(pc, e); 139744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller pc->p->exec_size++; 139844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 139944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[0] &= m; 140044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[1] |= q; 140144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller} 140244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 1403f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller/* Some operations support an optional negation flag. */ 1404c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic boolean 1405c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillernegate_supported(const struct tgsi_full_instruction *insn, int i) 1406c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller{ 1407f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller int s; 1408f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1409c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller switch (insn->Instruction.Opcode) { 14101635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 1411c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP3: 1412c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP4: 1413c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MUL: 1414c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_KIL: 1415c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_ADD: 1416c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_SUB: 1417c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MAD: 1418f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1419c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_POW: 1420f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (i == 1) 1421f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1422f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1423c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller default: 1424c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller return FALSE; 1425c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 1426f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1427f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller /* Watch out for possible multiple uses of an nv50_reg, we 1428f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller * can't use nv50_reg::neg in these cases. 1429f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller */ 1430f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller for (s = 0; s < insn->Instruction.NumSrcRegs; ++s) { 1431f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (s == i) 1432f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller continue; 1433f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if ((insn->FullSrcRegisters[s].SrcRegister.Index == 1434f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller insn->FullSrcRegisters[i].SrcRegister.Index) && 1435f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller (insn->FullSrcRegisters[s].SrcRegister.File == 1436f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller insn->FullSrcRegisters[i].SrcRegister.File)) 1437f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1438f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller } 1439f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1440f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return TRUE; 1441c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller} 1442c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 14435d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller/* Return a read mask for source registers deduced from opcode & write mask. */ 14445d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillerstatic unsigned 14455d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *insn, int c) 14465d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller{ 14475d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned x, mask = insn->FullDstRegisters[0].DstRegister.WriteMask; 14485d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 14495d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (insn->Instruction.Opcode) { 14505d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_COS: 14515d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SIN: 14525d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 14535d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP3: 14545d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x7; 14555d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP4: 14565d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DPH: 14575d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 14585d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xf; 14595d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DST: 14605d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask & (c ? 0xa : 0x6); 14615d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_EX2: 14625d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LG2: 14635d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_POW: 14645d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RCP: 14655d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RSQ: 14665d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SCS: 14675d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x1; 14685d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LIT: 14695d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xb; 14705d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TEX: 14715d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TXP: 14725d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller { 14735d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller const struct tgsi_instruction_ext_texture *tex; 14745d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 14755d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller assert(insn->Instruction.Extended); 14765d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller tex = &insn->InstructionExtTexture; 14775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 14785d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = 0x7; 14795d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (insn->Instruction.Opcode == TGSI_OPCODE_TXP) 14805d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask |= 0x8; 14815d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 14825d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (tex->Texture) { 14835d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_1D: 14845d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0x9; 14855d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 14865d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_2D: 14875d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0xb; 14885d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 14895d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 14905d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 14915d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 14925d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 14935d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 14945d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_XPD: 14955d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller x = 0; 14965d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 1) x |= 0x6; 14975d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 2) x |= 0x5; 14985d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 4) x |= 0x3; 14995d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return x; 15005d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 15015d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 15025d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 15035d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 15045d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 15055d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller} 15065d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 1507fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1508fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggstgsi_dst(struct nv50_pc *pc, int c, const struct tgsi_full_dst_register *dst) 1509fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1510fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (dst->DstRegister.File) { 1511fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1512fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->temp[dst->DstRegister.Index * 4 + c]; 1513fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_OUTPUT: 1514fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->result[dst->DstRegister.Index * 4 + c]; 1515ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 1516ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller { 1517ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller struct nv50_reg *r = pc->addr[dst->DstRegister.Index * 4 + c]; 1518ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!r) { 1519ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = alloc_addr(pc, NULL); 1520ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr[dst->DstRegister.Index * 4 + c] = r; 1521ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1522ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1523ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return r; 1524ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1525fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_NULL: 1526fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1527fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1528fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1529fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1530fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1531fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1532fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1533fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1534fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1535c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillertgsi_src(struct nv50_pc *pc, int chan, const struct tgsi_full_src_register *src, 1536c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller boolean neg) 1537fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1538fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *r = NULL; 1539fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *temp; 1540ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller unsigned sgn, c, swz; 1541ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 1542ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src->SrcRegister.File != TGSI_FILE_CONSTANT) 1543ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(!src->SrcRegister.Indirect); 15449417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 15459417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller sgn = tgsi_util_get_full_src_register_sign_mode(src, chan); 1546fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1547fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs c = tgsi_util_get_full_src_register_extswizzle(src, chan); 1548fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (c) { 1549fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_X: 1550fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_Y: 1551fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_Z: 1552fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_W: 1553fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (src->SrcRegister.File) { 1554fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_INPUT: 1555fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->attr[src->SrcRegister.Index * 4 + c]; 1556fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1557fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1558fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->temp[src->SrcRegister.Index * 4 + c]; 1559fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1560fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_CONSTANT: 1561ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!src->SrcRegister.Indirect) { 1562ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = &pc->param[src->SrcRegister.Index * 4 + c]; 1563ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1564ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 1565ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller /* Indicate indirection by setting r->acc < 0 and 1566ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller * use the index field to select the address reg. 1567ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller */ 1568ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = MALLOC_STRUCT(nv50_reg); 1569ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller swz = tgsi_util_get_src_register_swizzle( 1570ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller &src->SrcRegisterInd, 0); 1571ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller ctor_reg(r, P_CONST, 1572ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller src->SrcRegisterInd.Index * 4 + swz, c); 1573ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r->acc = -1; 1574fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1575fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_IMMEDIATE: 1576fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->immd[src->SrcRegister.Index * 4 + c]; 1577fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1578c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 1579c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 1580ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 1581ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller r = pc->addr[src->SrcRegister.Index * 4 + c]; 1582ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(r); 1583ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1584fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1585fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1586fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1587fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1588fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1589fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_ZERO: 1590fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = alloc_immd(pc, 0.0); 15919417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return r; 1592fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_ONE: 15939417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (sgn == TGSI_UTIL_SIGN_TOGGLE || sgn == TGSI_UTIL_SIGN_SET) 15949417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return alloc_immd(pc, -1.0); 15959417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return alloc_immd(pc, 1.0); 1596fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1597fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1598fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1599fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1600fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 16019417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller switch (sgn) { 1602fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_KEEP: 1603fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1604fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_CLEAR: 1605fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs temp = temp_temp(pc); 1606fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, temp, r); 1607fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = temp; 1608fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 160931f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_TOGGLE: 1610c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1611c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r->neg = 1; 1612c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else { 1613c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp = temp_temp(pc); 1614c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, r); 1615c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r = temp; 1616c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 161731f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 161831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_SET: 161931f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs temp = temp_temp(pc); 162031f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs emit_abs(pc, temp, r); 1621c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1622c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp->neg = 1; 1623c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 1624c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, temp); 162531f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs r = temp; 162631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 1627fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1628fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1629fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1630fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1631fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1632fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return r; 1633fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1634fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 16352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* return TRUE for ops that produce only a single result */ 1636dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic boolean 16372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumilleris_scalar_op(unsigned op) 1638dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 16392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 1640e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_COS: 16412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DP2: 1642dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP3: 1643dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP4: 1644dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DPH: 16452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_EX2: 16462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LG2: 1647dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_POW: 1648dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RCP: 1649dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RSQ: 1650e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_SIN: 16512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* 16522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 16532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 1654dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_SCS: 16552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 16562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return TRUE; 16572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 16582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return FALSE; 16592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 16602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 16612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 16622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components depend 16632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * on source s, component c (reverse of nv50_tgsi_src_mask). 16642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 16652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 16662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_tgsi_dst_revdep(unsigned op, int s, int c) 16672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 16682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (is_scalar_op(op)) 16692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x1; 16702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 16712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 16722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DST: 16732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c) & (s ? 0xa : 0x6); 16742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_XPD: 16752da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (c) { 16762da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 0: return 0x6; 16772da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 1: return 0x5; 16782da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 2: return 0x3; 16792da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 3: return 0x0; 16802da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 16812da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 16822da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 16832da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 16842da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 16852da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_SCS: 1686dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TEX: 1687dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TXP: 16882da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* these take care of dangerous swizzles themselves */ 16892da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 16902da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_IF: 16912da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 16922da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* don't call this function for these ops */ 16932da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 16942da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0; 1695dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller default: 16962da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* linear vector instruction */ 16972da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c); 1698dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller } 1699dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 1700dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1701e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic INLINE boolean 1702e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerhas_pred(struct nv50_program_exec *e, unsigned cc) 1703e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1704e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (!is_long(e) || is_immd(e)) 1705e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1706e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return ((e->inst[1] & 0x780) == (cc << 7)); 1707e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1708e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1709e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* on ENDIF see if we can do "@p0.neu single_op" instead of: 1710e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * join_at ENDIF 1711e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * @p0.eq bra ENDIF 1712e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * single_op 1713e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * ENDIF: nop.join 1714e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1715e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic boolean 1716e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillernv50_kill_branch(struct nv50_pc *pc) 1717e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1718e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int lvl = pc->if_lvl; 1719e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1720e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->if_insn[lvl]->next != pc->p->exec_tail) 1721e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1722e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1723e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* if ccode == 'true', the BRA is from an ELSE and the predicate 1724e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * reg may no longer be valid, since we currently always use $p0 1725e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1726e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (has_pred(pc->if_insn[lvl], 0xf)) 1727e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1728e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->if_insn[lvl] && pc->br_join[lvl]); 1729e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1730e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* We'll use the exec allocated for JOIN_AT (as we can't easily 1731e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * update prev's next); if exec_tail is BRK, update the pointer. 1732e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1733e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->loop_lvl && pc->br_loop[pc->loop_lvl - 1] == pc->p->exec_tail) 1734e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->br_join[lvl]; 1735e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1736e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_size -= 4; /* remove JOIN_AT and BRA */ 1737e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1738e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller *pc->br_join[lvl] = *pc->p->exec_tail; 1739e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1740e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->if_insn[lvl]); 1741e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->p->exec_tail); 1742e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1743e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail = pc->br_join[lvl]; 1744e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->next = NULL; 1745e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller set_pred(pc, 0xd, 0, pc->p->exec_tail); 1746e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1747e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return TRUE; 1748e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1749e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 17502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic boolean 1751234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_program_tx_insn(struct nv50_pc *pc, 1752234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_instruction *inst) 1753f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 175481de711fc864247419221d700bd045addf22cb52Christoph Bumiller struct nv50_reg *rdst[4], *dst[4], *brdc, *src[3][4], *temp; 1755cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unsigned mask, sat, unit; 1756f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i, c; 1757f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1758f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs mask = inst->FullDstRegisters[0].DstRegister.WriteMask; 1759688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs sat = inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE; 1760f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1761234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller memset(src, 0, sizeof(src)); 1762234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 1763f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) { 1764234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((mask & (1 << c)) && !pc->r_dst[c]) 1765f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs dst[c] = tgsi_dst(pc, c, &inst->FullDstRegisters[0]); 1766f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs else 1767234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller dst[c] = pc->r_dst[c]; 1768234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdst[c] = dst[c]; 1769f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1770f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1771f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 17725069bfed29bcee2c89c36c74c6d65d388eb7792eZack Rusin const struct tgsi_full_src_register *fs = &inst->FullSrcRegisters[i]; 17735d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned src_mask; 17745d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller boolean neg_supp; 17755d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 17765d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src_mask = nv50_tgsi_src_mask(inst, i); 17775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller neg_supp = negate_supported(inst, i); 1778cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1779cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs if (fs->SrcRegister.File == TGSI_FILE_SAMPLER) 1780cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unit = fs->SrcRegister.Index; 1781cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1782f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) 17835d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (src_mask & (1 << c)) 17845d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src[i][c] = tgsi_src(pc, c, fs, neg_supp); 1785f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1786f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 178781de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp = pc->r_brdc; 178881de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc && brdc->type != P_TEMP) { 178981de711fc864247419221d700bd045addf22cb52Christoph Bumiller temp = temp_temp(pc); 179081de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 179181de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp; 179281de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 1793688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 1794688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 1795234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << c)) || dst[c]->type == P_TEMP) 1796234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 1797688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs rdst[c] = dst[c]; 1798688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs dst[c] = temp_temp(pc); 1799688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1800688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1801688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 180281de711fc864247419221d700bd045addf22cb52Christoph Bumiller assert(brdc || !is_scalar_op(inst->Instruction.Opcode)); 180381de711fc864247419221d700bd045addf22cb52Christoph Bumiller 1804f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (inst->Instruction.Opcode) { 180568091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs case TGSI_OPCODE_ABS: 180668091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs for (c = 0; c < 4; c++) { 1807fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs if (!(mask & (1 << c))) 1808fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs continue; 1809fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, dst[c], src[0][c]); 181068091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs } 181168091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs break; 18122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_ADD: 18137df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18147df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18157df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 18162a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_add(pc, dst[c], src[0][c], src[1][c]); 18177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 18182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1819ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_OPCODE_ARL: 1820ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(src[0][0]); 1821ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller temp = temp_temp(pc); 1822ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_cvt(pc, temp, src[0][0], -1, CVTOP_FLOOR, CVT_S32_F32); 1823ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller emit_arl(pc, dst[0], temp, 4); 1824ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller break; 1825e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 1826e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->loop_pos[pc->loop_lvl++] = pc->p->exec_size; 1827ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 1828e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1829e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BRK: 1830e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 1831e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->loop_lvl > 0); 1832e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->p->exec_tail; 1833e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1834849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_CEIL: 1835849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 1836849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 1837849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 1838849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 1839ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_CEIL, CVT_F32_F32 | CVT_RI); 1840849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 1841849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 18422eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller case TGSI_OPCODE_CMP: 18432eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller pc->allow32 = FALSE; 18442eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller for (c = 0; c < 4; c++) { 18452eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!(mask & (1 << c))) 18462eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller continue; 18472eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_cvt(pc, NULL, src[0][c], 1, CVTOP_RN, CVT_F32_F32); 18482eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[1][c]); 18492eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x1, 1, pc->p->exec_tail); /* @SF */ 18502eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[2][c]); 18512eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x6, 1, pc->p->exec_tail); /* @NSF */ 18522eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller } 18532eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller break; 18542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_COS: 1855e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 1856e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 1857e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, dst[3], temp); 1858e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 1859e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 1860e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 1861e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 18627df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 1863e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 1864e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, brdc, temp); 18652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 18661635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDX: 18671635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 18681635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 18691635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 18701635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddx(pc, dst[c], src[0][c]); 18711635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 18721635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 18731635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 18741635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 18751635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 18761635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 18771635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddy(pc, dst[c], src[0][c]); 18781635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 18791635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 18802a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP3: 18812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 18822a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 188381de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][2], src[1][2], temp); 18842a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 18852a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP4: 18862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 18872a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 18882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 188981de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][3], src[1][3], temp); 18902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 189121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_DPH: 189221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 189321e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 189421e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 189581de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_add(pc, brdc, src[1][3], temp); 189621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 189733e4d30d50344be26398a51365bea1be37487403Ben Skeggs case TGSI_OPCODE_DST: 18989a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) 18999a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, dst[1], src[0][1], src[1][1]); 19009a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) 19019a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[2], src[0][2]); 19029a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 3)) 19039a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[3], src[1][3]); 190481de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & (1 << 0)) 190581de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov_immdval(pc, dst[0], 1.0f); 190633e4d30d50344be26398a51365bea1be37487403Ben Skeggs break; 19071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ELSE: 19081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, -1, 0, NULL); 19091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 19101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 1911ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 19121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 19131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ENDIF: 19141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 19151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 1916e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* try to replace branch over 1 insn with a predicated insn */ 1917e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (nv50_kill_branch(pc) == TRUE) 1918e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1919e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 19201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->br_join[pc->if_lvl]) { 19211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl]->param.index = pc->p->exec_size; 19221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl] = NULL; 19231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 1924ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 19251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emit a NOP as join point, we could set it on the next 19261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * one, but would have to make sure it is long and !immd 19271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 19281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_nop(pc); 19291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 2; 19301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 1931e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 1932e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 1933e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->param.index = pc->loop_pos[--pc->loop_lvl]; 1934e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl]->param.index = pc->p->exec_size; 1935ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 1936e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 19372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_EX2: 19387b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_preex2(pc, temp, src[0][0]); 193981de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 6, brdc, temp); 19402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1941b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FLR: 1942b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 1943b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 1944b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 1945b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, dst[c], src[0][c]); 1946b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 1947b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 1948b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FRC: 19499417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 1950b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 1951b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 1952b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 1953b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, temp, src[0][c]); 1954b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_sub(pc, dst[c], src[0][c], temp); 1955b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 1956b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 19571196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_IF: 19581196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emitting a join_at may not be necessary */ 19591196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(pc->if_lvl < MAX_IF_DEPTH); 19601196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_pred_wr(pc, 1, 0, pc->if_cond); 19611196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, 0, 2, &pc->br_join[pc->if_lvl]); 19621196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 1963ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller terminate_mbb(pc); 19641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 1965d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs case TGSI_OPCODE_KIL: 1966d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][0]); 1967d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][1]); 1968d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][2]); 1969d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][3]); 1970d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs break; 197101e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs case TGSI_OPCODE_LIT: 19727b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_lit(pc, &dst[0], mask, &src[0][0]); 197301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs break; 19742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_LG2: 197581de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 3, brdc, src[0][0]); 19762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 197721e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs case TGSI_OPCODE_LRP: 1978229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller temp = temp_temp(pc); 197921e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs for (c = 0; c < 4; c++) { 198021e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (!(mask & (1 << c))) 198121e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs continue; 1982229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_sub(pc, temp, src[1][c], src[2][c]); 1983229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_mad(pc, dst[c], temp, src[0][c], src[2][c]); 198421e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs } 198521e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs break; 19862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MAD: 19877df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 19887df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 19897df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 19902a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, dst[c], src[0][c], src[1][c], src[2][c]); 19917df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 19922a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 199352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MAX: 19947df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 19957df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 19967df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 199752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 4, dst[c], src[0][c], src[1][c]); 19987df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 199952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 200052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MIN: 20017df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 20027df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 20037df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 200452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 5, dst[c], src[0][c], src[1][c]); 20057df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 200652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 2007f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_MOV: 2008a82cd55a5cb1ad617960551560b107edffad1e9aBen Skeggs case TGSI_OPCODE_SWZ: 20097df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 20107df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 20117df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 201255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs emit_mov(pc, dst[c], src[0][c]); 20137df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 201438ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs break; 20152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MUL: 20167df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 20177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 20187df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 20192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, dst[c], src[0][c], src[1][c]); 20207df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 20212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2022ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs case TGSI_OPCODE_POW: 202381de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_pow(pc, brdc, src[0][0], src[1][0]); 2024ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs break; 20252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RCP: 202681de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 0, brdc, src[0][0]); 20272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 20282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RSQ: 202981de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 2, brdc, src[0][0]); 20302a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 20317b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs case TGSI_OPCODE_SCS: 20329417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 203381de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & 3) 203481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_precossin(pc, temp, src[0][0]); 20357b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 0)) 20367b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 5, dst[0], temp); 20377b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 1)) 20387b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 4, dst[1], temp); 20394a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 2)) 20404a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[2], 0.0); 20414a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 20424a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 20437b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs break; 20442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SIN: 2045e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 2046e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 2047e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, dst[3], temp); 2048e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 2049e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 2050e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 2051e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 20527df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 2053e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 2054e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, brdc, temp); 20552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2056bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs case TGSI_OPCODE_SLT: 20572b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: 20582b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: 20592b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: 20602b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: 20612b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: 20622b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller i = map_tgsi_setop_cc(inst->Instruction.Opcode); 2063bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs for (c = 0; c < 4; c++) { 2064bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (!(mask & (1 << c))) 2065bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs continue; 20662b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_set(pc, i, dst[c], -1, src[0][c], src[1][c]); 2067bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs } 2068bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs break; 20692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SUB: 20707df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 20717df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 20727df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 20732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_sub(pc, dst[c], src[0][c], src[1][c]); 20747df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 20752a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 2076c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_OPCODE_TEX: 20773accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 20783accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller inst->InstructionExtTexture.Texture, FALSE); 20793accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 20805696267efd6f85d79f5fe511d1a066a17c4d1cccBen Skeggs case TGSI_OPCODE_TXP: 20813accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 20823accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller inst->InstructionExtTexture.Texture, TRUE); 2083c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2084849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_TRUNC: 2085849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 2086849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 2087849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 2088849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 2089ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_TRUNC, CVT_F32_F32 | CVT_RI); 2090849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 2091849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 209221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_XPD: 20939417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 20949a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 0)) { 20959a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][2], src[1][1]); 20969a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[0], src[0][1], src[1][2], temp); 20979a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 20989a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) { 20999a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][2]); 21009a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[1], src[0][2], src[1][0], temp); 21019a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 21029a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) { 21039a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][1], src[1][0]); 21049a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[2], src[0][0], src[1][1], temp); 21059a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 21064a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 21074a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 210821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 2109f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_END: 2110f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2111f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2112f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("invalid opcode %d\n", inst->Instruction.Opcode); 2113f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 2114f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2115f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 211681de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc) { 211781de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 211881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_sat(pc, brdc, brdc); 211981de711fc864247419221d700bd045addf22cb52Christoph Bumiller for (c = 0; c < 4; c++) 212081de711fc864247419221d700bd045addf22cb52Christoph Bumiller if ((mask & (1 << c)) && dst[c] != brdc) 212181de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov(pc, dst[c], brdc); 212281de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 2123688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 2124688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 2125688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (!(mask & (1 << c))) 2126688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs continue; 2127234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* in this case we saturate later */ 2128234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (dst[c]->type == P_TEMP && dst[c]->index < 0) 2129234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2130234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, rdst[c], dst[c]); 2131688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2132688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 2133688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 21349417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 21359417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (c = 0; c < 4; c++) { 21369417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (!src[i][c]) 21379417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller continue; 2138f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller src[i][c]->neg = 0; 21399417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (src[i][c]->index == -1 && src[i][c]->type == P_IMMD) 21409417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(src[i][c]); 2141ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller else 2142ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (src[i][c]->acc < 0 && src[i][c]->type == P_CONST) 2143ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller FREE(src[i][c]); /* indirect constant */ 21449417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 21459417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 21469417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 214752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs kill_temp_temp(pc); 2148f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return TRUE; 2149f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2150f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2151bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumillerstatic void 215238849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerprep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn) 2153bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller{ 215438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller struct nv50_reg *reg = NULL; 2155bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_full_src_register *src; 2156bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_dst_register *dst; 215738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned i, c, k, mask; 2158bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2159bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller dst = &insn->FullDstRegisters[0].DstRegister; 2160bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller mask = dst->WriteMask; 2161bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 216238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_TEMPORARY) 216338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 216438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 216538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_OUTPUT) 216638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->result; 2167bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 216838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (reg) { 2169bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2170bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2171bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 217238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[dst->Index * 4 + c].acc = pc->insn_nr; 2173bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2174bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2175bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2176bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2177bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller src = &insn->FullSrcRegisters[i]; 2178bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 217938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) 218038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 218138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 218238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_INPUT) 218338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->attr; 218438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 2185bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2186bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 21875d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = nv50_tgsi_src_mask(insn, i); 2188bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2189bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2190bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2191bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2192bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller k = tgsi_util_get_full_src_register_extswizzle(src, c); 219338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 219438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (k > TGSI_EXTSWIZZLE_W) 219538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller continue; 219638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 219738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[src->SrcRegister.Index * 4 + k].acc = pc->insn_nr; 2198bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2199bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2200bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller} 2201bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 22022da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components need to be 22032da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * written to temporaries first to avoid 'corrupting' sources. 22042da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 22052da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * m[i] (out) indicate component to write in the i-th position 22062da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * rdep[c] (in) bitmasks of dst[i] that require dst[c] as source 22072da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 22082da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 22092da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_revdep_reorder(unsigned m[4], unsigned rdep[4]) 22102da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 22112da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsigned i, c, x, unsafe; 22122da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22132da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 4; c++) 22142da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = c; 22152da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22162da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* Swap as long as a dst component written earlier is depended on 22172da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * by one written later, but the next one isn't depended on by it. 22182da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 22192da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 3; c++) { 22202da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c + 1]] & (1 << m[c])) 22212da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; /* if next one is depended on by us */ 22222da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = c + 1; i < 4; i++) 22232da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* if we are depended on by a later one */ 22242da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c]] & (1 << m[i])) 22252da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller break; 22262da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (i == 4) 22272da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; 22282da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* now, swap */ 22292da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller x = m[c]; 22302da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = m[c + 1]; 22312da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c + 1] = x; 22322da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22332da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* restart */ 22342da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller c = 0; 22352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 22362da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* mark dependencies that could not be resolved by reordering */ 22382da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = 0; i < 3; ++i) 22392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = i + 1; c < 4; ++c) 22402da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[i]] & (1 << m[c])) 22412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsafe |= (1 << i); 22422da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22432da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* NOTE: $unsafe is with respect to order, not component */ 22442da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return unsafe; 22452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 22462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22472da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Select a suitable dst register for broadcasting scalar results, 22482da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * or return NULL if we have to allocate an extra TEMP. 22492da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 22502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * If e.g. only 1 component is written, we may also emit the final 22512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * result to a write-only register. 22522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 22532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic struct nv50_reg * 22542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillertgsi_broadcast_dst(struct nv50_pc *pc, 22552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller const struct tgsi_full_dst_register *fd, unsigned mask) 22562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 22572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (fd->DstRegister.File == TGSI_FILE_TEMPORARY) { 22582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(~mask & fd->DstRegister.WriteMask); 22592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (c) 22602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c - 1, fd); 22612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } else { 22622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(fd->DstRegister.WriteMask) - 1; 22632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if ((1 << c) == fd->DstRegister.WriteMask) 22642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c, fd); 22652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 22662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 22672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return NULL; 22682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 22692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 2270234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller/* Scan source swizzles and return a bitmask indicating dst regs that 2271234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller * also occur among the src regs, and fill rdep for nv50_revdep_reoder. 2272234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller */ 2273234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic unsigned 2274234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_scan_swizzle(const struct tgsi_full_instruction *insn, 2275234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned rdep[4]) 2276234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2277234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd = &insn->FullDstRegisters[0]; 2278234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_src_register *fs; 2279234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs = 0; 2280234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2281234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) 2282234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[i] = 0; 2283234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2284234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2285234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned chn, mask = nv50_tgsi_src_mask(insn, i); 2286234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller boolean neg_supp = negate_supported(insn, i); 2287234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2288234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fs = &insn->FullSrcRegisters[i]; 2289234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (fs->SrcRegister.File != fd->DstRegister.File || 2290234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fs->SrcRegister.Index != fd->DstRegister.Index) 2291234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2292234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2293234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (chn = 0; chn < 4; ++chn) { 2294234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned s, c; 2295234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2296234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << chn))) /* src is not read */ 2297234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2298234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller c = tgsi_util_get_full_src_register_extswizzle(fs, chn); 2299234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller s = tgsi_util_get_full_src_register_sign_mode(fs, chn); 2300234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2301234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (c > TGSI_EXTSWIZZLE_W || 2302234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller !(fd->DstRegister.WriteMask & (1 << c))) 2303234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2304234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2305234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* no danger if src is copied to TEMP first */ 2306234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((s != TGSI_UTIL_SIGN_KEEP) && 2307234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller (s != TGSI_UTIL_SIGN_TOGGLE || !neg_supp)) 2308234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2309234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2310234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[c] |= nv50_tgsi_dst_revdep( 2311234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn->Instruction.Opcode, i, chn); 2312234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs |= (1 << c); 2313234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2314234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2315234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2316234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return deqs; 2317234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2318234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2319234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic boolean 2320234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_insn(struct nv50_pc *pc, const union tgsi_full_token *tok) 2321234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2322234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct tgsi_full_instruction insn = tok->FullInstruction; 2323234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd; 2324234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs, rdep[4], m[4]; 2325234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2326234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fd = &tok->FullInstruction.FullDstRegisters[0]; 2327234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_tgsi_scan_swizzle(&insn, rdep); 2328234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2329234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (is_scalar_op(insn.Instruction.Opcode)) { 2330234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = tgsi_broadcast_dst(pc, fd, deqs); 2331234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!pc->r_brdc) 2332234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = temp_temp(pc); 2333234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2334234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2335234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = NULL; 2336234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2337234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!deqs) 2338234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2339234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2340234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_revdep_reorder(m, rdep); 2341234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2342234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) { 2343234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller assert(pc->r_dst[m[i]] == NULL); 2344234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2345234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn.FullDstRegisters[0].DstRegister.WriteMask = 2346234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fd->DstRegister.WriteMask & (1 << m[i]); 2347234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2348234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!insn.FullDstRegisters[0].DstRegister.WriteMask) 2349234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2350234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2351234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (deqs & (1 << i)) 2352234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[m[i]] = alloc_temp(pc, NULL); 2353234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2354234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!nv50_program_tx_insn(pc, &insn)) 2355234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return FALSE; 2356234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2357234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2358234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; i++) { 2359234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *reg = pc->r_dst[i]; 2360234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!reg) 2361234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2362234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[i] = NULL; 2363234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2364234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (insn.Instruction.Saturate == TGSI_SAT_ZERO_ONE) 2365234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, tgsi_dst(pc, i, fd), reg); 2366234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller else 2367234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_mov(pc, tgsi_dst(pc, i, fd), reg); 2368234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller free_temp(pc, reg); 2369234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2370234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2371234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return TRUE; 2372234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2373234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 23746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic void 23756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerload_interpolant(struct nv50_pc *pc, struct nv50_reg *reg) 2376dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller{ 23776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_reg *iv, **ppiv; 23786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned mode = pc->interp_mode[reg->index]; 2379dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 23806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ppiv = (mode & INTERP_CENTROID) ? &pc->iv_c : &pc->iv_p; 23816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv; 2382dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 23836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if ((mode & INTERP_PERSPECTIVE) && !iv) { 23846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv = alloc_temp(pc, NULL); 23856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv->rhw = popcnt4(pc->p->cfg.regs[1] >> 24) - 1; 2386dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 23876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, iv, NULL, mode & INTERP_CENTROID); 23886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_flop(pc, 0, iv, iv); 2389dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 23906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* XXX: when loading interpolants dynamically, move these 23916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * to the program head, or make sure it can't be skipped. 23926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 2393dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2394dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 23956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, reg, iv, mode); 2396dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller} 2397dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 2398f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 2399f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx_prep(struct nv50_pc *pc) 2400f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 24016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct tgsi_parse_context tp; 24026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *p = pc->p; 2403f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret = FALSE; 24046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned i, c, flat_nr = 0; 2405dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_init(&tp, pc->p->pipe.tokens); 24076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller while (!tgsi_parse_end_of_tokens(&tp)) { 24086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller const union tgsi_full_token *tok = &tp.FullToken; 2409f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 24106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_token(&tp); 2411f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2412f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_IMMEDIATE: 2413f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2414f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_immediate *imm = 24156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller &tp.FullToken.FullImmediate; 2416f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2417fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell ctor_immd(pc, imm->u[0].Float, 2418fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[1].Float, 2419fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[2].Float, 2420fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[3].Float); 2421f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2422f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2423f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_DECLARATION: 2424f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2425f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_declaration *d; 24266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned si, last, first, mode; 2427f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 24286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller d = &tp.FullToken.FullDeclaration; 2429e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller first = d->DeclarationRange.First; 2430bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs last = d->DeclarationRange.Last; 2431f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2432f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (d->Declaration.File) { 2433f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_TEMPORARY: 2434f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2435f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_OUTPUT: 24366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!d->Declaration.Semantic || 24376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->type == PIPE_SHADER_FRAGMENT) 24386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 24396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller si = d->Semantic.SemanticIndex; 24416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller switch (d->Semantic.SemanticName) { 24424d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller case TGSI_SEMANTIC_BCOLOR: 24434d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[si].hw = first; 24444d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.io_nr > first) 24454d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.io_nr = first; 24464d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller break; 244706dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller case TGSI_SEMANTIC_PSIZE: 244806dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = first; 244906dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.io_nr > first) 245006dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.io_nr = first; 245106dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller break; 24526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* 24536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller case TGSI_SEMANTIC_CLIP_DISTANCE: 24546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = MIN2(p->cfg.clpd, first); 24556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 24566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 24576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller default: 24586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 24596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2460f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2461f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_INPUT: 2462e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller { 24636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type != PIPE_SHADER_FRAGMENT) 2464e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2465e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2466e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller switch (d->Declaration.Interpolate) { 2467e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 2468e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_FLAT; 24696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller flat_nr++; 2470e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2471e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_PERSPECTIVE: 2472e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_PERSPECTIVE; 24736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= 0x08 << 24; 2474e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2475e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller default: 2476e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_LINEAR; 2477e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2478e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 24796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (d->Declaration.Centroid) 2480e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode |= INTERP_CENTROID; 2481e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2482e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller assert(last < 32); 2483e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller for (i = first; i <= last; i++) 2484e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller pc->interp_mode[i] = mode; 2485e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 2486f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2487ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller case TGSI_FILE_ADDRESS: 2488f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_CONSTANT: 2489c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 2490c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2491f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2492f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("bad decl file %d\n", 2493f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs d->Declaration.File); 2494f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2495f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2496f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2497f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2498f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2499bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller pc->insn_nr++; 250038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller prep_inspect_insn(pc, &tok->FullInstruction); 2501f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2502f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2503f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2504f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2505f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2506f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 25076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_VERTEX) { 25086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid = 0; 25098ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 25106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) { 25116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->attr[i].acc) { 25126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i].hw = rid++; 25136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.attr[i / 32] |= 1 << (i % 32); 2514f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 25156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 25166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0, rid = 0; i < pc->result_nr; ++i) { 25186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].hw = rid; 25196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].id_vp = i; 25208ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 25216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 25226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int n = i * 4 + c; 25236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->result[n].acc) 25246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 25256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[n].hw = rid++; 25266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].mask |= 1 << c; 2527dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 25286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 25294d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 25304d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller for (c = 0; c < 2; ++c) 25314d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.two_side[c].hw < 0x40) 25324d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c] = p->cfg.io[ 25334d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c].hw]; 253406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 253506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.psiz < 0x40) 253606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = p->cfg.io[p->cfg.psiz].hw; 25376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 25386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_FRAGMENT) { 25396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid, aid; 25406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned n = 0, m = pc->attr_nr - flat_nr; 25416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int base = (TGSI_SEMANTIC_POSITION == 25436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->info.input_semantic_name[0]) ? 0 : 1; 25448ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 25456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* non-flat interpolants have to be mapped to 25466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * the lower hardware IDs, so sort them: 25476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 25486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 25496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->interp_mode[i] == INTERP_FLAT) { 25506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m].id_vp = i + base; 25516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m++].id_fp = i; 25526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else { 25536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!(pc->interp_mode[i] & INTERP_PERSPECTIVE)) 25546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].linear = TRUE; 25556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].id_vp = i + base; 25566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n++].id_fp = i; 2557dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 25586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2559dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 25606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) /* set w-coordinate mask from perspective interp */ 25616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[0].mask |= p->cfg.regs[1] >> 24; 25628ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 25636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid = popcnt4( /* if fcrd isn't contained in cfg.io */ 25646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller base ? (p->cfg.regs[1] >> 24) : p->cfg.io[0].mask); 2565dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 25666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (n = 0; n < pc->attr_nr; ++n) { 25676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].hw = rid = aid; 25686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[n].id_fp; 25696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 25716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->attr[i * 4 + c].acc) 25726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 25736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i * 4 + c].rhw = rid++; 25746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].mask |= 1 << c; 25756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller load_interpolant(pc, &pc->attr[i * 4 + c]); 2577dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 25786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid += popcnt4(p->cfg.io[n].mask); 2579dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2580f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 25816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) 25826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.io[0].mask << 24; 25836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = popcnt4(p->cfg.regs[1] >> 24); 25856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* set count of non-position inputs and of non-flat 25876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * non-position inputs for FP_INTERPOLANT_CTRL 25886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 25896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= aid - m; 25906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (flat_nr) { 25926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[pc->attr_nr - flat_nr].hw; 25936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= (i - m) << 16; 25946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 25956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.regs[1] << 16; 25966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 25976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* mark color semantic for light-twoside */ 25986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = 0x40; 25996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 26006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si, sn; 2601f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 26026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller sn = p->info.input_semantic_name[p->cfg.io[i].id_fp]; 26036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller si = p->info.input_semantic_index[p->cfg.io[i].id_fp]; 26046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (sn == TGSI_SEMANTIC_COLOR) { 26066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si] = p->cfg.io[i]; 26076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* increase colour count */ 26096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += popcnt4( 26106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si].mask) << 16; 26116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = MIN2(n, p->cfg.io[i].hw - m); 26136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2614f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 26156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n < 0x40) 26166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += n; 26176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* Initialize FP results: 26196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * FragDepth is always first TGSI and last hw output 26206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 26216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->info.writes_z ? 4 : 0; 26226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (rid = 0; i < pc->result_nr * 4; i++) 26236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[i].rhw = rid++; 26246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->info.writes_z) 26256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[2].rhw = rid; 26261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller p->cfg.high_result = rid; 2628f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2629f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2630f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (pc->immd_nr) { 263194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller int rid = 0; 2632f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2633e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller pc->immd = MALLOC(pc->immd_nr * 4 * sizeof(struct nv50_reg)); 2634f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->immd) 2635f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2636f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2637f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < pc->immd_nr; i++) { 2638e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller for (c = 0; c < 4; c++, rid++) 2639e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(&pc->immd[rid], P_IMMD, i, rid); 2640f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2641f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2642f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2643f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = TRUE; 2644f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 26456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_p) 26466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_p); 26476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_c) 26486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_c); 26496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 26506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_free(&tp); 2651f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2652f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2653f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 26549417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerstatic void 26559417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerfree_nv50_pc(struct nv50_pc *pc) 26569417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller{ 26579417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->immd) 26589417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->immd); 26599417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->param) 26609417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->param); 26619417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->result) 26629417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->result); 26639417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->attr) 26649417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->attr); 26659417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->temp) 26669417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->temp); 26679417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 26689417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc); 26699417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller} 26709417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 2671f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 267238849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerctor_nv50_pc(struct nv50_pc *pc, struct nv50_program *p) 267338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller{ 267438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int i, c; 267538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned rtype[2] = { P_ATTR, P_RESULT }; 267638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 267738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->p = p; 267838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp_nr = p->info.file_max[TGSI_FILE_TEMPORARY] + 1; 267938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr_nr = p->info.file_max[TGSI_FILE_INPUT] + 1; 268038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result_nr = p->info.file_max[TGSI_FILE_OUTPUT] + 1; 268138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param_nr = p->info.file_max[TGSI_FILE_CONSTANT] + 1; 2682ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr_nr = p->info.file_max[TGSI_FILE_ADDRESS] + 1; 2683ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(pc->addr_nr <= 2); 268438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 268538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller p->cfg.high_temp = 4; 268638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 26876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[0].hw = 0x40; 26886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[1].hw = 0x40; 26896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 269038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller switch (p->type) { 269138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_VERTEX: 269206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = 0x40; 26936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = 0x40; 26946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->result_nr; 269538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 269638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_FRAGMENT: 269738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller rtype[0] = rtype[1] = P_TEMP; 269838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 26996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] = 0x01000004; 27006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->attr_nr; 27016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 270238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.writes_z) { 27036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00000100; 27046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[3] |= 0x00000011; 270538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 270638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.uses_kill) 27076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00100000; 270838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 270938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 271038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 271138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->temp_nr) { 271238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp = MALLOC(pc->temp_nr * 4 * sizeof(struct nv50_reg)); 271338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->temp) 271438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 271538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 271638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->temp_nr * 4; ++i) 271738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->temp[i], P_TEMP, i / 4, -1); 271838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 271938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 272038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->attr_nr) { 272138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr = MALLOC(pc->attr_nr * 4 * sizeof(struct nv50_reg)); 272238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->attr) 272338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 272438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 272538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) 272638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->attr[i], rtype[0], i / 4, -1); 272738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 272838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 272938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->result_nr) { 273038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned nr = pc->result_nr * 4; 273138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 273238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result = MALLOC(nr * sizeof(struct nv50_reg)); 273338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->result) 273438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 273538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 273638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < nr; ++i) 273738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->result[i], rtype[1], i / 4, -1); 273838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 273938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 274038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->param_nr) { 274138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int rid = 0; 274238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 274338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param = MALLOC(pc->param_nr * 4 * sizeof(struct nv50_reg)); 274438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->param) 274538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 274638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 274738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->param_nr; ++i) 274838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (c = 0; c < 4; ++c, ++rid) 274938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->param[rid], P_CONST, i, rid); 275038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 275138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 2752ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (pc->addr_nr) { 2753ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller pc->addr = CALLOC(pc->addr_nr * 4, sizeof(struct nv50_reg *)); 2754ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller if (!pc->addr) 2755ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller return FALSE; 2756ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller } 2757ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller for (i = 0; i < NV50_SU_MAX_ADDR; ++i) 2758ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller ctor_reg(&pc->r_addr[i], P_ADDR, -1, i + 1); 2759ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller 276038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return TRUE; 276138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller} 276238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 27631196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 27641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_fp_move_results(struct nv50_pc *pc) 27651196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 27661196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_reg reg; 27671196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i; 27681196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27691196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ctor_reg(®, P_TEMP, -1, -1); 27701196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27711196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < pc->result_nr * 4; ++i) { 27721196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw < 0 || pc->result[i].hw < 0) 27731196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 27741196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw != pc->result[i].hw) { 27751196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller reg.hw = pc->result[i].rhw; 27761196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_mov(pc, ®, &pc->result[i]); 27771196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 27781196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 27791196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 27801196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27811196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 27821196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_program_fixup_insns(struct nv50_pc *pc) 27831196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 27841196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e, *prev = NULL, **bra_list; 27851196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i, n, pos; 27861196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27871196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list = CALLOC(pc->p->exec_size, sizeof(struct nv50_program_exec *)); 27881196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27891196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Collect branch instructions, we need to adjust their offsets 27901196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * when converting 32 bit instructions to 64 bit ones 27911196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 27921196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (n = 0, e = pc->p->exec_head; e; e = e->next) 27931196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.index >= 0 && !e->param.mask) 27941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[n++] = e; 27951196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 27961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Make sure we don't have any single 32 bit instructions. */ 27971196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (e = pc->p->exec_head, pos = 0; e; e = e->next) { 27981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pos += is_long(e) ? 2 : 1; 27991196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28001196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if ((pos & 1) && (!e->next || is_long(e->next))) { 28011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < n; ++i) 28021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (bra_list[i]->param.index >= pos) 28031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[i]->param.index += 1; 28041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, e); 28051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ++pos; 28061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 28071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->next) 28081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller prev = e; 28091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 28101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_head)); 28121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_tail)); 28131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* last instruction must be long so it can have the end bit set */ 28151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (!is_long(pc->p->exec_tail)) { 28161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, pc->p->exec_tail); 28171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (prev) 28181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, prev); 28191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 28201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(pc->p->exec_tail->inst[1] & 2)); 28211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* set the end-bit */ 28221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 1; 28231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28241196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller FREE(bra_list); 28251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 28261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 282738849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerstatic boolean 2828f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx(struct nv50_program *p) 2829f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2830f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct tgsi_parse_context parse; 2831f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_pc *pc; 2832f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret; 2833f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2834f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc = CALLOC_STRUCT(nv50_pc); 2835f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc) 2836f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 283738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 283838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ret = ctor_nv50_pc(pc, p); 283938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (ret == FALSE) 284038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller goto out_cleanup; 2841f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2842f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = nv50_program_tx_prep(pc); 2843f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2844f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_cleanup; 2845f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2846f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_init(&parse, pc->p->pipe.tokens); 2847f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs while (!tgsi_parse_end_of_tokens(&parse)) { 2848f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const union tgsi_full_token *tok = &parse.FullToken; 2849f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2850d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller /* don't allow half insn/immd on first and last instruction */ 2851d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = TRUE; 2852d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (pc->insn_cur == 0 || pc->insn_cur + 2 == pc->insn_nr) 2853d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = FALSE; 2854d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 2855f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_token(&parse); 2856f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2857f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2858f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2859bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller ++pc->insn_cur; 2860234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller ret = nv50_tgsi_insn(pc, tok); 2861f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2862f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2863f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2864f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2865f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2866f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2867f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2868f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 28691196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->p->type == PIPE_SHADER_FRAGMENT) 28701196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_fp_move_results(pc); 287144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 28721196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_program_fixup_insns(pc); 287340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 2874aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs p->param_nr = pc->param_nr * 4; 2875f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd_nr = pc->immd_nr * 4; 2876f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd = pc->immd_buf; 2877f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2878f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 2879f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_free(&parse); 2880f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2881f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_cleanup: 28829417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller free_nv50_pc(pc); 2883f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2884f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2885f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2886f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 2887f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_validate(struct nv50_context *nv50, struct nv50_program *p) 2888f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2889e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs if (nv50_program_tx(p) == FALSE) 2890e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs assert(0); 2891f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = TRUE; 2892f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2893f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 289422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 2895ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsnv50_program_upload_data(struct nv50_context *nv50, float *map, 289694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller unsigned start, unsigned count, unsigned cbuf) 2897ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs{ 289880e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 289975f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 290075f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs 2901ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs while (count) { 2902ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs unsigned nr = count > 2047 ? 2047 : count; 2903ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 290493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 290594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller OUT_RING (chan, (cbuf << 0) | (start << 8)); 290693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 290775f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, map, nr); 2908ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2909ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs map += nr; 2910ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs start += nr; 2911ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs count -= nr; 2912ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs } 2913ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs} 2914ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2915ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsstatic void 291622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) 291722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 29186b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs struct pipe_screen *pscreen = nv50->pipe.screen; 291922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 292094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller if (!p->data[0] && p->immd_nr) { 292194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nouveau_resource *heap = nv50->screen->immd_heap[0]; 292294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 29231b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) { 292494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller while (heap->next && heap->size < p->immd_nr) { 292594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nv50_program *evict = heap->next->priv; 29261b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&evict->data[0]); 292794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 292894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 29291b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, 29301b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs &p->data[0])) 293194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller assert(0); 293294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 293394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 293494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller /* immediates only need to be uploaded again when freed */ 293594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller nv50_program_upload_data(nv50, p->immd, p->data[0]->start, 293694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller p->immd_nr, NV50_CB_PMISC); 293794ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 2938aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 2939ec5c23551cdb4c369d8f8f392208f4d4bf29911bChristoph Bumiller assert(p->param_nr <= 512); 2940aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 2941aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs if (p->param_nr) { 2942750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned cb; 29436b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type], 29446b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs PIPE_BUFFER_USAGE_CPU_READ); 2945750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 2946750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->type == PIPE_SHADER_VERTEX) 2947750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PVP; 2948750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller else 2949750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PFP; 2950750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 2951750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller nv50_program_upload_data(nv50, map, 0, p->param_nr, cb); 29526b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]); 2953aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 295422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 295522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 295622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 295722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) 295822e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 295980e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 296075f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 296140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e; 2962cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs struct nouveau_stateobj *so; 2963cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs const unsigned flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR; 2964cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs unsigned start, count, *up, *ptr; 2965f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs boolean upload = FALSE; 296622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 2967072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs if (!p->bo) { 2968072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_new(chan->device, NOUVEAU_BO_VRAM, 0x100, 2969072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs p->exec_size * 4, &p->bo); 2970f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs upload = TRUE; 2971f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs } 297240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 2973750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0] && p->data[0]->start != p->data_start[0]) 2974750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller upload = TRUE; 2975ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2976750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (!upload) 2977750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller return; 2978ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2979750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller for (e = p->exec_head; e; e = e->next) { 2980750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned ei, ci, bs; 29811c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 2982750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (e->param.index < 0) 2983750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller continue; 29841196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29851196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.mask == 0) { 29861196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(e->param.index & 1)); 29871196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* seem to be 8 byte steps */ 29881196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ei = (e->param.index >> 1) + 0 /* START_ID */; 29891196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 29901196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] &= 0xf0000fff; 29911196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= ei << 12; 29921196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 29931196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 29941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 2995750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller bs = (e->inst[1] >> 22) & 0x07; 2996750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller assert(bs < 2); 2997750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ei = e->param.shift >> 5; 2998750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ci = e->param.index; 2999750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (bs == 0) 3000750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ci += p->data[bs]->start; 300194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 3002750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller e->inst[ei] &= ~e->param.mask; 3003750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller e->inst[ei] |= (ci << e->param.shift); 3004aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 3005aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 3006750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0]) 3007750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller p->data_start[0] = p->data[0]->start; 3008f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs 3009b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#ifdef NV50_PROGRAM_DUMP 30100d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("-------\n"); 3011aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs for (e = p->exec_head; e; e = e->next) { 30120d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[0]); 30130d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs if (is_long(e)) 30140d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[1]); 3015b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs } 3016b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#endif 30170d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs 3018b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs up = ptr = MALLOC(p->exec_size * 4); 3019b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs for (e = p->exec_head; e; e = e->next) { 3020cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs *(ptr++) = e->inst[0]; 3021cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs if (is_long(e)) 3022cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs *(ptr++) = e->inst[1]; 3023cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs } 3024cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3025e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(4,2); 302693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, nv50->screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3); 3027072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_HIGH, 0, 0); 3028072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_LOW, 0, 0); 3029cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs so_data (so, (NV50_CB_PUPLOAD << 16) | 0x0800); //(p->exec_size * 4)); 3030cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3031cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs start = 0; count = p->exec_size; 3032cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs while (count) { 303380e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 3034cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs unsigned nr; 3035cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 303680e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs so_emit(chan, so); 3037cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3038cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs nr = MIN2(count, 2047); 303980e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs nr = MIN2(chan->pushbuf->remaining, nr); 304080e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs if (chan->pushbuf->remaining < (nr + 3)) { 304175f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs FIRE_RING(chan); 3042cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs continue; 3043aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 3044cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 304593ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 304675f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RING (chan, (start << 8) | NV50_CB_PUPLOAD); 304793ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 304875f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, up + start, nr); 3049cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3050cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs start += nr; 3051cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs count -= nr; 305240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs } 3053cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 3054cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs FREE(up); 3055cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs so_ref(NULL, &so); 305622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 305722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 3058f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3059f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_vertprog_validate(struct nv50_context *nv50) 3060f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3061f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3062f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->vertprog; 3063f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3064f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3065f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3066f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3067f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3068f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3069f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3070f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 307122e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_data(nv50, p); 307222e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_code(nv50, p); 3073f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3074e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(13, 2); 3075f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_VP_ADDRESS_HIGH, 2); 3076072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3077072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3078072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3079072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 308093ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_ATTR_EN_0, 2); 30816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[0]); 30826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[1]); 308393ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1); 3084fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs so_data (so, p->cfg.high_result); 308593ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 2); 3086bcbe6baac37915563bc120ad558cd930bc1ddec1Ben Skeggs so_data (so, p->cfg.high_result); //8); 30878ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 308893ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_START_ID, 1); 3089f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_data (so, 0); /* program start offset */ 3090bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.vertprog); 3091ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3092f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3093f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3094f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3095f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_fragprog_validate(struct nv50_context *nv50) 3096f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 3097f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 3098f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->fragprog; 3099f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 3100f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3101f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 3102f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 3103f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 3104f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 3105f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 3106f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 310755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_data(nv50, p); 310855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_code(nv50, p); 3109f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3110585ae74d87f3d04a4b5b7c068b865292afd1a16bBen Skeggs so = so_new(64, 2); 3111f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_FP_ADDRESS_HIGH, 2); 3112072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3113072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 3114072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 3115072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 31166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_REG_ALLOC_TEMP, 1); 31178ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 311893ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_RESULT_COUNT, 1); 3119dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller so_data (so, p->cfg.high_result); 312093ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK19A8, 1); 31216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[2]); 312293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK196C, 1); 31236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[3]); 312493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_START_ID, 1); 31258ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, 0); /* program start offset */ 3126bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.fragprog); 3127ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 3128f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3129f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 313001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillerstatic void 313101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillernv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base) 313201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller{ 313301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 313401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 313501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned i, c, m = base; 313601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 313701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* XXX: This can't work correctly in all cases yet, we either 313801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * have to create TGSI_SEMANTIC_PNTC or sprite_coord_mode has 313901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * to be per FP input instead of per VP output 314001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller */ 314101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller memset(pntc, 0, 8 * sizeof(uint32_t)); 314201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 314301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (i = 0; i < fp->cfg.io_nr; i++) { 314401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t sn, si; 314501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t j = fp->cfg.io[i].id_vp, k = fp->cfg.io[i].id_fp; 314601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned n = popcnt4(fp->cfg.io[i].mask); 314701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 314801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (fp->info.input_semantic_name[k] != TGSI_SEMANTIC_GENERIC) { 314901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 315001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 315101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 315201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 315301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller sn = vp->info.input_semantic_name[j]; 315401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller si = vp->info.input_semantic_index[j]; 315501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 315601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (j < fp->cfg.io_nr && sn == TGSI_SEMANTIC_GENERIC) { 315701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ubyte mode = 315801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50->rasterizer->pipe.sprite_coord_mode[si]; 315901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 316001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (mode == PIPE_SPRITE_COORD_NONE) { 316101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 316201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 316301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 316401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 316501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 316601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* this is either PointCoord or replaced by sprite coords */ 316701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (c = 0; c < 4; c++) { 316801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (!(fp->cfg.io[i].mask & (1 << c))) 316901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 317001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller pntc[m / 8] |= (c + 1) << ((m % 8) * 4); 317101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ++m; 317201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 317301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 317401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller} 317501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 31766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic int 31776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_sreg4_map(uint32_t *p_map, int mid, uint32_t lin[4], 31786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 *fpi, struct nv50_sreg4 *vpo) 31796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 31806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int c; 31816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t mv = vpo->mask, mf = fpi->mask, oid = vpo->hw; 31826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t *map = (uint8_t *)p_map; 31836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 31856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (mf & 1) { 31866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fpi->linear == TRUE) 31876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller lin[mid / 32] |= 1 << (mid % 32); 31886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[mid++] = (mv & 1) ? oid : ((c == 3) ? 0x41 : 0x40); 31896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 31906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller oid += mv & 1; 31926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mf >>= 1; 31936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mv >>= 1; 31946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 31956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return mid; 31976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 31986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillervoid 32006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_linkage_validate(struct nv50_context *nv50) 32016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 32026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_grobj *tesla = nv50->screen->tesla; 32036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 32046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 32056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_stateobj *so; 32066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 dummy, *vpo; 32076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int i, n, c, m = 0; 320801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint32_t map[16], lin[4], reg[5], pcrd[8]; 32096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(map, 0, sizeof(map)); 32116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(lin, 0, sizeof(lin)); 32126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = 0x00000004; /* low and high clip distance map ids */ 32146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[2] = 0x00000000; /* layer index map id (disabled, GP only) */ 32156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[3] = 0x00000000; /* point size map id & enable */ 32166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] = fp->cfg.regs[0]; /* colour semantic reg */ 32176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] = fp->cfg.regs[1]; /* interpolant info */ 32186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.linear = FALSE; 32206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0xf; /* map all components of HPOS */ 32216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &dummy, &vp->cfg.io[0]); 32226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0x0; 32246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (vp->cfg.clpd < 0x40) { 32266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < vp->cfg.clpd_nr; ++c) 32276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[m++] = vp->cfg.clpd + c; 32286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = (m << 8); 32296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 32306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] |= m << 8; /* adjust BFC0 id */ 32324d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 32334d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller /* if light_twoside is active, it seems FFC0_ID == BFC0_ID is bad */ 32344d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (nv50->rasterizer->pipe.light_twoside) { 32354d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller vpo = &vp->cfg.two_side[0]; 32364d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 32374d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[0], &vpo[0]); 32384d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[1], &vpo[1]); 32394d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller } 32404d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 32416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] += m - 4; /* adjust FFC0 id */ 32426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] |= m << 8; /* set mid where 'normal' FP inputs start */ 32436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 0; 32456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fp->info.input_semantic_name[0] == TGSI_SEMANTIC_POSITION) 32466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 1; 32476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (; i < fp->cfg.io_nr; i++) { 32486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte sn = fp->info.input_semantic_name[fp->cfg.io[i].id_fp]; 32496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si = fp->info.input_semantic_index[fp->cfg.io[i].id_fp]; 32506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = fp->cfg.io[i].id_vp; 32526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n >= vp->cfg.io_nr || 32536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_name[n] != sn || 32546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_index[n] != si) 32556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &dummy; 32566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller else 32576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &vp->cfg.io[n]; 32586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.io[i], vpo); 32606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 32616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 326206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (nv50->rasterizer->pipe.point_size_per_vertex) { 326306dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller map[m / 4] |= vp->cfg.psiz << ((m % 4) * 8); 326406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller reg[3] = (m++ << 4) | 1; 326506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller } 326606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 32676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* now fill the stateobj */ 32686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so = so_new(64, 0); 32696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = (m + 3) / 4; 32716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 1); 32726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, m); 32736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP(0), n); 32746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, map, n); 32756516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_MAP_SEMANTIC_0, 4); 32776516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, reg, 4); 32786516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_INTERPOLANT_CTRL, 1); 32806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, reg[4]); 32816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 32826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, 0x1540, 4); 32836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, lin, 4); 32846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 328501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (nv50->rasterizer->pipe.point_sprite) { 328601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50_pntc_replace(nv50, pcrd, (reg[4] >> 8) & 0xff); 328701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 328801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_method(so, tesla, NV50TCL_POINT_COORD_REPLACE_MAP(0), 8); 328901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_datap (so, pcrd, 8); 329001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 329101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 32926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(so, &nv50->state.programs); 32936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(NULL, &so); 32946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 32956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 3296f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3297f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 3298f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 329940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs while (p->exec_head) { 330040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = p->exec_head; 330140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 330240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e->next; 330340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs FREE(e); 3304f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 330540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = NULL; 330640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size = 0; 3307f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3308072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_ref(NULL, &p->bo); 3309f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 33101b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&p->data[0]); 33117c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 3312f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = 0; 3313f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3314