nv50_program.c revision eb7ea97e7fff1ee39921ad81294c4963b5b3ded8
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 35b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs//#define NV50_PROGRAM_DUMP 36f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 379a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs/* ARL - gallium craps itself on progs/vp/arl.txt 3821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 3921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * MSB - Like MAD, but MUL+SUB 4021e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * - Fuck it off, introduce a way to negate args for ops that 4121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * support it. 4221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs * 43ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Look into inlining IMMD for ops other than MOV (make it general?) 4433e4d30d50344be26398a51365bea1be37487403Ben Skeggs * - Maybe even relax restrictions a bit, can't do P_RESULT + P_IMMD, 4533e4d30d50344be26398a51365bea1be37487403Ben Skeggs * but can emit to P_TEMP first - then MOV later. NVIDIA does this 46ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * 472fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * In ops such as ADD it's possible to construct a bad opcode in the !is_long() 482fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * case, if the emit_src() causes the inst to suddenly become long. 492fdeb4d5a5cc8b93bf885ba646e3a29a68c755edBen Skeggs * 50ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * Verify half-insns work where expected - and force disable them where they 51ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs * don't work - MUL has it forcibly disabled atm as it fixes POW.. 52afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * 53afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * FUCK! watch dst==src vectors, can overwrite components that are needed. 54afcaeaa0e4dc3ced40621c76304a2c0c5a3ab403Ben Skeggs * ie. SUB R0, R0.yzxw, R0 55776e9581d16fc0fd28058fbcd879756fd5d40b96Ben Skeggs * 56b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * Things to check with renouveau: 57b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs * FP attr/result assignment - how? 586d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * attrib 596d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16bc maps vp output onto fp hpos 606d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x16c0 maps vp output onto fp col0 616d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * result 626d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - colr always 0-3 636d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - depr always 4 646d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16bc->0x16e8 --> some binding between vp/fp regs 656d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x16b8 --> VP output count 666d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 676d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1298 --> "MOV rcol.x, fcol.y" "MOV depr, fcol.y" = 0x00000005 686d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * "MOV rcol.x, fcol.y" = 0x00000004 696d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x19a8 --> as above but 0x00000100 and 0x00000000 706d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - 0x00100000 used when KIL used 716d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x196c --> as above but 0x00000011 and 0x00000000 726d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 736d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * 0x1988 --> 0xXXNNNNNN 746d0f7ea95475009ee17862786469f7b9a34a797fBen Skeggs * - XX == FP high something 7521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs */ 76f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_reg { 77f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs enum { 78f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_TEMP, 79f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_ATTR, 80f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_RESULT, 81f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_CONST, 82f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs P_IMMD 83f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } type; 84f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int index; 85f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 86f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int hw; 8738ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs int neg; 88bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 89dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller int rhw; /* result hw for FP outputs, or interpolant index */ 90bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller int acc; /* instruction where this reg is last read (first insn == 1) */ 91f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 92f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 93e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* arbitrary limits */ 941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller#define MAX_IF_DEPTH 4 95e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller#define MAX_LOOP_DEPTH 4 961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 97f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstruct nv50_pc { 98f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p; 99f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 100f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* hw resources */ 101f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r_temp[NV50_SU_MAX_TEMP]; 102f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 103f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs /* tgsi resources */ 104f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *temp; 105f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int temp_nr; 106f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *attr; 107f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int attr_nr; 108f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *result; 109f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int result_nr; 110f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *param; 111f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int param_nr; 112f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *immd; 113f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs float *immd_buf; 114f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int immd_nr; 1152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 11621e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs struct nv50_reg *temp_temp[16]; 1172a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs unsigned temp_temp_nr; 118bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 119234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* broadcast and destination replacement regs */ 120234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_brdc; 121234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *r_dst[4]; 122234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 123e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller unsigned interp_mode[32]; 124dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller /* perspective interpolation registers */ 125dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_p; 126dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller struct nv50_reg *iv_c; 127e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 1281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_cond; 1291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *if_insn[MAX_IF_DEPTH]; 1301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *br_join[MAX_IF_DEPTH]; 131e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller struct nv50_program_exec *br_loop[MAX_LOOP_DEPTH]; /* for BRK branch */ 132e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int if_lvl, loop_lvl; 133e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller unsigned loop_pos[MAX_LOOP_DEPTH]; 1341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 135bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller /* current instruction and total number of insns */ 136bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_cur; 137bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller unsigned insn_nr; 138d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 139d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller boolean allow32; 140f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs}; 141f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 142e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerstatic INLINE void 143e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumillerctor_reg(struct nv50_reg *reg, unsigned type, int index, int hw) 144e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller{ 145e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->type = type; 146e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->index = index; 147e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->hw = hw; 148e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->neg = 0; 149e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->rhw = -1; 150e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller reg->acc = 0; 151e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller} 152e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller 1536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic INLINE unsigned 1546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerpopcnt4(uint32_t val) 1556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 1566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller static const unsigned cnt[16] 1576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; 1586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return cnt[val & 0xf]; 1596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 1606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 161f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 162f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_reg(struct nv50_pc *pc, struct nv50_reg *reg) 163f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 164f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller int i = 0; 165f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 166fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (reg->type == P_RESULT) { 167fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs if (pc->p->cfg.high_result < (reg->hw + 1)) 168fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs pc->p->cfg.high_result = reg->hw + 1; 169fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs } 170fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs 1718ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->type != P_TEMP) 172f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 173f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1748ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (reg->hw >= 0) { 1758ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs /*XXX: do this here too to catch FP temp-as-attr usage.. 1768ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs * not clean, but works */ 1778ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (reg->hw + 1)) 1788ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = reg->hw + 1; 1798ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs return; 1808ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs } 1818ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 182f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (reg->rhw != -1) { 183f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* try to allocate temporary with index rhw first */ 184f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (!(pc->r_temp[reg->rhw])) { 185f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->r_temp[reg->rhw] = reg; 186f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller reg->hw = reg->rhw; 187f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller if (pc->p->cfg.high_temp < (reg->rhw + 1)) 188f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller pc->p->cfg.high_temp = reg->rhw + 1; 189f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller return; 190f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 191f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller /* make sure we don't get things like $r0 needs to go 192f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller * in $r1 and $r1 in $r0 193f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller */ 194f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller i = pc->result_nr * 4; 195f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller } 196f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller 197f579a99cc608eaba6f617c11ab0aec7f3e9ef953Christoph Bumiller for (; i < NV50_SU_MAX_TEMP; i++) { 198f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!(pc->r_temp[i])) { 199f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = reg; 200f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs reg->hw = i; 2018ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs if (pc->p->cfg.high_temp < (i + 1)) 2028ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs pc->p->cfg.high_temp = i + 1; 203f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return; 204f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 205f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 206f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 207f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 208f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 209f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 210e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* XXX: For shaders that aren't executed linearly (e.g. shaders that 211e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * contain loops), we need to assign all hw regs to TGSI TEMPs early, 212e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * lest we risk temp_temps overwriting regs alloc'd "later". 213e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 214f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 215f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsalloc_temp(struct nv50_pc *pc, struct nv50_reg *dst) 216f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 217f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_reg *r; 218f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i; 219f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 220f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (dst && dst->type == P_TEMP && dst->hw == -1) 221f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return dst; 222f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 223f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < NV50_SU_MAX_TEMP; i++) { 224f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->r_temp[i]) { 225e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller r = MALLOC_STRUCT(nv50_reg); 226e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_TEMP, -1, i); 227f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc->r_temp[i] = r; 228f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return r; 229f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 230f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 231f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 232f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 233f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return NULL; 234f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 235f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 236dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller/* Assign the hw of the discarded temporary register src 237dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller * to the tgsi register dst and free src. 238dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller */ 239dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic void 240dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerassimilate_temp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 241dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 242dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assert(src->index == -1 && src->hw != -1); 243dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 244dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (dst->hw != -1) 245dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[dst->hw] = NULL; 246dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller pc->r_temp[src->hw] = dst; 247dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller dst->hw = src->hw; 248dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 249dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller FREE(src); 250dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 251dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 2527ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller/* release the hardware resource held by r */ 2537ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerstatic void 2547ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumillerrelease_hw(struct nv50_pc *pc, struct nv50_reg *r) 2557ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller{ 2567ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(r->type == P_TEMP); 2577ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->hw == -1) 2587ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller return; 2597ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2607ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller assert(pc->r_temp[r->hw] == r); 2617ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller pc->r_temp[r->hw] = NULL; 2627ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 2637ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller r->acc = 0; 2647ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller if (r->index == -1) 2657ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller FREE(r); 2667ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller} 2677ab96f4f733437de693b9578c3649b56069e6f24Christoph Bumiller 268f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 269f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsfree_temp(struct nv50_pc *pc, struct nv50_reg *r) 270f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 271f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (r->index == -1) { 272619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs unsigned hw = r->hw; 273619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs 274619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs FREE(pc->r_temp[hw]); 275619549a6377a58d54c9cf55f8863beed56b09566Ben Skeggs pc->r_temp[hw] = NULL; 276f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 277f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 278f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2793f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic int 2803f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsalloc_temp4(struct nv50_pc *pc, struct nv50_reg *dst[4], int idx) 2813f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 2823f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 2833f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 2843f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if ((idx + 4) >= NV50_SU_MAX_TEMP) 2853f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 1; 2863f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 2873f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs if (pc->r_temp[idx] || pc->r_temp[idx + 1] || 2883f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + 2] || pc->r_temp[idx + 3]) 289a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller return alloc_temp4(pc, dst, idx + 4); 2903f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 2913f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) { 292e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller dst[i] = MALLOC_STRUCT(nv50_reg); 293e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(dst[i], P_TEMP, -1, idx + i); 2943f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs pc->r_temp[idx + i] = dst[i]; 2953f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs } 2963f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 2973f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs return 0; 2983f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 2993f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3003f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsstatic void 3013f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggsfree_temp4(struct nv50_pc *pc, struct nv50_reg *reg[4]) 3023f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs{ 3033f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs int i; 3043f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 3053f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs for (i = 0; i < 4; i++) 3063f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs free_temp(pc, reg[i]); 3073f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs} 3083f66b72fdb4834c5211305698d22806eac80aa35Ben Skeggs 309f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic struct nv50_reg * 3102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggstemp_temp(struct nv50_pc *pc) 3112a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 31221e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (pc->temp_temp_nr >= 16) 3132a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs assert(0); 3142a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp[pc->temp_temp_nr] = alloc_temp(pc, NULL); 3162a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return pc->temp_temp[pc->temp_temp_nr++]; 3172a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 3202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggskill_temp_temp(struct nv50_pc *pc) 3212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 3222a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs int i; 3232a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 3242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs for (i = 0; i < pc->temp_temp_nr; i++) 3252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs free_temp(pc, pc->temp_temp[i]); 3262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs pc->temp_temp_nr = 0; 3272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 3282a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 32933e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic int 33033e4d30d50344be26398a51365bea1be37487403Ben Skeggsctor_immd(struct nv50_pc *pc, float x, float y, float z, float w) 33133e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 332f1aa2a43b7588aaca3ef175c8cc5366414cac2f8Christoph Bumiller pc->immd_buf = REALLOC(pc->immd_buf, (pc->immd_nr * 4 * sizeof(float)), 333861629d1fd4a1d256c913470c33d9522e83d615dBen Skeggs (pc->immd_nr + 1) * 4 * sizeof(float)); 33433e4d30d50344be26398a51365bea1be37487403Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 0] = x; 335686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 1] = y; 336686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 2] = z; 337686bc00c05094e8678747c111a6a70ad4b7063e3Ben Skeggs pc->immd_buf[(pc->immd_nr * 4) + 3] = w; 33833e4d30d50344be26398a51365bea1be37487403Ben Skeggs 33933e4d30d50344be26398a51365bea1be37487403Ben Skeggs return pc->immd_nr++; 34033e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 34133e4d30d50344be26398a51365bea1be37487403Ben Skeggs 34233e4d30d50344be26398a51365bea1be37487403Ben Skeggsstatic struct nv50_reg * 34333e4d30d50344be26398a51365bea1be37487403Ben Skeggsalloc_immd(struct nv50_pc *pc, float f) 34433e4d30d50344be26398a51365bea1be37487403Ben Skeggs{ 345e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller struct nv50_reg *r = MALLOC_STRUCT(nv50_reg); 34633e4d30d50344be26398a51365bea1be37487403Ben Skeggs unsigned hw; 34733e4d30d50344be26398a51365bea1be37487403Ben Skeggs 3487e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller for (hw = 0; hw < pc->immd_nr * 4; hw++) 3497e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (pc->immd_buf[hw] == f) 3507e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller break; 3517e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 3527e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller if (hw == pc->immd_nr * 4) 3537e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller hw = ctor_immd(pc, f, -f, 0.5 * f, 0) * 4; 3547e7d3a87ec60f8e412d724c6586461501d420ec0Christoph Bumiller 355e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(r, P_IMMD, -1, hw); 35633e4d30d50344be26398a51365bea1be37487403Ben Skeggs return r; 35733e4d30d50344be26398a51365bea1be37487403Ben Skeggs} 35833e4d30d50344be26398a51365bea1be37487403Ben Skeggs 35940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic struct nv50_program_exec * 36040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsexec(struct nv50_pc *pc) 36140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs{ 36240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = CALLOC_STRUCT(nv50_program_exec); 36340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 3641c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = -1; 36540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs return e; 36640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs} 36740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 36855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 36940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsemit(struct nv50_pc *pc, struct nv50_program_exec *e) 37055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 37155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs struct nv50_program *p = pc->p; 37255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 37340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (p->exec_tail) 37440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail->next = e; 37540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (!p->exec_head) 37640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e; 37740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = e; 37840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size += (e->inst[0] & 1) ? 2 : 1; 37955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 38055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 38140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsstatic INLINE void set_long(struct nv50_pc *, struct nv50_program_exec *); 38255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 38355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 38440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_long(struct nv50_program_exec *e) 38555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 38640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 1) 38755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 38855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 38955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 39055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 39155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic boolean 39240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsis_immd(struct nv50_program_exec *e) 39355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 39440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && (e->inst[1] & 3) == 3) 39555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return TRUE; 39655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return FALSE; 39755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 39855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 39955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 40040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred(struct nv50_pc *pc, unsigned pred, unsigned idx, 40140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 40255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 40340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 40440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x1f << 7) | (0x3 << 12)); 40540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (pred << 7) | (idx << 12); 40655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 40755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 40855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 40940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_pred_wr(struct nv50_pc *pc, unsigned on, unsigned idx, 41040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e) 41155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 41240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 41340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] &= ~((0x3 << 4) | (1 << 6)); 41440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (idx << 4) | (on << 6); 41555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 41655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 41755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 41840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_long(struct nv50_pc *pc, struct nv50_program_exec *e) 41955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 42040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e)) 42155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs return; 42255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 1; 42440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0xf, 0, e); 42540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 42655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 42755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 42855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 42940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_dst(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_program_exec *e) 43055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 43155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (dst->type == P_RESULT) { 43240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 43340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000008; 43455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 43555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 43655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, dst); 43740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (dst->hw << 2); 43855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 43955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 44055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic INLINE void 44140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct nv50_program_exec *e) 44255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 443c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller float f = pc->immd_buf[imm->hw]; 444c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller unsigned val = fui(imm->neg ? -f : f); 44555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 44640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 44755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: can't be predicated - bits overlap.. catch cases where both 44855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * are required and avoid them. */ 44940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 0, 0, e); 45040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 0, 0, e); 45155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 45240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00000002 | 0x00000001; 45340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (val & 0x3f) << 16; 45440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (val >> 6) << 2; 45555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 45655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 457e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 458e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_LINEAR 0 459e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_FLAT 1 460e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_PERSPECTIVE 2 461e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller#define INTERP_CENTROID 4 462e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 463dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller/* interpolant index has been stored in dst->rhw */ 46455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsstatic void 465dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumilleremit_interp(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *iv, 466dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller unsigned mode) 4678ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs{ 468dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller assert(dst->rhw != -1); 46940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 4708ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 47140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x80000000; 47240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 473dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (dst->rhw << 16); 474dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 475dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_FLAT) { 476dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 8); 477dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } else { 478dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_PERSPECTIVE) { 479dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 25); 480dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller alloc_reg(pc, iv); 481dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (iv->hw << 9); 482dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 483dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 484dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller if (mode & INTERP_CENTROID) 485dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller e->inst[0] |= (1 << 24); 4865a3ea9ee59ac586955f7784eb25e7fd70d0c8882Ben Skeggs } 4878ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 48840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 4898ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs} 4908ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 4918ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggsstatic void 4921c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggsset_data(struct nv50_pc *pc, struct nv50_reg *src, unsigned m, unsigned s, 4931c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs struct nv50_program_exec *e) 4942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 49540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 4961c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 4971c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.index = src->hw; 4981c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.shift = s; 4991c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs e->param.mask = m << (s % 32); 50094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 50194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller e->inst[1] |= (((src->type == P_IMMD) ? 0 : 1) << 22); 5022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 5032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 5042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 50555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggsemit_mov(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 50655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs{ 50740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 50855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 5092eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller e->inst[0] = 0x10000000; 5102eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!pc->allow32) 5112eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_long(pc, e); 51255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 51340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 51455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 5152eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!is_long(e) && src->type == P_IMMD) { 51640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_immd(pc, src, e); 51755b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs /*XXX: 32-bit, but steals part of "half" reg space - need to 51855b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs * catch and handle this case if/when we do half-regs 51955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs */ 52055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else 52155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_IMMD || src->type == P_CONST) { 52240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 5231c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 9, e); 52440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x20000000; /* src0 const? */ 52555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } else { 52655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs if (src->type == P_ATTR) { 52740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 52840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 52955b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 53055b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 53155b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs alloc_reg(pc, src); 53240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 53355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs } 53455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 53540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (is_long(e) && !is_immd(e)) { 53640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x04000000; /* 32-bit */ 537d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x0000c000; /* "subsubop" 0x3 */ 538d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (!(e->inst[1] & 0x20000000)) 539d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[1] |= 0x00030000; /* "subsubop" 0xf */ 540d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller } else 541d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller e->inst[0] |= 0x00008000; 54255b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 54340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 54455b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs} 54555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs 5464a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumillerstatic INLINE void 5474a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumilleremit_mov_immdval(struct nv50_pc *pc, struct nv50_reg *dst, float f) 5484a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller{ 5494a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller struct nv50_reg *imm = alloc_immd(pc, f); 5504a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov(pc, dst, imm); 5514a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller FREE(imm); 5524a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller} 5534a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller 554f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 5552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggscheck_swap_src_0_1(struct nv50_pc *pc, 5562a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg **s0, struct nv50_reg **s1) 5572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 5582a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src0 = *s0, *src1 = *s1; 5592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 5602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type == P_CONST) { 5612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type != P_CONST) { 5622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 5632a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 5642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 5652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 5662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 5672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src1->type == P_ATTR) { 5682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src0->type != P_ATTR) { 5692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s0 = src1; 5702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs *s1 = src0; 5712a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return TRUE; 5722a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 5732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 5742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 5752a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs return FALSE; 5762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 5772a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 5782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 579001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerset_src_0_restricted(struct nv50_pc *pc, struct nv50_reg *src, 580001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_program_exec *e) 581001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller{ 582001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller struct nv50_reg *temp; 583001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 584001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (src->type != P_TEMP) { 585001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller temp = temp_temp(pc); 586001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller emit_mov(pc, temp, src); 587001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller src = temp; 588001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller } 589001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 590001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller alloc_reg(pc, src); 591001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller e->inst[0] |= (src->hw << 9); 592001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller} 593001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 594001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumillerstatic void 59540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_0(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 5962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 5972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 59840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 59940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= 0x00200000; 6002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 6022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 6032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 6052a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 6062a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6072a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6082a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 60940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 9); 6102a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6112a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 61340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_1(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 6142a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 6152a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 6162a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 6172a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6182a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 6192a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 6202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6212a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 62240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x00800000)); 62340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x01000000) { 62434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 62534a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 62634a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 62734a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 62834a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 6291c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 16, e); 63040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x00800000; 63134a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 6322a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6332a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6342a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 63540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= (src->hw << 16); 6362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6382a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 63940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggsset_src_2(struct nv50_pc *pc, struct nv50_reg *src, struct nv50_program_exec *e) 6402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 64140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 6422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_ATTR) { 6442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 6452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mov(pc, temp, src); 6472a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs src = temp; 6482a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } else 6492a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs if (src->type == P_CONST || src->type == P_IMMD) { 65040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs assert(!(e->inst[0] & 0x01000000)); 65140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs if (e->inst[0] & 0x00800000) { 65234a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs struct nv50_reg *temp = temp_temp(pc); 65334a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs 65434a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs emit_mov(pc, temp, src); 65534a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs src = temp; 65634a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } else { 6571c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs set_data(pc, src, 0x7f, 32+14, e); 65840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x01000000; 65934a039ae7b158cacb5b20d91067e9d6458d30a56Ben Skeggs } 6602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs } 6612a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6622a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs alloc_reg(pc, src); 66340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (src->hw << 14); 6642a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 6672a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mul(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 6682a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 6692a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 67040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 6712a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 67240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xc0000000; 6732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 674708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (!pc->allow32) 675708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 676708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 6772a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 67840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 67940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 680c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_IMMD && !is_long(e)) { 681c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg) 682c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 683708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 684c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } else { 685708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_src_1(pc, src1, e); 686c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg ^ src1->neg) { 687c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (is_long(e)) 688c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 689c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 690c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[0] |= 0x00008000; 691c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 692c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 6932a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 69440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 6952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 6962a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 6972a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 69852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_add(struct nv50_pc *pc, struct nv50_reg *dst, 69952a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 7002a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 70140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 7022a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 70340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 7042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 705c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller check_swap_src_0_1(pc, &src0, &src1); 706c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 707c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (!pc->allow32 || src0->neg || src1->neg) { 708708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_long(pc, e); 709c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= (src0->neg << 26) | (src1->neg << 27); 710c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 711708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 71240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 71340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 714c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src1->type == P_CONST || src1->type == P_ATTR || is_long(e)) 71540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src1, e); 71652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs else 717708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller if (src1->type == P_IMMD) 718708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller set_immd(pc, src1, e); 719708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller else 72040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 72152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 72240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 72352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs} 72452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 72552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsstatic void 72652a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggsemit_minmax(struct nv50_pc *pc, unsigned sub, struct nv50_reg *dst, 72752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 72852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs{ 72940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 73052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 73140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 73240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 73340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 73452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs 73552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 73640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 73740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 73840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 7392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 74040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 7412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 743c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 7442a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_sub(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 7452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1) 7462a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 747c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src1->neg ^= 1; 748c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_add(pc, dst, src0, src1); 749c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src1->neg ^= 1; 7502a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7512a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7522a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic void 7532a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_mad(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 7542a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 7552a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 75640137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 7572a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 75840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xe0000000; 7592a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 7602a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs check_swap_src_0_1(pc, &src0, &src1); 76140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 76240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 76340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 76440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_2(pc, src2, e); 7652a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 766c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src0->neg ^ src1->neg) 767c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x04000000; 768c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src2->neg) 769c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller e->inst[1] |= 0x08000000; 770c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 77140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 7722a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 7732a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 774c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic INLINE void 77521e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsemit_msb(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src0, 77621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs struct nv50_reg *src1, struct nv50_reg *src2) 77721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs{ 778c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src2->neg ^= 1; 779c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_mad(pc, dst, src0, src1, src2); 780c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller src2->neg ^= 1; 78121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs} 78221e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs 78321e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggsstatic void 7842a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsemit_flop(struct nv50_pc *pc, unsigned sub, 7852a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs struct nv50_reg *dst, struct nv50_reg *src) 7862a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs{ 78740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 7882a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 78940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0x90000000; 79052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs if (sub) { 79140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 79240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (sub << 29); 79352a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs } 7942a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 79540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 796001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller 797001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller if (sub == 0 || sub == 2) 798001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0_restricted(pc, src, e); 799001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller else 800001daf78c87b2d194b51bc650bf9f917d4224e31Christoph Bumiller set_src_0(pc, src, e); 8012a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 80240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8032a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs} 8042a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs 805d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsstatic void 806d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggsemit_preex2(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 807d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs{ 80840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 809d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 81040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 811d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 81240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 81340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 81440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 81540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29) | 0x00004000; 816d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 81740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 818d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs} 819faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 820bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggsstatic void 8217b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_precossin(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 8227b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs{ 82340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 8247b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 82540137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 8267b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 82740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_dst(pc, dst, e); 82840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src, e); 82940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 83040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[1] |= (6 << 29); 8317b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 83240137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 8337b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs} 8347b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs 83587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_RN 0x01 83687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_FLOOR 0x03 83787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_CEIL 0x05 83887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_TRUNC 0x07 83987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_SAT 0x08 84087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVTOP_ABS 0x10 84187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 8421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller/* 0x04 == 32 bit dst */ 8432b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x40 == dst is float */ 8442b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* 0x80 == src is float */ 84587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_F32 0xc4 84687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_S32 0x44 84787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_F32_U32 0x64 84887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_F32 0x8c 84987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller#define CVT_S32_S32 0x0c 850ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_NEG 0x20 851ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller#define CVT_RI 0x08 85287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 85387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic void 85487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumilleremit_cvt(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src, 8552b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller int wp, unsigned cvn, unsigned fmt) 85687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller{ 85787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller struct nv50_program_exec *e; 85887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 85987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e = exec(pc); 86087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_long(pc, e); 86187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 86287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0xa0000000; 8631635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] |= 0x00004000; /* 32 bit src */ 8642b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= (cvn << 16); 86587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= (fmt << 24); 86687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_src_0(pc, src, e); 86787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 86887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (wp >= 0) 86987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_pred_wr(pc, 1, wp, e); 87087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 87187eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller if (dst) 87287eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller set_dst(pc, dst, e); 87387eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller else { 87487eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[0] |= 0x000001fc; 87587eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller e->inst[1] |= 0x00000008; 87687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller } 87787eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 87887eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit(pc, e); 87987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller} 88087eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller 8812b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller/* nv50 Condition codes: 8822b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x1 = LT 8832b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x2 = EQ 8842b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x3 = LE 8852b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x4 = GT 8862b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x5 = NE 8872b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x6 = GE 8882b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x7 = set condition code ? (used before bra.lt/le/gt/ge) 8892b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * 0x8 = unordered bit (allows NaN) 8902b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller */ 8917b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsstatic void 8922b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumilleremit_set(struct nv50_pc *pc, unsigned ccode, struct nv50_reg *dst, int wp, 893bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *src0, struct nv50_reg *src1) 894bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs{ 895d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller static const unsigned cc_swapped[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 896d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller 89740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = exec(pc); 898bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs struct nv50_reg *rdst; 899bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 9002b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(ccode < 16); 901bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (check_swap_src_0_1(pc, &src0, &src1)) 902d3a9cf54c0a95fb60ac8921e100d51b53c44541bChristoph Bumiller ccode = cc_swapped[ccode & 7] | (ccode & 8); 903bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 904bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs rdst = dst; 9052b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst && dst->type != P_TEMP) 906bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs dst = alloc_temp(pc, NULL); 907bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 908bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs /* set.u32 */ 90940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_long(pc, e); 91040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs e->inst[0] |= 0xb0000000; 9112b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x60000000 | (ccode << 14); 9122b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 9132b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* XXX: decuda will disasm as .u16 and use .lo/.hi regs, but 9142b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller * that doesn't seem to match what the hw actually does 9152b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x04000000; << breaks things, u32 by default ? 916bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs */ 9172b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 9182b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (wp >= 0) 9192b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_pred_wr(pc, 1, wp, e); 9202b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (dst) 9212b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller set_dst(pc, dst, e); 9222b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller else { 9232b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[0] |= 0x000001fc; 9242b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller e->inst[1] |= 0x00000008; 9252b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 9262b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 92740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_0(pc, src0, e); 92840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_src_1(pc, src1, e); 929bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 93040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs emit(pc, e); 9311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_cond = pc->p->exec_tail; /* record for OPCODE_IF */ 932bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs 9332b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller /* cvt.f32.u32/s32 (?) if we didn't only write the predicate */ 9342b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst) 9352b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_cvt(pc, rdst, dst, -1, CVTOP_ABS | CVTOP_RN, CVT_F32_S32); 9362b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller if (rdst && rdst != dst) 937bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs free_temp(pc, dst); 938bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs} 939d69f33423087fc054181c60724f4bcbe29195e08Ben Skeggs 9402b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillerstatic INLINE unsigned 9412b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumillermap_tgsi_setop_cc(unsigned op) 9422b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller{ 9432b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller switch (op) { 9442b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLT: return 0x1; 9452b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: return 0x6; 9462b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: return 0x2; 9472b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: return 0x4; 9482b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: return 0x3; 9492b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: return 0xd; 9502b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller default: 9512b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller assert(0); 9522b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller return 0; 9532b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller } 9542b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller} 9552b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller 95687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 957b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggsemit_flr(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 958b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs{ 959ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_FLOOR, CVT_F32_F32 | CVT_RI); 960b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs} 961b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs 962faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsstatic void 963faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggsemit_pow(struct nv50_pc *pc, struct nv50_reg *dst, 964faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *v, struct nv50_reg *e) 965faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs{ 966faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs struct nv50_reg *temp = alloc_temp(pc, NULL); 967faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 968faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 3, temp, v); 969faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_mul(pc, temp, temp, e); 970faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_preex2(pc, temp, temp); 971faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs emit_flop(pc, 6, dst, temp); 972faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 973faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs free_temp(pc, temp); 974faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs} 975faa1c02546db00f69c66db18076b5b0ac86d7138Ben Skeggs 97687eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumillerstatic INLINE void 977fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsemit_abs(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 978fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 97987eea6e2b2df57bddb7155df794f02143e1ece40Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_ABS, CVT_F32_F32); 980fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 981fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 982234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic INLINE void 983234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumilleremit_sat(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 984234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 985234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_SAT, CVT_F32_F32); 986234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 987234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 98801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggsstatic void 9897b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggsemit_lit(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 9907b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs struct nv50_reg **src) 99101e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs{ 99201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *one = alloc_immd(pc, 1.0); 99301e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *zero = alloc_immd(pc, 0.0); 99401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *neg128 = alloc_immd(pc, -127.999999); 99501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *pos128 = alloc_immd(pc, 127.999999); 99601e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs struct nv50_reg *tmp[4]; 997708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller boolean allow32 = pc->allow32; 998708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 999708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = FALSE; 100001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10017b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (3 << 1)) { 1002dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller tmp[0] = alloc_temp(pc, NULL); 10037b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[0], src[0], zero); 10047b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 100501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10067b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 2)) { 100740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred_wr(pc, 1, 0, pc->p->exec_tail); 100801e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10097b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[1] = temp_temp(pc); 10107b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[1], src[1], zero); 101101e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10127b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs tmp[3] = temp_temp(pc); 10137b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 4, tmp[3], src[3], neg128); 10147b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_minmax(pc, 5, tmp[3], tmp[3], pos128); 101501e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10167b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_pow(pc, dst[2], tmp[1], tmp[3]); 10177b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_mov(pc, dst[2], zero); 101840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs set_pred(pc, 3, 0, pc->p->exec_tail); 10197b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs } 10209417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 1021dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 1)) 1022dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller assimilate_temp(pc, dst[1], tmp[0]); 1023dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller else 1024dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 2)) 1025dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller free_temp(pc, tmp[0]); 1026dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1027708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller pc->allow32 = allow32; 1028708c711f8361ea82c1217e2614914ae047bc5bdfChristoph Bumiller 1029dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller /* do this last, in case src[i,j] == dst[0,3] */ 1030dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 0)) 1031dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[0], one); 1032dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1033dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller if (mask & (1 << 3)) 1034dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller emit_mov(pc, dst[3], one); 1035dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 10369417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pos128); 10379417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(neg128); 10389417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(zero); 10399417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(one); 104001e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs} 104101e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs 10421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic INLINE void 104331f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggsemit_neg(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 104431f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs{ 10451635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_cvt(pc, dst, src, -1, CVTOP_RN, CVT_F32_F32 | CVT_NEG); 104631f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs} 104731f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs 1048d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsstatic void 1049d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggsemit_kil(struct nv50_pc *pc, struct nv50_reg *src) 1050d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs{ 1051d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs struct nv50_program_exec *e; 1052d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs const int r_pred = 1; 1053eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller unsigned cvn = CVT_F32_F32; 1054d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1055c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (src->neg) 1056eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller cvn |= CVT_NEG; 1057eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* write predicate reg */ 1058eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller emit_cvt(pc, NULL, src, r_pred, CVTOP_RN, cvn); 1059d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 1060eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller /* conditional discard */ 1061d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs e = exec(pc); 1062eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller e->inst[0] = 0x00000002; 1063d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs set_long(pc, e); 1064eb7ea97e7fff1ee39921ad81294c4963b5b3ded8Christoph Bumiller set_pred(pc, 0x1 /* LT */, r_pred, e); 1065d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit(pc, e); 1066d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs} 1067d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs 106844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerstatic void 10693accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumilleremit_tex(struct nv50_pc *pc, struct nv50_reg **dst, unsigned mask, 10703accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_reg **src, unsigned unit, unsigned type, boolean proj) 10713accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller{ 10723accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_reg *temp, *t[4]; 10733accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller struct nv50_program_exec *e; 10743accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 10753accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller unsigned c, mode, dim; 10763accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 10773accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller switch (type) { 10783accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_1D: 10793accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 1; 10803accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 10813accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_UNKNOWN: 10823accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_2D: 10833accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW1D: /* XXX: x, z */ 10843accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_RECT: 10853accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 2; 10863accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 10873accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_3D: 10883accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_CUBE: 10893accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOW2D: 10903accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller case TGSI_TEXTURE_SHADOWRECT: /* XXX */ 10913accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller dim = 3; 10923accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 10933accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller default: 10943accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assert(0); 10953accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 10963accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 10973accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 1098a2af40b846e0b510887aaf15c2777387a3caae62Christoph Bumiller /* some cards need t[0]'s hw index to be a multiple of 4 */ 10993accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller alloc_temp4(pc, t, 0); 11003accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11013accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (proj) { 11023accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (src[0]->type == P_TEMP && src[0]->rhw != -1) { 11033accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller mode = pc->interp_mode[src[0]->index]; 11043accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11053accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[3]->rhw = src[3]->rhw; 11063accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[3], NULL, (mode & INTERP_CENTROID)); 11073accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], t[3]); 11083accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11093accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) { 11103accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller t[c]->rhw = src[c]->rhw; 11113accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_interp(pc, t[c], t[3], 11123accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller (mode | INTERP_PERSPECTIVE)); 11133accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 11143accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 11153accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, t[3], src[3]); 11163accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) 11173accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mul(pc, t[c], src[c], t[3]); 11183accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11193accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: for some reason the blob sometimes uses MAD: 11203accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * emit_mad(pc, t[c], src[0][c], t[3], t[3]) 11213accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * pc->p->exec_tail->inst[1] |= 0x080fc000; 11223accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller */ 11233accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 11243accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 11253accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (type == TGSI_TEXTURE_CUBE) { 11263accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller temp = temp_temp(pc); 11273accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_minmax(pc, 4, temp, src[0], src[1]); 11283accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_minmax(pc, 4, temp, temp, src[2]); 11293accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_flop(pc, 0, temp, temp); 11303accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 3; c++) 11313accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mul(pc, t[c], src[c], temp); 11323accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } else { 11333accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < dim; c++) 11343accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_mov(pc, t[c], src[c]); 11353accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 11363accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 11373accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11383accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e = exec(pc); 11393accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_long(pc, e); 11403accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0xf0000000; 11413accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= 0x00000004; 11423accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller set_dst(pc, t[0], e); 11433accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (unit << 9); 11443accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11453accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (dim == 2) 11463accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00400000; 11473accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 11483accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (dim == 3) 11493accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= 0x00800000; 11503accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11513accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[0] |= (mask & 0x3) << 25; 11523accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller e->inst[1] |= (mask & 0xc) << 12; 11533accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11543accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit(pc, e); 11553accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11563accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#if 1 11575f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller c = 0; 11585f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 1) emit_mov(pc, dst[0], t[c++]); 11595f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 2) emit_mov(pc, dst[1], t[c++]); 11605f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 4) emit_mov(pc, dst[2], t[c++]); 11615f4f7ad965c40327f16297606ed4f425598bfc2cChristoph Bumiller if (mask & 8) emit_mov(pc, dst[3], t[c]); 11623accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11633accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp4(pc, t); 11643accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#else 11653accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller /* XXX: if p.e. MUL is used directly after TEX, it would still use 11663accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller * the texture coordinates, not the fetched values: latency ? */ 11673accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11683accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller for (c = 0; c < 4; c++) { 11693accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller if (mask & (1 << c)) 11703accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller assimilate_temp(pc, dst[c], t[c]); 11713accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller else 11723accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller free_temp(pc, t[c]); 11733accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller } 11743accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller#endif 11753accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller} 11763accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller 11773accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumillerstatic void 11781196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_branch(struct nv50_pc *pc, int pred, unsigned cc, 11791196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec **join) 11801196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 11811196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 11821196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 11831196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (join) { 11841196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 11851196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0xa0000002; 11861196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 11871196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller *join = e; 11881196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e = exec(pc); 11891196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 11901196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 11911196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 11921196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= 0x10000002; 11931196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pred >= 0) 11941196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_pred(pc, cc, pred, e); 11951196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 11961196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 11971196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 11981196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 11991196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumilleremit_nop(struct nv50_pc *pc) 12001196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 12011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e = exec(pc); 12021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 12031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] = 0xf0000000; 12041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_long(pc, e); 12051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[1] = 0xe0000000; 12061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit(pc, e); 12071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 12081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 12091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 12101635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddx(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 12111635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 12121635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 12131635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12141635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 12151635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12161635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0140000; 12171635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x89800000; 12181635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 12191635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 12201635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 12211635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 12221635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12231635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 12241635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 12251635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12261635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 12271635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumilleremit_ddy(struct nv50_pc *pc, struct nv50_reg *dst, struct nv50_reg *src) 12281635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller{ 12291635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller struct nv50_program_exec *e = exec(pc); 12301635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12311635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller assert(src->type == P_TEMP); 12321635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12331635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!src->neg) /* ! double negation */ 12341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_neg(pc, src, src); 12351635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12361635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[0] = 0xc0150000; 12371635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller e->inst[1] = 0x8a400000; 12381635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_long(pc, e); 12391635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_dst(pc, dst, e); 12401635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_0(pc, src, e); 12411635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller set_src_2(pc, src, e); 12421635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12431635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit(pc, e); 12441635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller} 12451635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller 12461635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumillerstatic void 124744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumillerconvert_to_long(struct nv50_pc *pc, struct nv50_program_exec *e) 124844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller{ 124944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller unsigned q = 0, m = ~0; 125044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 125144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(!is_long(e)); 125244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 125344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller switch (e->inst[0] >> 28) { 125444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x1: 125544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MOV */ 125644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = 0x0403c000; 125744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = 0xffff7fff; 125844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 125944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x8: 12608b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller /* INTERP (move centroid, perspective and flat bits) */ 12618b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller m = ~0x03000100; 12628b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q = (e->inst[0] & (3 << 24)) >> (24 - 16); 12638b1ef3fa357f5bbd6d3f73714a86ce380b867a71Christoph Bumiller q |= (e->inst[0] & (1 << 8)) << (18 - 8); 126444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 126544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0x9: 126644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* RCP */ 126744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 126844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xB: 126944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* ADD */ 127044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~(127 << 16); 127144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) >> 2); 127244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 127344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xC: 127444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MUL */ 127544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller m = ~0x00008000; 127644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & (~m)) << 12); 127744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 127844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller case 0xE: 127944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller /* MAD (if src2 == dst) */ 128044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller q = ((e->inst[0] & 0x1fc) << 12); 128144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 128244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller default: 128344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller assert(0); 128444b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller break; 128544b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller } 128644b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 128744b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller set_long(pc, e); 128844b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller pc->p->exec_size++; 128944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 129044b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[0] &= m; 129144b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller e->inst[1] |= q; 129244b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller} 129344b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 1294f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller/* Some operations support an optional negation flag. */ 1295c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillerstatic boolean 1296c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillernegate_supported(const struct tgsi_full_instruction *insn, int i) 1297c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller{ 1298f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller int s; 1299f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1300c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller switch (insn->Instruction.Opcode) { 13011635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 1302c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP3: 1303c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_DP4: 1304c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MUL: 1305c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_KIL: 1306c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_ADD: 1307c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_SUB: 1308c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_MAD: 1309f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1310c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller case TGSI_OPCODE_POW: 1311f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (i == 1) 1312f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller break; 1313f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1314c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller default: 1315c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller return FALSE; 1316c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 1317f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1318f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller /* Watch out for possible multiple uses of an nv50_reg, we 1319f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller * can't use nv50_reg::neg in these cases. 1320f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller */ 1321f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller for (s = 0; s < insn->Instruction.NumSrcRegs; ++s) { 1322f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if (s == i) 1323f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller continue; 1324f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller if ((insn->FullSrcRegisters[s].SrcRegister.Index == 1325f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller insn->FullSrcRegisters[i].SrcRegister.Index) && 1326f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller (insn->FullSrcRegisters[s].SrcRegister.File == 1327f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller insn->FullSrcRegisters[i].SrcRegister.File)) 1328f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return FALSE; 1329f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller } 1330f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller 1331f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller return TRUE; 1332c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller} 1333c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller 13345d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller/* Return a read mask for source registers deduced from opcode & write mask. */ 13355d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillerstatic unsigned 13365d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumillernv50_tgsi_src_mask(const struct tgsi_full_instruction *insn, int c) 13375d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller{ 13385d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned x, mask = insn->FullDstRegisters[0].DstRegister.WriteMask; 13395d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 13405d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (insn->Instruction.Opcode) { 13415d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_COS: 13425d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SIN: 13435d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 13445d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP3: 13455d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x7; 13465d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DP4: 13475d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DPH: 13485d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 13495d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xf; 13505d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_DST: 13515d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask & (c ? 0xa : 0x6); 13525d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_EX2: 13535d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LG2: 13545d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_POW: 13555d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RCP: 13565d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_RSQ: 13575d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_SCS: 13585d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0x1; 13595d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_LIT: 13605d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return 0xb; 13615d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TEX: 13625d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_TXP: 13635d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller { 13645d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller const struct tgsi_instruction_ext_texture *tex; 13655d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 13665d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller assert(insn->Instruction.Extended); 13675d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller tex = &insn->InstructionExtTexture; 13685d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 13695d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = 0x7; 13705d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (insn->Instruction.Opcode == TGSI_OPCODE_TXP) 13715d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask |= 0x8; 13725d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 13735d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller switch (tex->Texture) { 13745d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_1D: 13755d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0x9; 13765d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 13775d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_TEXTURE_2D: 13785d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask &= 0xb; 13795d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 13805d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 13815d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 13825d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 13835d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 13845d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 13855d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller case TGSI_OPCODE_XPD: 13865d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller x = 0; 13875d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 1) x |= 0x6; 13885d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 2) x |= 0x5; 13895d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (mask & 4) x |= 0x3; 13905d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return x; 13915d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller default: 13925d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller break; 13935d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller } 13945d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 13955d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller return mask; 13965d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller} 13975d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 1398fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1399fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggstgsi_dst(struct nv50_pc *pc, int c, const struct tgsi_full_dst_register *dst) 1400fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1401fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (dst->DstRegister.File) { 1402fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1403fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->temp[dst->DstRegister.Index * 4 + c]; 1404fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_OUTPUT: 1405fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return &pc->result[dst->DstRegister.Index * 4 + c]; 1406fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_NULL: 1407fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1408fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1409fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1410fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1411fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1412fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return NULL; 1413fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1414fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1415fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggsstatic struct nv50_reg * 1416c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumillertgsi_src(struct nv50_pc *pc, int chan, const struct tgsi_full_src_register *src, 1417c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller boolean neg) 1418fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs{ 1419fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *r = NULL; 1420fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs struct nv50_reg *temp; 14219417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller unsigned sgn, c; 14229417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 14239417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller sgn = tgsi_util_get_full_src_register_sign_mode(src, chan); 1424fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1425fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs c = tgsi_util_get_full_src_register_extswizzle(src, chan); 1426fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (c) { 1427fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_X: 1428fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_Y: 1429fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_Z: 1430fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_W: 1431fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs switch (src->SrcRegister.File) { 1432fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_INPUT: 1433fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->attr[src->SrcRegister.Index * 4 + c]; 1434fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1435fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_TEMPORARY: 1436fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->temp[src->SrcRegister.Index * 4 + c]; 1437fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1438fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_CONSTANT: 1439fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->param[src->SrcRegister.Index * 4 + c]; 1440fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1441fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_FILE_IMMEDIATE: 1442fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = &pc->immd[src->SrcRegister.Index * 4 + c]; 1443fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1444c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 1445c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 1446fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1447fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1448fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1449fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1450fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1451fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_ZERO: 1452fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = alloc_immd(pc, 0.0); 14539417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return r; 1454fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_EXTSWIZZLE_ONE: 14559417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (sgn == TGSI_UTIL_SIGN_TOGGLE || sgn == TGSI_UTIL_SIGN_SET) 14569417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return alloc_immd(pc, -1.0); 14579417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller return alloc_immd(pc, 1.0); 1458fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1459fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1460fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1461fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1462fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 14639417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller switch (sgn) { 1464fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_KEEP: 1465fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1466fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs case TGSI_UTIL_SIGN_CLEAR: 1467fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs temp = temp_temp(pc); 1468fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, temp, r); 1469fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs r = temp; 1470fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 147131f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_TOGGLE: 1472c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1473c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r->neg = 1; 1474c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else { 1475c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp = temp_temp(pc); 1476c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, r); 1477c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller r = temp; 1478c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller } 147931f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 148031f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs case TGSI_UTIL_SIGN_SET: 148131f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs temp = temp_temp(pc); 148231f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs emit_abs(pc, temp, r); 1483c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller if (neg) 1484c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller temp->neg = 1; 1485c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller else 1486c11c107f7d8f289f0cb83968c265fb78a274024aChristoph Bumiller emit_neg(pc, temp, temp); 148731f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs r = temp; 148831f6a24b59b0ac18e04336d2e3cbaa643358c88aBen Skeggs break; 1489fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs default: 1490fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs assert(0); 1491fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs break; 1492fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs } 1493fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 1494fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs return r; 1495fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs} 1496fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs 14972da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* return TRUE for ops that produce only a single result */ 1498dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumillerstatic boolean 14992da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumilleris_scalar_op(unsigned op) 1500dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller{ 15012da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 1502e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_COS: 15032da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DP2: 1504dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP3: 1505dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DP4: 1506dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_DPH: 15072da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_EX2: 15082da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LG2: 1509dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_POW: 1510dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RCP: 1511dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_RSQ: 1512e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller case TGSI_OPCODE_SIN: 15132da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* 15142da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 15152da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 1516dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_SCS: 15172da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 15182da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return TRUE; 15192da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 15202da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return FALSE; 15212da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 15222da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 15232da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 15242da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components depend 15252da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * on source s, component c (reverse of nv50_tgsi_src_mask). 15262da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 15272da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 15282da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_tgsi_dst_revdep(unsigned op, int s, int c) 15292da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 15302da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (is_scalar_op(op)) 15312da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x1; 15322da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 15332da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (op) { 15342da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_DST: 15352da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c) & (s ? 0xa : 0x6); 15362da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_XPD: 15372da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller switch (c) { 15382da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 0: return 0x6; 15392da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 1: return 0x5; 15402da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 2: return 0x3; 15412da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case 3: return 0x0; 15422da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller default: 15432da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 15442da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 15452da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 15462da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_LIT: 15472da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_SCS: 1548dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TEX: 1549dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller case TGSI_OPCODE_TXP: 15502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* these take care of dangerous swizzles themselves */ 15512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0x0; 15522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_IF: 15532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller case TGSI_OPCODE_KIL: 15542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* don't call this function for these ops */ 15552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller assert(0); 15562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return 0; 1557dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller default: 15582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* linear vector instruction */ 15592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return (1 << c); 1560dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller } 1561dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller} 1562dac709d0cf3258ad8e131964e513c2eabe1d554eChristoph Bumiller 1563e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic INLINE boolean 1564e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerhas_pred(struct nv50_program_exec *e, unsigned cc) 1565e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1566e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (!is_long(e) || is_immd(e)) 1567e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1568e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return ((e->inst[1] & 0x780) == (cc << 7)); 1569e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1570e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1571e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller/* on ENDIF see if we can do "@p0.neu single_op" instead of: 1572e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * join_at ENDIF 1573e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * @p0.eq bra ENDIF 1574e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * single_op 1575e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * ENDIF: nop.join 1576e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1577e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillerstatic boolean 1578e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumillernv50_kill_branch(struct nv50_pc *pc) 1579e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller{ 1580e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller int lvl = pc->if_lvl; 1581e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1582e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->if_insn[lvl]->next != pc->p->exec_tail) 1583e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1584e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1585e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* if ccode == 'true', the BRA is from an ELSE and the predicate 1586e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * reg may no longer be valid, since we currently always use $p0 1587e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1588e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (has_pred(pc->if_insn[lvl], 0xf)) 1589e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return FALSE; 1590e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->if_insn[lvl] && pc->br_join[lvl]); 1591e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1592e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* We'll use the exec allocated for JOIN_AT (as we can't easily 1593e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller * update prev's next); if exec_tail is BRK, update the pointer. 1594e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller */ 1595e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (pc->loop_lvl && pc->br_loop[pc->loop_lvl - 1] == pc->p->exec_tail) 1596e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->br_join[lvl]; 1597e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1598e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_size -= 4; /* remove JOIN_AT and BRA */ 1599e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1600e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller *pc->br_join[lvl] = *pc->p->exec_tail; 1601e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1602e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->if_insn[lvl]); 1603e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller FREE(pc->p->exec_tail); 1604e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1605e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail = pc->br_join[lvl]; 1606e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->next = NULL; 1607e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller set_pred(pc, 0xd, 0, pc->p->exec_tail); 1608e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 1609e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller return TRUE; 1610e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller} 1611e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 16122a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggsstatic boolean 1613234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_program_tx_insn(struct nv50_pc *pc, 1614234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_instruction *inst) 1615f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 161681de711fc864247419221d700bd045addf22cb52Christoph Bumiller struct nv50_reg *rdst[4], *dst[4], *brdc, *src[3][4], *temp; 1617cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unsigned mask, sat, unit; 1618f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs int i, c; 1619f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1620f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs mask = inst->FullDstRegisters[0].DstRegister.WriteMask; 1621688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs sat = inst->Instruction.Saturate == TGSI_SAT_ZERO_ONE; 1622f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1623234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller memset(src, 0, sizeof(src)); 1624234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 1625f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) { 1626234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((mask & (1 << c)) && !pc->r_dst[c]) 1627f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs dst[c] = tgsi_dst(pc, c, &inst->FullDstRegisters[0]); 1628f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs else 1629234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller dst[c] = pc->r_dst[c]; 1630234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdst[c] = dst[c]; 1631f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1632f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1633f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 16345069bfed29bcee2c89c36c74c6d65d388eb7792eZack Rusin const struct tgsi_full_src_register *fs = &inst->FullSrcRegisters[i]; 16355d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller unsigned src_mask; 16365d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller boolean neg_supp; 16375d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller 16385d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src_mask = nv50_tgsi_src_mask(inst, i); 16395d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller neg_supp = negate_supported(inst, i); 1640cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1641cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs if (fs->SrcRegister.File == TGSI_FILE_SAMPLER) 1642cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs unit = fs->SrcRegister.Index; 1643cd5d3fde13e424373feac9098453ed0ca7f6e4ebBen Skeggs 1644f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (c = 0; c < 4; c++) 16455d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller if (src_mask & (1 << c)) 16465d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller src[i][c] = tgsi_src(pc, c, fs, neg_supp); 1647f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1648f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 164981de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp = pc->r_brdc; 165081de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc && brdc->type != P_TEMP) { 165181de711fc864247419221d700bd045addf22cb52Christoph Bumiller temp = temp_temp(pc); 165281de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 165381de711fc864247419221d700bd045addf22cb52Christoph Bumiller brdc = temp; 165481de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 1655688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 1656688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 1657234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << c)) || dst[c]->type == P_TEMP) 1658234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 1659688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs rdst[c] = dst[c]; 1660688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs dst[c] = temp_temp(pc); 1661688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1662688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1663688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 166481de711fc864247419221d700bd045addf22cb52Christoph Bumiller assert(brdc || !is_scalar_op(inst->Instruction.Opcode)); 166581de711fc864247419221d700bd045addf22cb52Christoph Bumiller 1666f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (inst->Instruction.Opcode) { 166768091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs case TGSI_OPCODE_ABS: 166868091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs for (c = 0; c < 4; c++) { 1669fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs if (!(mask & (1 << c))) 1670fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs continue; 1671fe90cc509f75772ce202930c934bade1d4b116c8Ben Skeggs emit_abs(pc, dst[c], src[0][c]); 167268091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs } 167368091b0c89310c309b668c9d6d80640dc6040ab7Ben Skeggs break; 16742a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_ADD: 16757df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 16767df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 16777df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 16782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_add(pc, dst[c], src[0][c], src[1][c]); 16797df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 16802a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1681e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 1682e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->loop_pos[pc->loop_lvl++] = pc->p->exec_size; 1683e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1684e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_BRK: 1685e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 1686e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller assert(pc->loop_lvl > 0); 1687e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl - 1] = pc->p->exec_tail; 1688e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1689849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_CEIL: 1690849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 1691849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 1692849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 1693849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 1694ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_CEIL, CVT_F32_F32 | CVT_RI); 1695849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 1696849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 16972eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller case TGSI_OPCODE_CMP: 16982eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller pc->allow32 = FALSE; 16992eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller for (c = 0; c < 4; c++) { 17002eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller if (!(mask & (1 << c))) 17012eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller continue; 17022eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_cvt(pc, NULL, src[0][c], 1, CVTOP_RN, CVT_F32_F32); 17032eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[1][c]); 17042eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x1, 1, pc->p->exec_tail); /* @SF */ 17052eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller emit_mov(pc, dst[c], src[2][c]); 17062eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller set_pred(pc, 0x6, 1, pc->p->exec_tail); /* @NSF */ 17072eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller } 17082eef2017acbbb617c559555648c7745141f3aedbChristoph Bumiller break; 17092a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_COS: 1710e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 1711e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 1712e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, dst[3], temp); 1713e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 1714e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 1715e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 1716e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 17177df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 1718e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 1719e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 5, brdc, temp); 17202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 17211635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDX: 17221635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 17231635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 17241635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 17251635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddx(pc, dst[c], src[0][c]); 17261635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 17271635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 17281635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller case TGSI_OPCODE_DDY: 17291635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller for (c = 0; c < 4; c++) { 17301635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller if (!(mask & (1 << c))) 17311635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller continue; 17321635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller emit_ddy(pc, dst[c], src[0][c]); 17331635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller } 17341635e8d6f4b96e691746e8c8c5a273089bae6843Christoph Bumiller break; 17352a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP3: 17362a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 17372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 173881de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][2], src[1][2], temp); 17392a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 17402a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_DP4: 17412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 17422a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 17432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 174481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mad(pc, brdc, src[0][3], src[1][3], temp); 17452a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 174621e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_DPH: 174721e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][0]); 174821e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][1], src[1][1], temp); 174921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs emit_mad(pc, temp, src[0][2], src[1][2], temp); 175081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_add(pc, brdc, src[1][3], temp); 175121e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 175233e4d30d50344be26398a51365bea1be37487403Ben Skeggs case TGSI_OPCODE_DST: 17539a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) 17549a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, dst[1], src[0][1], src[1][1]); 17559a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) 17569a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[2], src[0][2]); 17579a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 3)) 17589a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mov(pc, dst[3], src[1][3]); 175981de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & (1 << 0)) 176081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov_immdval(pc, dst[0], 1.0f); 176133e4d30d50344be26398a51365bea1be37487403Ben Skeggs break; 17621196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ELSE: 17631196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, -1, 0, NULL); 17641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 17651196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 17661196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 17671196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_ENDIF: 17681196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[--pc->if_lvl]->param.index = pc->p->exec_size; 17691196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 1770e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller /* try to replace branch over 1 insn with a predicated insn */ 1771e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller if (nv50_kill_branch(pc) == TRUE) 1772e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 1773e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller 17741196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->br_join[pc->if_lvl]) { 17751196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl]->param.index = pc->p->exec_size; 17761196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->br_join[pc->if_lvl] = NULL; 17771196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 17781196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emit a NOP as join point, we could set it on the next 17791196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * one, but would have to make sure it is long and !immd 17801196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 17811196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_nop(pc); 17821196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 2; 17831196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 1784e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 1785e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller emit_branch(pc, -1, 0, NULL); 1786e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->p->exec_tail->param.index = pc->loop_pos[--pc->loop_lvl]; 1787e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller pc->br_loop[pc->loop_lvl]->param.index = pc->p->exec_size; 1788e2b8dc3e38d1efddf2ded2e47a9e3092455d0f8aChristoph Bumiller break; 17892a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_EX2: 17907b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_preex2(pc, temp, src[0][0]); 179181de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 6, brdc, temp); 17922a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1793b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FLR: 1794b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 1795b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 1796b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 1797b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, dst[c], src[0][c]); 1798b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 1799b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 1800b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs case TGSI_OPCODE_FRC: 18019417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 1802b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs for (c = 0; c < 4; c++) { 1803b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs if (!(mask & (1 << c))) 1804b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs continue; 1805b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_flr(pc, temp, src[0][c]); 1806b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs emit_sub(pc, dst[c], src[0][c], temp); 1807b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs } 1808b4f7463585071236d633e4c857dbbdf67b03dc94Ben Skeggs break; 18091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller case TGSI_OPCODE_IF: 18101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* emitting a join_at may not be necessary */ 18111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(pc->if_lvl < MAX_IF_DEPTH); 18121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller set_pred_wr(pc, 1, 0, pc->if_cond); 18131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_branch(pc, 0, 2, &pc->br_join[pc->if_lvl]); 18141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->if_insn[pc->if_lvl++] = pc->p->exec_tail; 18151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller break; 1816d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs case TGSI_OPCODE_KIL: 1817d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][0]); 1818d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][1]); 1819d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][2]); 1820d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs emit_kil(pc, src[0][3]); 1821d2442016afdc5e3b12b04d912f005ab183f7b8ffBen Skeggs break; 182201e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs case TGSI_OPCODE_LIT: 18237b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_lit(pc, &dst[0], mask, &src[0][0]); 182401e36eb531dfb4b1b3fd38d3fc00c6770833b5eaBen Skeggs break; 18252a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_LG2: 182681de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 3, brdc, src[0][0]); 18272a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 182821e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs case TGSI_OPCODE_LRP: 1829229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller temp = temp_temp(pc); 183021e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs for (c = 0; c < 4; c++) { 183121e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs if (!(mask & (1 << c))) 183221e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs continue; 1833229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_sub(pc, temp, src[1][c], src[2][c]); 1834229992d2812581ffae24d69a5a983d2c8441f720Christoph Bumiller emit_mad(pc, dst[c], temp, src[0][c], src[2][c]); 183521e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs } 183621e688e0a3faeef18b07c4d860bd71cc6e3ddf4aBen Skeggs break; 18372a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MAD: 18387df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18397df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18407df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 18412a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mad(pc, dst[c], src[0][c], src[1][c], src[2][c]); 18427df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 18432a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 184452a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MAX: 18457df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18467df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18477df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 184852a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 4, dst[c], src[0][c], src[1][c]); 18497df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 185052a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 185152a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs case TGSI_OPCODE_MIN: 18527df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18537df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18547df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 185552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs emit_minmax(pc, 5, dst[c], src[0][c], src[1][c]); 18567df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 185752a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs break; 1858f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_MOV: 1859a82cd55a5cb1ad617960551560b107edffad1e9aBen Skeggs case TGSI_OPCODE_SWZ: 18607df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18617df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18627df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 186355b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs emit_mov(pc, dst[c], src[0][c]); 18647df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 186538ce697e5942550888c28bd4859ca2a92f247bf7Ben Skeggs break; 18662a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_MUL: 18677df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 18687df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 18697df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 18702a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_mul(pc, dst[c], src[0][c], src[1][c]); 18717df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 18722a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1873ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs case TGSI_OPCODE_POW: 187481de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_pow(pc, brdc, src[0][0], src[1][0]); 1875ea4b09cbcbd9db82648ab30f18c0f46a66ab9f69Ben Skeggs break; 18762a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RCP: 187781de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 0, brdc, src[0][0]); 18782a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 18792a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_RSQ: 188081de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_flop(pc, 2, brdc, src[0][0]); 18812a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 18827b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs case TGSI_OPCODE_SCS: 18839417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 188481de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (mask & 3) 188581de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_precossin(pc, temp, src[0][0]); 18867b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 0)) 18877b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 5, dst[0], temp); 18887b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs if (mask & (1 << 1)) 18897b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs emit_flop(pc, 4, dst[1], temp); 18904a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 2)) 18914a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[2], 0.0); 18924a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 18934a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 18947b7df34781844c39998d60bbb60880d960da3fb1Ben Skeggs break; 18952a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SIN: 1896e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (mask & 8) { 1897e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][3]); 1898e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, dst[3], temp); 1899e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (!(mask &= 7)) 1900e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller break; 1901e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller if (temp == dst[3]) 1902e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller temp = brdc = temp_temp(pc); 19037df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 1904e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_precossin(pc, temp, src[0][0]); 1905e774b3c0f24c2dd5cd33c09fc7be7601371317ccChristoph Bumiller emit_flop(pc, 4, brdc, temp); 19062a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1907bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs case TGSI_OPCODE_SLT: 19082b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGE: 19092b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SEQ: 19102b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SGT: 19112b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SLE: 19122b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller case TGSI_OPCODE_SNE: 19132b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller i = map_tgsi_setop_cc(inst->Instruction.Opcode); 1914bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs for (c = 0; c < 4; c++) { 1915bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs if (!(mask & (1 << c))) 1916bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs continue; 19172b963f5c723401aa2646bd48eefe065cd335e280Christoph Bumiller emit_set(pc, i, dst[c], -1, src[0][c], src[1][c]); 1918bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs } 1919bdd31c20abb27665ca701a5a46e29d4cfa71f679Ben Skeggs break; 19202a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs case TGSI_OPCODE_SUB: 19217df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs for (c = 0; c < 4; c++) { 19227df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs if (!(mask & (1 << c))) 19237df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs continue; 19242a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs emit_sub(pc, dst[c], src[0][c], src[1][c]); 19257df7f7bb99441ed8e2fba2840e0459e72691f272Ben Skeggs } 19262a1fb44d75364f2492a1ae5d232218a92b8ca807Ben Skeggs break; 1927c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_OPCODE_TEX: 19283accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 19293accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller inst->InstructionExtTexture.Texture, FALSE); 19303accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller break; 19315696267efd6f85d79f5fe511d1a066a17c4d1cccBen Skeggs case TGSI_OPCODE_TXP: 19323accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller emit_tex(pc, dst, mask, src[0], unit, 19333accd7ebe971624bed5624f73ed3522c9de4c193Christoph Bumiller inst->InstructionExtTexture.Texture, TRUE); 1934c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 1935849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller case TGSI_OPCODE_TRUNC: 1936849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller for (c = 0; c < 4; c++) { 1937849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller if (!(mask & (1 << c))) 1938849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller continue; 1939849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller emit_cvt(pc, dst[c], src[0][c], -1, 1940ef6805710d5c1b139695704051754f39654c8a2eChristoph Bumiller CVTOP_TRUNC, CVT_F32_F32 | CVT_RI); 1941849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller } 1942849885c7a6f44d96d74d9c5cd178a7bd2dd164ceChristoph Bumiller break; 194321e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs case TGSI_OPCODE_XPD: 19449417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller temp = temp_temp(pc); 19459a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 0)) { 19469a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][2], src[1][1]); 19479a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[0], src[0][1], src[1][2], temp); 19489a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 19499a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 1)) { 19509a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][0], src[1][2]); 19519a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[1], src[0][2], src[1][0], temp); 19529a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 19539a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs if (mask & (1 << 2)) { 19549a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_mul(pc, temp, src[0][1], src[1][0]); 19559a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs emit_msb(pc, dst[2], src[0][0], src[1][1], temp); 19569a37a56c8ab8c64bdadb1e1e807f885d6a5e3121Ben Skeggs } 19574a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller if (mask & (1 << 3)) 19584a7cf8f66ff5d7e15ae7f8f5542f27bc72c68709Christoph Bumiller emit_mov_immdval(pc, dst[3], 1.0); 195921e18e2b74d71c93af06ef4c603ca371c4614237Ben Skeggs break; 1960f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_OPCODE_END: 1961f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 1962f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 1963f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("invalid opcode %d\n", inst->Instruction.Opcode); 1964f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 1965f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 1966f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 196781de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (brdc) { 196881de711fc864247419221d700bd045addf22cb52Christoph Bumiller if (sat) 196981de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_sat(pc, brdc, brdc); 197081de711fc864247419221d700bd045addf22cb52Christoph Bumiller for (c = 0; c < 4; c++) 197181de711fc864247419221d700bd045addf22cb52Christoph Bumiller if ((mask & (1 << c)) && dst[c] != brdc) 197281de711fc864247419221d700bd045addf22cb52Christoph Bumiller emit_mov(pc, dst[c], brdc); 197381de711fc864247419221d700bd045addf22cb52Christoph Bumiller } else 1974688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (sat) { 1975688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs for (c = 0; c < 4; c++) { 1976688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs if (!(mask & (1 << c))) 1977688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs continue; 1978234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* in this case we saturate later */ 1979234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (dst[c]->type == P_TEMP && dst[c]->index < 0) 1980234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 1981234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, rdst[c], dst[c]); 1982688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1983688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs } 1984688064236ba8b5997014493eb6c6e3fe0739813eBen Skeggs 19859417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 19869417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller for (c = 0; c < 4; c++) { 19879417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (!src[i][c]) 19889417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller continue; 1989f204eb184237b387432413212a3a20d83c87594bChristoph Bumiller src[i][c]->neg = 0; 19909417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (src[i][c]->index == -1 && src[i][c]->type == P_IMMD) 19919417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(src[i][c]); 19929417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 19939417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller } 19949417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 199552a69196c1680ff16d1ad1fc88e5869bc6055d00Ben Skeggs kill_temp_temp(pc); 1996f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return TRUE; 1997f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 1998f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 1999bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumillerstatic void 200038849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerprep_inspect_insn(struct nv50_pc *pc, const struct tgsi_full_instruction *insn) 2001bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller{ 200238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller struct nv50_reg *reg = NULL; 2003bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_full_src_register *src; 2004bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller const struct tgsi_dst_register *dst; 200538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned i, c, k, mask; 2006bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2007bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller dst = &insn->FullDstRegisters[0].DstRegister; 2008bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller mask = dst->WriteMask; 2009bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 201038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_TEMPORARY) 201138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 201238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 201338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (dst->File == TGSI_FILE_OUTPUT) 201438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->result; 2015bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 201638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (reg) { 2017bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2018bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2019bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 202038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[dst->Index * 4 + c].acc = pc->insn_nr; 2021bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2022bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2023bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2024bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2025bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller src = &insn->FullSrcRegisters[i]; 2026bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 202738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) 202838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->temp; 202938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 203038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (src->SrcRegister.File == TGSI_FILE_INPUT) 203138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg = pc->attr; 203238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller else 2033bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2034bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 20355d141b3e3e4a6874a58c893b3039f5c276cd26daChristoph Bumiller mask = nv50_tgsi_src_mask(insn, i); 2036bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 2037bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller for (c = 0; c < 4; c++) { 2038bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller if (!(mask & (1 << c))) 2039bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller continue; 2040bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller k = tgsi_util_get_full_src_register_extswizzle(src, c); 204138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 204238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (k > TGSI_EXTSWIZZLE_W) 204338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller continue; 204438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 204538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller reg[src->SrcRegister.Index * 4 + k].acc = pc->insn_nr; 2046bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2047bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller } 2048bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller} 2049bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller 20502da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Returns a bitmask indicating which dst components need to be 20512da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * written to temporaries first to avoid 'corrupting' sources. 20522da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 20532da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * m[i] (out) indicate component to write in the i-th position 20542da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * rdep[c] (in) bitmasks of dst[i] that require dst[c] as source 20552da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 20562da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic unsigned 20572da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillernv50_revdep_reorder(unsigned m[4], unsigned rdep[4]) 20582da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 20592da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsigned i, c, x, unsafe; 20602da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20612da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 4; c++) 20622da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = c; 20632da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20642da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* Swap as long as a dst component written earlier is depended on 20652da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * by one written later, but the next one isn't depended on by it. 20662da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 20672da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = 0; c < 3; c++) { 20682da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c + 1]] & (1 << m[c])) 20692da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; /* if next one is depended on by us */ 20702da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = c + 1; i < 4; i++) 20712da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* if we are depended on by a later one */ 20722da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[c]] & (1 << m[i])) 20732da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller break; 20742da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (i == 4) 20752da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller continue; 20762da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* now, swap */ 20772da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller x = m[c]; 20782da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c] = m[c + 1]; 20792da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller m[c + 1] = x; 20802da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20812da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* restart */ 20822da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller c = 0; 20832da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 20842da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20852da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* mark dependencies that could not be resolved by reordering */ 20862da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (i = 0; i < 3; ++i) 20872da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller for (c = i + 1; c < 4; ++c) 20882da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (rdep[m[i]] & (1 << m[c])) 20892da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller unsafe |= (1 << i); 20902da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20912da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller /* NOTE: $unsafe is with respect to order, not component */ 20922da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return unsafe; 20932da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 20942da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 20952da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller/* Select a suitable dst register for broadcasting scalar results, 20962da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * or return NULL if we have to allocate an extra TEMP. 20972da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * 20982da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * If e.g. only 1 component is written, we may also emit the final 20992da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller * result to a write-only register. 21002da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller */ 21012da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillerstatic struct nv50_reg * 21022da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumillertgsi_broadcast_dst(struct nv50_pc *pc, 21032da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller const struct tgsi_full_dst_register *fd, unsigned mask) 21042da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller{ 21052da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (fd->DstRegister.File == TGSI_FILE_TEMPORARY) { 21062da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(~mask & fd->DstRegister.WriteMask); 21072da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if (c) 21082da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c - 1, fd); 21092da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } else { 21102da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller int c = ffs(fd->DstRegister.WriteMask) - 1; 21112da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller if ((1 << c) == fd->DstRegister.WriteMask) 21122da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return tgsi_dst(pc, c, fd); 21132da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller } 21142da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 21152da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller return NULL; 21162da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller} 21172da8608ad795d29fe7a908eaee3d6dd33e829f3eChristoph Bumiller 2118234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller/* Scan source swizzles and return a bitmask indicating dst regs that 2119234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller * also occur among the src regs, and fill rdep for nv50_revdep_reoder. 2120234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller */ 2121234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic unsigned 2122234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_scan_swizzle(const struct tgsi_full_instruction *insn, 2123234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned rdep[4]) 2124234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2125234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd = &insn->FullDstRegisters[0]; 2126234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_src_register *fs; 2127234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs = 0; 2128234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2129234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) 2130234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[i] = 0; 2131234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2132234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < insn->Instruction.NumSrcRegs; i++) { 2133234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned chn, mask = nv50_tgsi_src_mask(insn, i); 2134234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller boolean neg_supp = negate_supported(insn, i); 2135234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2136234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fs = &insn->FullSrcRegisters[i]; 2137234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (fs->SrcRegister.File != fd->DstRegister.File || 2138234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fs->SrcRegister.Index != fd->DstRegister.Index) 2139234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2140234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2141234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (chn = 0; chn < 4; ++chn) { 2142234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned s, c; 2143234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2144234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!(mask & (1 << chn))) /* src is not read */ 2145234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2146234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller c = tgsi_util_get_full_src_register_extswizzle(fs, chn); 2147234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller s = tgsi_util_get_full_src_register_sign_mode(fs, chn); 2148234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2149234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (c > TGSI_EXTSWIZZLE_W || 2150234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller !(fd->DstRegister.WriteMask & (1 << c))) 2151234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2152234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2153234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller /* no danger if src is copied to TEMP first */ 2154234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if ((s != TGSI_UTIL_SIGN_KEEP) && 2155234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller (s != TGSI_UTIL_SIGN_TOGGLE || !neg_supp)) 2156234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2157234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2158234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller rdep[c] |= nv50_tgsi_dst_revdep( 2159234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn->Instruction.Opcode, i, chn); 2160234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs |= (1 << c); 2161234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2162234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2163234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2164234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return deqs; 2165234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2166234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2167234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillerstatic boolean 2168234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumillernv50_tgsi_insn(struct nv50_pc *pc, const union tgsi_full_token *tok) 2169234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller{ 2170234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct tgsi_full_instruction insn = tok->FullInstruction; 2171234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller const struct tgsi_full_dst_register *fd; 2172234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller unsigned i, deqs, rdep[4], m[4]; 2173234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2174234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fd = &tok->FullInstruction.FullDstRegisters[0]; 2175234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_tgsi_scan_swizzle(&insn, rdep); 2176234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2177234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (is_scalar_op(insn.Instruction.Opcode)) { 2178234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = tgsi_broadcast_dst(pc, fd, deqs); 2179234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!pc->r_brdc) 2180234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = temp_temp(pc); 2181234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2182234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2183234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_brdc = NULL; 2184234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2185234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!deqs) 2186234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return nv50_program_tx_insn(pc, &insn); 2187234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2188234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller deqs = nv50_revdep_reorder(m, rdep); 2189234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2190234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; ++i) { 2191234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller assert(pc->r_dst[m[i]] == NULL); 2192234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2193234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller insn.FullDstRegisters[0].DstRegister.WriteMask = 2194234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller fd->DstRegister.WriteMask & (1 << m[i]); 2195234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2196234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!insn.FullDstRegisters[0].DstRegister.WriteMask) 2197234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2198234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2199234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (deqs & (1 << i)) 2200234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[m[i]] = alloc_temp(pc, NULL); 2201234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2202234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!nv50_program_tx_insn(pc, &insn)) 2203234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return FALSE; 2204234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2205234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2206234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller for (i = 0; i < 4; i++) { 2207234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller struct nv50_reg *reg = pc->r_dst[i]; 2208234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (!reg) 2209234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller continue; 2210234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller pc->r_dst[i] = NULL; 2211234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2212234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller if (insn.Instruction.Saturate == TGSI_SAT_ZERO_ONE) 2213234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_sat(pc, tgsi_dst(pc, i, fd), reg); 2214234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller else 2215234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller emit_mov(pc, tgsi_dst(pc, i, fd), reg); 2216234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller free_temp(pc, reg); 2217234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller } 2218234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 2219234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller return TRUE; 2220234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller} 2221234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller 22226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic void 22236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerload_interpolant(struct nv50_pc *pc, struct nv50_reg *reg) 2224dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller{ 22256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_reg *iv, **ppiv; 22266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned mode = pc->interp_mode[reg->index]; 2227dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ppiv = (mode & INTERP_CENTROID) ? &pc->iv_c : &pc->iv_p; 22296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv; 2230dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if ((mode & INTERP_PERSPECTIVE) && !iv) { 22326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv = *ppiv = alloc_temp(pc, NULL); 22336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller iv->rhw = popcnt4(pc->p->cfg.regs[1] >> 24) - 1; 2234dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, iv, NULL, mode & INTERP_CENTROID); 22366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_flop(pc, 0, iv, iv); 2237dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* XXX: when loading interpolants dynamically, move these 22396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * to the program head, or make sure it can't be skipped. 22406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 2241dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2242dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller emit_interp(pc, reg, iv, mode); 2244dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller} 2245dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 2246f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 2247f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx_prep(struct nv50_pc *pc) 2248f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 22496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct tgsi_parse_context tp; 22506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *p = pc->p; 2251f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret = FALSE; 22526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned i, c, flat_nr = 0; 2253dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 22546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_init(&tp, pc->p->pipe.tokens); 22556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller while (!tgsi_parse_end_of_tokens(&tp)) { 22566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller const union tgsi_full_token *tok = &tp.FullToken; 2257f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 22586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_token(&tp); 2259f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2260f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_IMMEDIATE: 2261f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2262f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_immediate *imm = 22636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller &tp.FullToken.FullImmediate; 2264f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2265fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell ctor_immd(pc, imm->u[0].Float, 2266fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[1].Float, 2267fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[2].Float, 2268fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell imm->u[3].Float); 2269f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2270f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2271f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_DECLARATION: 2272f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs { 2273f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const struct tgsi_full_declaration *d; 22746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned si, last, first, mode; 2275f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 22766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller d = &tp.FullToken.FullDeclaration; 2277e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller first = d->DeclarationRange.First; 2278bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs last = d->DeclarationRange.Last; 2279f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2280f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (d->Declaration.File) { 2281f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_TEMPORARY: 2282f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2283f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_OUTPUT: 22846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!d->Declaration.Semantic || 22856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->type == PIPE_SHADER_FRAGMENT) 22866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 22876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 22886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller si = d->Semantic.SemanticIndex; 22896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller switch (d->Semantic.SemanticName) { 22904d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller case TGSI_SEMANTIC_BCOLOR: 22914d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[si].hw = first; 22924d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.io_nr > first) 22934d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.io_nr = first; 22944d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller break; 229506dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller case TGSI_SEMANTIC_PSIZE: 229606dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = first; 229706dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.io_nr > first) 229806dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.io_nr = first; 229906dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller break; 23006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* 23016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller case TGSI_SEMANTIC_CLIP_DISTANCE: 23026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = MIN2(p->cfg.clpd, first); 23036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 23046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 23056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller default: 23066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller break; 23076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2308f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2309f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_INPUT: 2310e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller { 23116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type != PIPE_SHADER_FRAGMENT) 2312e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2313e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2314e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller switch (d->Declaration.Interpolate) { 2315e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 2316e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_FLAT; 23176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller flat_nr++; 2318e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2319e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller case TGSI_INTERPOLATE_PERSPECTIVE: 2320e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_PERSPECTIVE; 23216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= 0x08 << 24; 2322e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2323e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller default: 2324e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode = INTERP_LINEAR; 2325e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller break; 2326e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 23276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (d->Declaration.Centroid) 2328e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller mode |= INTERP_CENTROID; 2329e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller 2330e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller assert(last < 32); 2331e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller for (i = first; i <= last; i++) 2332e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller pc->interp_mode[i] = mode; 2333e88ec312df000ac335d9bba6b75d836dfa1a1043Christoph Bumiller } 2334f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2335f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_FILE_CONSTANT: 2336f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2337c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs case TGSI_FILE_SAMPLER: 2338c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs break; 2339f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2340f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs NOUVEAU_ERR("bad decl file %d\n", 2341f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs d->Declaration.File); 2342f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2343f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2344f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2345f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2346f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2347bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller pc->insn_nr++; 234838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller prep_inspect_insn(pc, &tok->FullInstruction); 2349f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2350f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2351f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2352f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2353f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2354f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 23556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_VERTEX) { 23566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid = 0; 23578ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 23586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) { 23596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->attr[i].acc) { 23606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i].hw = rid++; 23616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.attr[i / 32] |= 1 << (i % 32); 2362f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 23636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 23646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 23656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0, rid = 0; i < pc->result_nr; ++i) { 23666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].hw = rid; 23676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].id_vp = i; 23688ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 23696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 23706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int n = i * 4 + c; 23716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->result[n].acc) 23726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 23736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[n].hw = rid++; 23746516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[i].mask |= 1 << c; 2375dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 23766516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 23774d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 23784d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller for (c = 0; c < 2; ++c) 23794d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (p->cfg.two_side[c].hw < 0x40) 23804d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c] = p->cfg.io[ 23814d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller p->cfg.two_side[c].hw]; 238206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 238306dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (p->cfg.psiz < 0x40) 238406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = p->cfg.io[p->cfg.psiz].hw; 23856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 23866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->type == PIPE_SHADER_FRAGMENT) { 23876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int rid, aid; 23886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller unsigned n = 0, m = pc->attr_nr - flat_nr; 23896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 23906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int base = (TGSI_SEMANTIC_POSITION == 23916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->info.input_semantic_name[0]) ? 0 : 1; 23928ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 23936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* non-flat interpolants have to be mapped to 23946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * the lower hardware IDs, so sort them: 23956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 23966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 23976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->interp_mode[i] == INTERP_FLAT) { 23986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m].id_vp = i + base; 23996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[m++].id_fp = i; 24006516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else { 24016516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!(pc->interp_mode[i] & INTERP_PERSPECTIVE)) 24026516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].linear = TRUE; 24036516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].id_vp = i + base; 24046516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n++].id_fp = i; 2405dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 24066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2407dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) /* set w-coordinate mask from perspective interp */ 24096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[0].mask |= p->cfg.regs[1] >> 24; 24108ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs 24116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid = popcnt4( /* if fcrd isn't contained in cfg.io */ 24126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller base ? (p->cfg.regs[1] >> 24) : p->cfg.io[0].mask); 2413dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller 24146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (n = 0; n < pc->attr_nr; ++n) { 24156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].hw = rid = aid; 24166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[n].id_fp; 24176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 24196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!pc->attr[i * 4 + c].acc) 24206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller continue; 24216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->attr[i * 4 + c].rhw = rid++; 24226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io[n].mask |= 1 << c; 24236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller load_interpolant(pc, &pc->attr[i * 4 + c]); 2425dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 24266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller aid += popcnt4(p->cfg.io[n].mask); 2427dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller } 2428f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 24296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (!base) 24306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.io[0].mask << 24; 24316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = popcnt4(p->cfg.regs[1] >> 24); 24336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* set count of non-position inputs and of non-flat 24356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * non-position inputs for FP_INTERPOLANT_CTRL 24366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 24376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= aid - m; 24386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (flat_nr) { 24406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->cfg.io[pc->attr_nr - flat_nr].hw; 24416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= (i - m) << 16; 24426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } else 24436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[1] |= p->cfg.regs[1] << 16; 24446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* mark color semantic for light-twoside */ 24466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = 0x40; 24476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (i = 0; i < pc->attr_nr; i++) { 24486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si, sn; 2449f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 24506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller sn = p->info.input_semantic_name[p->cfg.io[i].id_fp]; 24516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller si = p->info.input_semantic_index[p->cfg.io[i].id_fp]; 24526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (sn == TGSI_SEMANTIC_COLOR) { 24546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si] = p->cfg.io[i]; 24556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* increase colour count */ 24576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += popcnt4( 24586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[si].mask) << 16; 24596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = MIN2(n, p->cfg.io[i].hw - m); 24616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 2462f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 24636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n < 0x40) 24646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] += n; 24656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* Initialize FP results: 24676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller * FragDepth is always first TGSI and last hw output 24686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller */ 24696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = p->info.writes_z ? 4 : 0; 24706516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (rid = 0; i < pc->result_nr * 4; i++) 24716516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[i].rhw = rid++; 24726516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (p->info.writes_z) 24736516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller pc->result[2].rhw = rid; 24741196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 24751196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller p->cfg.high_result = rid; 2476f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2477f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2478f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (pc->immd_nr) { 247994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller int rid = 0; 2480f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2481e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller pc->immd = MALLOC(pc->immd_nr * 4 * sizeof(struct nv50_reg)); 2482f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc->immd) 2483f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2484f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2485f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs for (i = 0; i < pc->immd_nr; i++) { 2486e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller for (c = 0; c < 4; c++, rid++) 2487e0951797cb2b356e64494e121e46fa3e00e25cf6Christoph Bumiller ctor_reg(&pc->immd[rid], P_IMMD, i, rid); 2488f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2489f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2490f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2491f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = TRUE; 2492f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 24936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_p) 24946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_p); 24956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (pc->iv_c) 24966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller free_temp(pc, pc->iv_c); 24976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 24986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller tgsi_parse_free(&tp); 2499f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2500f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2501f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 25029417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerstatic void 25039417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumillerfree_nv50_pc(struct nv50_pc *pc) 25049417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller{ 25059417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->immd) 25069417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->immd); 25079417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->param) 25089417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->param); 25099417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->result) 25109417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->result); 25119417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->attr) 25129417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->attr); 25139417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller if (pc->temp) 25149417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc->temp); 25159417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 25169417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller FREE(pc); 25179417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller} 25189417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller 2519f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic boolean 252038849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerctor_nv50_pc(struct nv50_pc *pc, struct nv50_program *p) 252138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller{ 252238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int i, c; 252338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned rtype[2] = { P_ATTR, P_RESULT }; 252438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 252538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->p = p; 252638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp_nr = p->info.file_max[TGSI_FILE_TEMPORARY] + 1; 252738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr_nr = p->info.file_max[TGSI_FILE_INPUT] + 1; 252838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result_nr = p->info.file_max[TGSI_FILE_OUTPUT] + 1; 252938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param_nr = p->info.file_max[TGSI_FILE_CONSTANT] + 1; 253038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 253138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller p->cfg.high_temp = 4; 253238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 25336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[0].hw = 0x40; 25346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.two_side[1].hw = 0x40; 25356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 253638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller switch (p->type) { 253738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_VERTEX: 253806dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller p->cfg.psiz = 0x40; 25396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.clpd = 0x40; 25406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->result_nr; 254138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 254238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller case PIPE_SHADER_FRAGMENT: 254338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller rtype[0] = rtype[1] = P_TEMP; 254438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 25456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[0] = 0x01000004; 25466516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.io_nr = pc->attr_nr; 25476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 254838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.writes_z) { 25496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00000100; 25506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[3] |= 0x00000011; 255138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 255238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (p->info.uses_kill) 25536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller p->cfg.regs[2] |= 0x00100000; 255438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller break; 255538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 255638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 255738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->temp_nr) { 255838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->temp = MALLOC(pc->temp_nr * 4 * sizeof(struct nv50_reg)); 255938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->temp) 256038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 256138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 256238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->temp_nr * 4; ++i) 256338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->temp[i], P_TEMP, i / 4, -1); 256438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 256538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 256638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->attr_nr) { 256738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->attr = MALLOC(pc->attr_nr * 4 * sizeof(struct nv50_reg)); 256838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->attr) 256938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 257038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 257138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->attr_nr * 4; ++i) 257238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->attr[i], rtype[0], i / 4, -1); 257338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 257438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 257538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->result_nr) { 257638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller unsigned nr = pc->result_nr * 4; 257738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 257838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->result = MALLOC(nr * sizeof(struct nv50_reg)); 257938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->result) 258038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 258138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 258238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < nr; ++i) 258338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->result[i], rtype[1], i / 4, -1); 258438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 258538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 258638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (pc->param_nr) { 258738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller int rid = 0; 258838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 258938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller pc->param = MALLOC(pc->param_nr * 4 * sizeof(struct nv50_reg)); 259038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (!pc->param) 259138849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return FALSE; 259238849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 259338849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (i = 0; i < pc->param_nr; ++i) 259438849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller for (c = 0; c < 4; ++c, ++rid) 259538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ctor_reg(&pc->param[rid], P_CONST, i, rid); 259638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller } 259738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 259838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller return TRUE; 259938849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller} 260038849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 26011196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 26021196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_fp_move_results(struct nv50_pc *pc) 26031196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 26041196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_reg reg; 26051196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i; 26061196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ctor_reg(®, P_TEMP, -1, -1); 26081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26091196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < pc->result_nr * 4; ++i) { 26101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw < 0 || pc->result[i].hw < 0) 26111196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 26121196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->result[i].rhw != pc->result[i].hw) { 26131196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller reg.hw = pc->result[i].rhw; 26141196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller emit_mov(pc, ®, &pc->result[i]); 26151196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 26161196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 26171196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 26181196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26191196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillerstatic void 26201196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumillernv50_program_fixup_insns(struct nv50_pc *pc) 26211196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller{ 26221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller struct nv50_program_exec *e, *prev = NULL, **bra_list; 26231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller unsigned i, n, pos; 26241196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list = CALLOC(pc->p->exec_size, sizeof(struct nv50_program_exec *)); 26261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Collect branch instructions, we need to adjust their offsets 26281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller * when converting 32 bit instructions to 64 bit ones 26291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller */ 26301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (n = 0, e = pc->p->exec_head; e; e = e->next) 26311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.index >= 0 && !e->param.mask) 26321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[n++] = e; 26331196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26341196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* Make sure we don't have any single 32 bit instructions. */ 26351196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (e = pc->p->exec_head, pos = 0; e; e = e->next) { 26361196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pos += is_long(e) ? 2 : 1; 26371196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26381196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if ((pos & 1) && (!e->next || is_long(e->next))) { 26391196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller for (i = 0; i < n; ++i) 26401196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (bra_list[i]->param.index >= pos) 26411196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller bra_list[i]->param.index += 1; 26421196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, e); 26431196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ++pos; 26441196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 26451196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->next) 26461196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller prev = e; 26471196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 26481196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26491196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_head)); 26501196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!is_immd(pc->p->exec_tail)); 26511196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26521196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* last instruction must be long so it can have the end bit set */ 26531196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (!is_long(pc->p->exec_tail)) { 26541196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, pc->p->exec_tail); 26551196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (prev) 26561196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller convert_to_long(pc, prev); 26571196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 26581196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(pc->p->exec_tail->inst[1] & 2)); 26591196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* set the end-bit */ 26601196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller pc->p->exec_tail->inst[1] |= 1; 26611196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 26621196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller FREE(bra_list); 26631196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller} 26641196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 266538849c529e76b99f56f522be183a5935d617bcabChristoph Bumillerstatic boolean 2666f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_tx(struct nv50_program *p) 2667f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2668f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct tgsi_parse_context parse; 2669f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_pc *pc; 2670f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs boolean ret; 2671f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2672f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs pc = CALLOC_STRUCT(nv50_pc); 2673f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!pc) 2674f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return FALSE; 267538849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller 267638849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller ret = ctor_nv50_pc(pc, p); 267738849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller if (ret == FALSE) 267838849c529e76b99f56f522be183a5935d617bcabChristoph Bumiller goto out_cleanup; 2679f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2680f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs ret = nv50_program_tx_prep(pc); 2681f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2682f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_cleanup; 2683f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2684f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_init(&parse, pc->p->pipe.tokens); 2685f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs while (!tgsi_parse_end_of_tokens(&parse)) { 2686f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs const union tgsi_full_token *tok = &parse.FullToken; 2687f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2688d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller /* don't allow half insn/immd on first and last instruction */ 2689d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = TRUE; 2690d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller if (pc->insn_cur == 0 || pc->insn_cur + 2 == pc->insn_nr) 2691d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller pc->allow32 = FALSE; 2692d015cba88f1ef217f6ef9d116ba6abb32e043baaChristoph Bumiller 2693f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_token(&parse); 2694f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2695f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs switch (tok->Token.Type) { 2696f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs case TGSI_TOKEN_TYPE_INSTRUCTION: 2697bcecb8ff66d2c002ac1273c0a9e9b2b9f9d3d43eChristoph Bumiller ++pc->insn_cur; 2698234d82ed632f8b53eec805383874de4fd00eff2aChristoph Bumiller ret = nv50_tgsi_insn(pc, tok); 2699f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (ret == FALSE) 2700f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs goto out_err; 2701f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2702f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs default: 2703f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs break; 2704f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2705f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2706f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 27071196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (pc->p->type == PIPE_SHADER_FRAGMENT) 27081196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_fp_move_results(pc); 270944b3bfaa7599add72d76b3802ddea05b5b5c6316Christoph Bumiller 27101196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller nv50_program_fixup_insns(pc); 271140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 2712aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs p->param_nr = pc->param_nr * 4; 2713f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd_nr = pc->immd_nr * 4; 2714f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->immd = pc->immd_buf; 2715f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2716f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_err: 2717f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs tgsi_parse_free(&parse); 2718f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2719f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsout_cleanup: 27209417582f39788476e1039df3f1bdf681686fb7b4Christoph Bumiller free_nv50_pc(pc); 2721f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs return ret; 2722f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2723f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2724f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsstatic void 2725f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_validate(struct nv50_context *nv50, struct nv50_program *p) 2726f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2727e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs if (nv50_program_tx(p) == FALSE) 2728e55964099b0d47dea80920765daac09b9e2a61a7Ben Skeggs assert(0); 2729f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = TRUE; 2730f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2731f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 273222e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 2733ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsnv50_program_upload_data(struct nv50_context *nv50, float *map, 273494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller unsigned start, unsigned count, unsigned cbuf) 2735ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs{ 273680e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 273775f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 273875f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs 2739ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs while (count) { 2740ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs unsigned nr = count > 2047 ? 2047 : count; 2741ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 274293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 274394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller OUT_RING (chan, (cbuf << 0) | (start << 8)); 274493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 274575f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, map, nr); 2746ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2747ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs map += nr; 2748ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs start += nr; 2749ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs count -= nr; 2750ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs } 2751ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs} 2752ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2753ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggsstatic void 275422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) 275522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 27566b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs struct pipe_screen *pscreen = nv50->pipe.screen; 275722e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 275894ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller if (!p->data[0] && p->immd_nr) { 275994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nouveau_resource *heap = nv50->screen->immd_heap[0]; 276094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 27611b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) { 276294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller while (heap->next && heap->size < p->immd_nr) { 276394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller struct nv50_program *evict = heap->next->priv; 27641b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&evict->data[0]); 276594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 276694ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 27671b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs if (nouveau_resource_alloc(heap, p->immd_nr, p, 27681b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs &p->data[0])) 276994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller assert(0); 277094ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 277194ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 277294ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller /* immediates only need to be uploaded again when freed */ 277394ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller nv50_program_upload_data(nv50, p->immd, p->data[0]->start, 277494ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller p->immd_nr, NV50_CB_PMISC); 277594ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller } 2776aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 2777750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller assert(p->param_nr <= 128); 2778aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 2779aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs if (p->param_nr) { 2780750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned cb; 27816b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type], 27826b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs PIPE_BUFFER_USAGE_CPU_READ); 2783750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 2784750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->type == PIPE_SHADER_VERTEX) 2785750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PVP; 2786750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller else 2787750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller cb = NV50_CB_PFP; 2788750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller 2789750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller nv50_program_upload_data(nv50, map, 0, p->param_nr, cb); 27906b3ca672eb85d30d6c28e91000e2cc2231a41befBen Skeggs pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]); 2791aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 279222e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 279322e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 279422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsstatic void 279522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggsnv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) 279622e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs{ 279780e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 279875f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 279940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e; 2800cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs struct nouveau_stateobj *so; 2801cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs const unsigned flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR; 2802cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs unsigned start, count, *up, *ptr; 2803f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs boolean upload = FALSE; 280422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 2805072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs if (!p->bo) { 2806072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_new(chan->device, NOUVEAU_BO_VRAM, 0x100, 2807072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs p->exec_size * 4, &p->bo); 2808f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs upload = TRUE; 2809f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs } 281040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 2811750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0] && p->data[0]->start != p->data_start[0]) 2812750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller upload = TRUE; 2813ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2814750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (!upload) 2815750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller return; 2816ab3d55e2e3578db8deba84dcf47a024071486bd8Ben Skeggs 2817750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller for (e = p->exec_head; e; e = e->next) { 2818750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller unsigned ei, ci, bs; 28191c7489bd7e5391136d0f2e68b467de89eb2d2bfcBen Skeggs 2820750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (e->param.index < 0) 2821750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller continue; 28221196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28231196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller if (e->param.mask == 0) { 28241196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller assert(!(e->param.index & 1)); 28251196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller /* seem to be 8 byte steps */ 28261196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller ei = (e->param.index >> 1) + 0 /* START_ID */; 28271196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 28281196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] &= 0xf0000fff; 28291196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller e->inst[0] |= ei << 12; 28301196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller continue; 28311196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller } 28321196f9fbd68d9f3d1acd3d097711b382d7489f41Christoph Bumiller 2833750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller bs = (e->inst[1] >> 22) & 0x07; 2834750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller assert(bs < 2); 2835750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ei = e->param.shift >> 5; 2836750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ci = e->param.index; 2837750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (bs == 0) 2838750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller ci += p->data[bs]->start; 283994ba165dffa4d364a1335d3cd7c15558bf35fe3eChristoph Bumiller 2840750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller e->inst[ei] &= ~e->param.mask; 2841750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller e->inst[ei] |= (ci << e->param.shift); 2842aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 2843aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs 2844750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller if (p->data[0]) 2845750c6cae3d6f5b24c0c51537a5717894675645c6Christoph Bumiller p->data_start[0] = p->data[0]->start; 2846f700d6be6335a4d4394296891f783687b6f2d4f2Ben Skeggs 2847b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#ifdef NV50_PROGRAM_DUMP 28480d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("-------\n"); 2849aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs for (e = p->exec_head; e; e = e->next) { 28500d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[0]); 28510d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs if (is_long(e)) 28520d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs NOUVEAU_ERR("0x%08x\n", e->inst[1]); 2853b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs } 2854b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs#endif 28550d54770cabbe034b0f07ab1b211c374d92ce19d4Ben Skeggs 2856b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs up = ptr = MALLOC(p->exec_size * 4); 2857b01d0077af9d93c582e5f53ebd358ac8148b22dfBen Skeggs for (e = p->exec_head; e; e = e->next) { 2858cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs *(ptr++) = e->inst[0]; 2859cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs if (is_long(e)) 2860cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs *(ptr++) = e->inst[1]; 2861cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs } 2862cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 2863e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(4,2); 286493ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, nv50->screen->tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3); 2865072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_HIGH, 0, 0); 2866072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, flags | NOUVEAU_BO_LOW, 0, 0); 2867cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs so_data (so, (NV50_CB_PUPLOAD << 16) | 0x0800); //(p->exec_size * 4)); 2868cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 2869cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs start = 0; count = p->exec_size; 2870cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs while (count) { 287180e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = nv50->screen->base.channel; 2872cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs unsigned nr; 2873cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 287480e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs so_emit(chan, so); 2875cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 2876cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs nr = MIN2(count, 2047); 287780e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs nr = MIN2(chan->pushbuf->remaining, nr); 287880e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs if (chan->pushbuf->remaining < (nr + 3)) { 287975f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs FIRE_RING(chan); 2880cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs continue; 2881aea1669ff221f97682f0be6a60632e40c2739d09Ben Skeggs } 2882cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 288393ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1); 288475f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RING (chan, (start << 8) | NV50_CB_PUPLOAD); 288593ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis BEGIN_RING(chan, tesla, NV50TCL_CB_DATA(0) | 0x40000000, nr); 288675f0b38d9ea4a7318b0d661712dda15e24707395Ben Skeggs OUT_RINGp (chan, up + start, nr); 2887cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 2888cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs start += nr; 2889cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs count -= nr; 289040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs } 2891cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs 2892cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs FREE(up); 2893cae38d0fcc6c936d3a4dc25ca2dbef3d106d05a5Ben Skeggs so_ref(NULL, &so); 289422e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs} 289522e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs 2896f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 2897f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_vertprog_validate(struct nv50_context *nv50) 2898f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2899f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 2900f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->vertprog; 2901f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 2902f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2903f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 2904f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 2905f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 2906f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 2907f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2908f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 290922e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_data(nv50, p); 291022e0acc466947b203574c88f4964f61ef46ae3fdBen Skeggs nv50_program_validate_code(nv50, p); 2911f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2912e002ad77398fbe14a0efbd91824c3325ca09b4c1Ben Skeggs so = so_new(13, 2); 2913f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_VP_ADDRESS_HIGH, 2); 2914072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 2915072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 2916072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 2917072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 291893ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_ATTR_EN_0, 2); 29196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[0]); 29206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.attr[1]); 292193ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_REG_ALLOC_RESULT, 1); 2922fea0b1651677444fc6c135e1a4b8ab6463a9fdf9Ben Skeggs so_data (so, p->cfg.high_result); 292393ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 2); 2924bcbe6baac37915563bc120ad558cd930bc1ddec1Ben Skeggs so_data (so, p->cfg.high_result); //8); 29258ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 292693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_VP_START_ID, 1); 2927f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_data (so, 0); /* program start offset */ 2928bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.vertprog); 2929ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 2930f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2931f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2932f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 2933f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_fragprog_validate(struct nv50_context *nv50) 2934f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 2935f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_grobj *tesla = nv50->screen->tesla; 2936f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nv50_program *p = nv50->fragprog; 2937f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs struct nouveau_stateobj *so; 2938f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2939f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) { 2940f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs nv50_program_validate(nv50, p); 2941f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs if (!p->translated) 2942f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs assert(0); 2943f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 2944f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 294555b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_data(nv50, p); 294655b2fe1047b37d0d86641a252e1c745111030393Ben Skeggs nv50_program_validate_code(nv50, p); 2947f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 2948585ae74d87f3d04a4b5b7c068b865292afd1a16bBen Skeggs so = so_new(64, 2); 2949f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs so_method(so, tesla, NV50TCL_FP_ADDRESS_HIGH, 2); 2950072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 2951072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_HIGH, 0, 0); 2952072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs so_reloc (so, p->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 2953072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs NOUVEAU_BO_LOW, 0, 0); 29546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_REG_ALLOC_TEMP, 1); 29558ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, p->cfg.high_temp); 295693ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_RESULT_COUNT, 1); 2957dd9ded42b9ff75aa0bbabef30d385a9f77851dceChristoph Bumiller so_data (so, p->cfg.high_result); 295893ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK19A8, 1); 29596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[2]); 296093ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_CTRL_UNK196C, 1); 29616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, p->cfg.regs[3]); 296293ce4c99d4c4515b8f8c4e999af53c8196b5f9ebMaarten Maathuis so_method(so, tesla, NV50TCL_FP_START_ID, 1); 29638ec6415e9fcf876c67bc1624f3eb7dd7624b7791Ben Skeggs so_data (so, 0); /* program start offset */ 2964bb9efb5534a652878161e28bd73039eff5b11014Ben Skeggs so_ref(so, &nv50->state.fragprog); 2965ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs so_ref(NULL, &so); 2966f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 2967f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 296801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillerstatic void 296901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumillernv50_pntc_replace(struct nv50_context *nv50, uint32_t pntc[8], unsigned base) 297001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller{ 297101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 297201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 297301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned i, c, m = base; 297401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 297501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* XXX: This can't work correctly in all cases yet, we either 297601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * have to create TGSI_SEMANTIC_PNTC or sprite_coord_mode has 297701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller * to be per FP input instead of per VP output 297801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller */ 297901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller memset(pntc, 0, 8 * sizeof(uint32_t)); 298001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 298101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (i = 0; i < fp->cfg.io_nr; i++) { 298201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t sn, si; 298301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint8_t j = fp->cfg.io[i].id_vp, k = fp->cfg.io[i].id_fp; 298401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller unsigned n = popcnt4(fp->cfg.io[i].mask); 298501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 298601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (fp->info.input_semantic_name[k] != TGSI_SEMANTIC_GENERIC) { 298701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 298801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 298901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 299001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 299101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller sn = vp->info.input_semantic_name[j]; 299201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller si = vp->info.input_semantic_index[j]; 299301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 299401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (j < fp->cfg.io_nr && sn == TGSI_SEMANTIC_GENERIC) { 299501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ubyte mode = 299601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50->rasterizer->pipe.sprite_coord_mode[si]; 299701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 299801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (mode == PIPE_SPRITE_COORD_NONE) { 299901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller m += n; 300001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 300101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 300201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 300301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 300401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller /* this is either PointCoord or replaced by sprite coords */ 300501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller for (c = 0; c < 4; c++) { 300601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (!(fp->cfg.io[i].mask & (1 << c))) 300701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller continue; 300801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller pntc[m / 8] |= (c + 1) << ((m % 8) * 4); 300901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller ++m; 301001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 301101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 301201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller} 301301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 30146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillerstatic int 30156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_sreg4_map(uint32_t *p_map, int mid, uint32_t lin[4], 30166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 *fpi, struct nv50_sreg4 *vpo) 30176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 30186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int c; 30196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t mv = vpo->mask, mf = fpi->mask, oid = vpo->hw; 30206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller uint8_t *map = (uint8_t *)p_map; 30216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < 4; ++c) { 30236516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (mf & 1) { 30246516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fpi->linear == TRUE) 30256516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller lin[mid / 32] |= 1 << (mid % 32); 30266516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[mid++] = (mv & 1) ? oid : ((c == 3) ? 0x41 : 0x40); 30276516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 30286516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30296516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller oid += mv & 1; 30306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mf >>= 1; 30316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller mv >>= 1; 30326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 30336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30346516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller return mid; 30356516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 30366516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30376516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillervoid 30386516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumillernv50_linkage_validate(struct nv50_context *nv50) 30396516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller{ 30406516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_grobj *tesla = nv50->screen->tesla; 30416516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *vp = nv50->vertprog; 30426516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_program *fp = nv50->fragprog; 30436516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nouveau_stateobj *so; 30446516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller struct nv50_sreg4 dummy, *vpo; 30456516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller int i, n, c, m = 0; 304601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller uint32_t map[16], lin[4], reg[5], pcrd[8]; 30476516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30486516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(map, 0, sizeof(map)); 30496516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller memset(lin, 0, sizeof(lin)); 30506516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30516516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = 0x00000004; /* low and high clip distance map ids */ 30526516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[2] = 0x00000000; /* layer index map id (disabled, GP only) */ 30536516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[3] = 0x00000000; /* point size map id & enable */ 30546516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] = fp->cfg.regs[0]; /* colour semantic reg */ 30556516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] = fp->cfg.regs[1]; /* interpolant info */ 30566516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30576516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.linear = FALSE; 30586516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0xf; /* map all components of HPOS */ 30596516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &dummy, &vp->cfg.io[0]); 30606516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30616516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller dummy.mask = 0x0; 30626516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30636516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (vp->cfg.clpd < 0x40) { 30646516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (c = 0; c < vp->cfg.clpd_nr; ++c) 30656516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller map[m++] = vp->cfg.clpd + c; 30666516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[1] = (m << 8); 30676516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 30686516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30696516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] |= m << 8; /* adjust BFC0 id */ 30704d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 30714d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller /* if light_twoside is active, it seems FFC0_ID == BFC0_ID is bad */ 30724d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller if (nv50->rasterizer->pipe.light_twoside) { 30734d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller vpo = &vp->cfg.two_side[0]; 30744d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 30754d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[0], &vpo[0]); 30764d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[1], &vpo[1]); 30774d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller } 30784d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller 30796516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[0] += m - 4; /* adjust FFC0 id */ 30806516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller reg[4] |= m << 8; /* set mid where 'normal' FP inputs start */ 30816516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30826516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 0; 30836516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (fp->info.input_semantic_name[0] == TGSI_SEMANTIC_POSITION) 30846516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller i = 1; 30856516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller for (; i < fp->cfg.io_nr; i++) { 30866516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte sn = fp->info.input_semantic_name[fp->cfg.io[i].id_fp]; 30876516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller ubyte si = fp->info.input_semantic_index[fp->cfg.io[i].id_fp]; 30886516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30896516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = fp->cfg.io[i].id_vp; 30906516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller if (n >= vp->cfg.io_nr || 30916516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_name[n] != sn || 30926516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vp->info.output_semantic_index[n] != si) 30936516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &dummy; 30946516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller else 30956516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller vpo = &vp->cfg.io[n]; 30966516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 30976516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller m = nv50_sreg4_map(map, m, lin, &fp->cfg.io[i], vpo); 30986516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller } 30996516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 310006dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller if (nv50->rasterizer->pipe.point_size_per_vertex) { 310106dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller map[m / 4] |= vp->cfg.psiz << ((m % 4) * 8); 310206dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller reg[3] = (m++ << 4) | 1; 310306dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller } 310406dac41cc50303fe767041dcb4b2192763dd9c16Christoph Bumiller 31056516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller /* now fill the stateobj */ 31066516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so = so_new(64, 0); 31076516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31086516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller n = (m + 3) / 4; 31096516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP_SIZE, 1); 31106516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, m); 31116516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_VP_RESULT_MAP(0), n); 31126516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, map, n); 31136516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31146516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_MAP_SEMANTIC_0, 4); 31156516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, reg, 4); 31166516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31176516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, NV50TCL_FP_INTERPOLANT_CTRL, 1); 31186516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_data (so, reg[4]); 31196516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 31206516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_method(so, tesla, 0x1540, 4); 31216516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_datap (so, lin, 4); 31226516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 312301670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller if (nv50->rasterizer->pipe.point_sprite) { 312401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller nv50_pntc_replace(nv50, pcrd, (reg[4] >> 8) & 0xff); 312501670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 312601670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_method(so, tesla, NV50TCL_POINT_COORD_REPLACE_MAP(0), 8); 312701670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller so_datap (so, pcrd, 8); 312801670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller } 312901670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller 31306516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(so, &nv50->state.programs); 31316516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller so_ref(NULL, &so); 31326516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller} 31336516594c8eec1088ee59e7c3254b2fdced2ff04bChristoph Bumiller 3134f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsvoid 3135f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggsnv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) 3136f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs{ 313740137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs while (p->exec_head) { 313840137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs struct nv50_program_exec *e = p->exec_head; 313940137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs 314040137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_head = e->next; 314140137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs FREE(e); 3142f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs } 314340137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_tail = NULL; 314440137ea2631a0c8158f99ae30ca90ed038b72076Ben Skeggs p->exec_size = 0; 3145f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 3146072fdc1fd325256d87b182d4f55c8a5838119cf0Ben Skeggs nouveau_bo_ref(NULL, &p->bo); 3147f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 31481b207d9bb81ae3385e5658a81c71fbf2fe15c18fBen Skeggs nouveau_resource_free(&p->data[0]); 31497c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs 3150f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs p->translated = 0; 3151f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs} 3152